Архив рубрики "PHP"
Принцип неопределённости в PHP - праздник продолжается!
Автор: Ognezmej. Опубликовано: 12 Мая 2012
Попробуйте выполнить простенький код:
echo (106801004500603);
Понравилось? PHP считает, что он самый умный, и ему виднее, в каком формате сохранять число. Оно, конечно, и ладно бы, но рассмотрим пару задач.
Первая задача - вывести это самое число. Ни echo(), ни print() не выдадут ничего, кроме 1.068010045006E+14. Мы, однако же, не дураки, переведём число в формат string, и... получим то же самое. Слава-те-господи, в PHP существует функция number_format(), и number_format (106801004500603,0,'','') выдаст нам именно то, что мы хотим.
Вторая задача - занести это число в MYSQL. Вы уже поняли, что это не так просто, как кажется. Допустим, у нас некая таблица test, число надо записать в поле val. Первые четыре примера - если поле val - строковое, такое часто бывает, например, для всяких артикулов и серийных номеров, которые могут быть как просто числами, так и с наличием букв:
mysql_query('INSERT `test` SET `val`="106801004500603";'); - записывает 1.068010045006E+14
mysql_query('INSERT `test` SET `val`=106801004500603;'); - записывает 106801004500600
mysql_query('INSERT `test` SET `val`="'. number_format (106801004500603,0,'','') .'";'); - записывает 106801004500603
mysql_query('INSERT `test` SET `val`='. number_format (106801004500603,0,'','') .';'); - записывает 106801004500603
Если поле val - числовое:
mysql_query('INSERT `test` SET `val`="106801004500603";'); - записывает 106801004500600
mysql_query('INSERT `test` SET `val`=106801004500603;'); - записывает 106801004500600
mysql_query('INSERT `test` SET `val`="'. number_format (106801004500603,0,'','') .'";'); - записывает 106801004500603
mysql_query('INSERT `test` SET `val`='. number_format (106801004500603,0,'','') .';'); - записывает 106801004500603
Как видим, избавиться от принудительного форматирования или округления помогает всё тот же number_format(). А сколько ещё открытий чудных...
UPDATE:
Увы, number_fromat() работает только до 15 знаков. Число, состоящее из более, чем 15 знаков, меняется произвольным образом.
echo number_format (106545548010045006503,0,'',''); выводит 106545548010045014016
Я понимаю, что это проблема глобальная, проблема хранения данных в памяти компьютера вообще, но почему нет адекватной функции, чтобы просто тупо перевести длинное число в строку?? А это уже как раз, как я понимаю, сказка о неявном приведении типов... Если ты видишь, какое число передаёшь, заключаешь его в кавычки, и нормальная строка. А если это переменная, которая считывается мало ли откуда и может быть мало ли чем? кавычки вообще ничего не дают...
Метки: MYSQL, PHP, Кодинг, Советы
Нет комментариев
Принцип неопределённости в РНР
Автор: Ognezmej. Опубликовано: 03 Апреля 2012
Продолжаем публикации на тему принципа неопределённости - гибкость языка программирования, и чем это чревато.
Рассмотрим поведение переменных, передаваемых через $_GET. Общие места - наличие переменных рекомендуется проверять if (isset($_GET['var'])), конструкции вида <a href="script.php?page=&addr=&blabla=">ткни сюда</a> тоже, в общем, не вызывают особых вопросов - пустые переменные. А теперь проверьте эти переменные рекомендуемым способом - получите ЕКГУ, что в простонародье означает TRUE. А теперь не рекомендуемым - if ($_GET['var']) - получите нормальное FALSE!
Ну, и, конечно, попытки проанализировать ноль. Для нас-то ноль - это целое число, на которое нельзя делить, а для PHP это, кроме целого числа, ещё и строка '0', ещё и логическое FALSE, ещё и пустая строка (''). Ну, вот, к примеру, передаём тем же $_GET некую переменную ?var=0, и анализируем. if($_GET['var']) даёт FALSE, хотя этот ноль для нас может нести информацию. Или, к примеру, пишем функцию с необязательными параметрами. При передаче необязательным параметром нуля и его проверке тоже получаем FALSE. К счастью, такие моменты легко решаются строгой проверкой if($arg!==FALSE). Это просто нужно помнить, чтобы потом не было мучительно больно за неправильно работающий код.
В теории всё хорошо, переходим к практике.
Опаньки!
Строгая проверка if($_GET['var']!==FALSE) при анализе запроса ?var1=&var2= даёт TRUE! А вы думали, в сказку попали?
Итак, формулируем задачу: к нам прилетает запрос вида: ?var1=1&var2=0&var3=. Нужно его проанализировать и отличить заданную переменную от нуля и пустой переменной. Причём, первое от второго отличать необязательно, а вот от третьего - надо. Фокус номер один - все переменные из $_GET - запроса имеют строковый формат, и, если кто захочет проанализировать gettype($_GET['var']), его ждёт разочарование. Но слабость обращаем в силу - раз все переменные - строки, то строгая проверка if($_GET['var2']==='0') (обратите внимание на кавычки) должна дать TRUE. И точно. Таким образом, ноль мы выцепили. Что с ним делать - решаем сами. Остальные переменные проверяем нестрогим if ($_GET['var']).
Метки: PHP, Кодинг
9 комментариев
Did You know...
Автор: Ognezmej. Опубликовано: 04 Марта 2011
...что PHP может открывать BMP и даже PSD-файлы?
Итак -
Функция imagecreatefrombmp():
http://ee.php.net/manual/en/function.imagecreate.php#53879
Класс phppsdreader с соответствующей функцией imagecreatefrompsd():
http://www.phpclasses.org/package/3627-PHP-Open-images-in-the-PhotoShop-PSD-format.html#download
Разумеется, должна быть библиотека GD2 - практически на всех хостингах она есть:)
Метки: PHP, Кодинг
Нет комментариев
Популярные записи
Принцип неопределённости в РНР
Принцип неопределённости в MYSQL
Эмуляция плавности в ActionScript.
Программная анимация в ActionScript
Анимация при наведении в ActionScript
Принцип неопределённости в PHP - праздник продолжается!
Облако тегов
ActionScript Ajax CMS jQuery MYSQL PHP XHTML Анализатор Канализатор Кодинг Мяу Продвижение Советы Студия Яндекс
