Понадобилось мне на хостинг с уже установленным сайтом залить форум Invision Power Board. При этом дамп был с таблицами без префикса, а чтоб не было конфликтов с одноименными таблицами уже установленного сайта, хотелось использовать префиксы таблиц. Читать далее »

 

Столкнулся с любопытным багом (как выяснилось позже это была фича): приведение переменной к типу Float возвращало число, где разделителем была не точка, а запятая. Пример:

$str="1.5";
echo floatval($str); //возвращает 1,5
$str="1.5";
echo floatval($str); //возвращает 1,5

Само-собой числа разделенные запятой вызывали ошибку SQL при записи в поле с типом float. Как выяснилось, проблема была с локалью — если в указанной локали дробная часть числа отделяется от целой не точкой, а запятой, то функции приведения типов (такие как (float) и floatval) будут возвращать число, разделенное запятой. Т.о. решение предложенное тут вызвало проблемы в другом месте. Решается это указание локали для чисел:

setlocale(LC_NUMERIC, "C");
setlocale(LC_NUMERIC, "C");
 

Давно не работал с linux (все как-то больше FreeBSD), ставил php из сырцов, наткнулся на ошибку
ld: cannot find -lmysqlclient
с кучей подробностей, при этом пакет mysql-devel был установлен, оказалось, что поскольку у меня 64-битная CentOS, то надо об этом сообщить компилятору, делается это так:
--with-libdir=lib64
после чего, он начинает искать либы в /usr/lib64, а не в /usr/lib
гугл говорит, еще с этой ошибкой помогает опция
--with-mysql=mysqlnd
но я не пробовал.

 

Поставил себе локально последний MySQL 5.5 и сразу столкнулся с тем, что куча скриптов не работают как надо. Проблема в том, что по умолчанию MySQL ставится в strict mode, то есть он не завершает запрос при наличии определенных предупреждений. Например, если в автоинкрементное поле id вставляется не цифровое значение, а пустая строка, что должно привести к автоматическому присваиванию значения, MySQL не завершает запрос, а выдает предупреждение: 1366 Incorrect integer value. Это касается и других аналогичных ситуаций, ошибки могут быть вида Incorrect string value, Field doesn’t have a default value и т.п.
Решается проблема комментированием строки в my.ini (или my.cnf смотря какая у вас ОС)

#sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

и перезагрузкой MySQL. Хотя конечно, по-хорошему, надо бы писать на перспективу, так, чтобы запросы были корректные.

 

Решил поковырять Vtiger crm, но обломался уже на этапе установки. Как оказалось, он не поддерживает последние версии MySQL (5.5) и падает с ошибкой SQL:

vtiger You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Type=InnoDB' at line 7Error: Tables partially created. Table creation failed.

Гугл как всегда помог: надо просто в файле с описанием структуры БД (schema/DatabaseSchema.xml) заменить все вхождения Type=InnoDB на ENGINE=InnoDB. Надо думать, MySQL продолжает двигаться к сближению к стандарту SQL, при чем без обратной совместимости :(
Читаем релиз MySQL 5.5:

Указание типа хранилища через ключевое слово "TYPE" в блоке "CREATE TABLE" объявлено устаревшим, необходимо использовать директиву "ENGINE";

Ну что ж, обновляемся.

 

Как известно, чтобы привести IP адрес к числовому виду (так гораздо удобней хранить данные а базе) используется функция ip2long, но полученное число может быть отрицательное, например:

echo ip2long("200.0.0.1");
echo ip2long("200.0.0.1");

Выводит -939524095, при этом, функция MySQL INET_ATON(’200.0.0.1′) вернет 3355443201.
Т.о., если заносить в таблицу данные полученные от ip2long, а в выборке делать INET_NTOA то в ряде случаев полученные данные будут не верные. Кроме того, при использовании INET_ATON поле можно сделать unsigned.
Чтобы привести данные полученные от ip2long в вид, соответствующий INET_ATON можно пойти двумя путями (оба достаточно простые, какой выбрать дело ваше):
1. метод

$ipv4address = sprintf("%u", ip2long("200.0.0.1"));
$ipv4address = sprintf("%u", ip2long("200.0.0.1"));

2. метод

$ip = ip2long("200.0.0.1");
if ($ip<0){ $ip += 4294967296; }
$ip = ip2long("200.0.0.1");
if ($ip<0){ $ip += 4294967296; }
 

Как-то назрела необходимость сравнить два веб-сервера по производительности. Банальные сравнения объема памяти и типов процессоров это конечно хорошо, но хотелось бы точно знать, насколько сервер А производительней сервера Б, учитывая что он дороже в несколько раз. О методике тестирования и будет этот пост.
Читать далее »

© 2012 php