Интерблог

Недолёт
Автор: Ognezmej. Опубликовано: 20 Июня 2012

Любой начинающий разработчик, получивший представление о библиотеке GD, приходит в восторг от открывающихся перед ним возможностей, и, в первую очередь - генерации картинок "на лету". Теперь не надо загружать на сервер множество изображений, иконок, превьюшек - PHP сам всё сделает из подручных материалов.

С первой проблемой сталкиваемся, когда количество картинок начинает превышать разумные пределы. Каковы они, эти разумные пределы - сами увидите. Страница и сами картинки даже при хорошем интернет-канале грузятся значительно медленнее, чем это должно быть, да и хостинг-провайдер начинает как-то косо смотреть на Ваш аккаунт. Каждая такая картинка - это запуск отдельного PHP-скрипта, теперь представьте, как увеличивается нагрузка на сервер для генерации 30, 50, 100 картинок... Рекомендации - генерировать картинки одной функцией, специально написанной для такого случая, единовременно, в статические файлы. В случае обновления - повторить процедуру генерации.

Вторая проблема - с динамически генерируемыми картинками не работает функция getimagesize(). Причина - запрос информации о файле совершается раньше, чем собственно файл создаётся. Решение отсутствует, рекомендации - избегать подобных сочетаний ингредиентов:)

 

Метки: PHP, Кодинг, Советы

А ещё AJAX нужен для...
Автор: Ognezmej. Опубликовано: 28 Мая 2012

Предположим, у Вас запускается тяжёлый PHP-скрипт. Достаточно тяжёлый, чтобы с шансами не уложиться в отпущенные сервером 30 секунд. Разумеется, можно через set_time_limit(), .htacess, php.ini попробовать изменить максимальное время выполнения скрипта, но далеко не все хостеры такое позволяют. По вполне закономерным причинам.

Что делать? Использовать аякс. Для начала осознаем простую истину. Тяжёлый скрипт обычно представляет собой не одну-единственную, а последовательность нескольких/многих функций, в том числе и зацикленных. Ага! Что такое функция? Это входные данные, некие действия и выходные данные. Последовательность функций - это когда входные данные последующей функции являются выходными данными предыдущей. Итак, разбиваем наш тяжёлый скрипт на составляющие функции так, чтобы исполнение каждой с гарантией уложилось в разрешённый отрезок времени. Например, делаем файл ajax.php, где в зависимости от переданной через GET переменной запускается та или иная функция. Делаем основной файл, из которого аяксом будем запускать поочерёдно нужные нам функции, анализируя их ответы. Благодаря Jquery эта задача превращается в чистое удовольствие.

$(селектор).load('ajax.php?function=one', {'var1':var1, 'var2':var2}, function(){анализируем выходные данные, запускаем функцию two, и так далее});

Для скорости работы данные из ajax.php можно получать в json, для простоты и наглядности - прямо в html.

Минусы - общее время работы всё-таки увеличивается. Но зато хотя бы работает. Плюсы - такую игрушку можно легко украсить progressbar-ом, а также можно легко отслеживать ошибки, не дожидаясь окончания работы всего скрипта. Ещё можно добавить кнопку "пауза", "продолжить" и наслаждаться тотальным контролем над выполнением приложения:)

 

Метки: Ajax, jQuery, 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, Кодинг

Принцип неопределённости в MYSQL
Автор: Ognezmej. Опубликовано: 13 Февраля 2012

Допустим, у нас есть некая таблица table, в таблице некое поле field, поле имеет тип INT, ну, к примеру, 5 или 10, без разницы. Умолчание для него не определено (если само поле NOT NULL), или определено как 0. Заполним таблицу всевозможными записями, при этом не задавая поле field (или задавая его нулём). А теперь делаем запрос:

SELECT * FROM `table` WHERE `field`="любая херня, которая придёт в голову";

Как Вы думаете, сколько он найдёт записей? Ни одной? А вот и фигушки! Он найдёт все записи, где field не определён или ноль. Мало того, кавычки после `field`= играют здесь непростую и даже трагическую роль. Если кавычки убрать, то любая не-числовая херня будет, как оно и положено, выдавать ошибку MYSQL, а числовая будет правильно обрабатываться. С  кавычками правильно обрабатывается, опять же, только числовая херня. А неправильные данные даже ошибку не выдают. What is it means?

 

UPDATE:

It means неявное приведение типов. То же самое, что и PHP-шная функция intval(). Значение поля приводится к целочисленному, и, если первым символом является не цифра, то получаем ноль. Если же хоть одна цифра вначале, то значение приравнивается к этой цифре - и равенства с пустым полем не будет.

Соответственно, рекомендация заключать даже численные переменные в кавычки может иметь довольно непредсказуемые последствия. Поскольку, как там же говорилось, mysql всё равно преобразует их к нужному типу:) Но, разумеется, если всё делать аккуратно и всё знать заранее, проблем не будет. Знать бы, куда падать, соломки бы подстелил...

 

Метки: MYSQL, Кодинг

  • Страница 1 из 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
Популярные записи

Принцип неопределённости в РНР

Принцип неопределённости в MYSQL

Недолёт

А ещё AJAX нужен для...

Принцип неопределённости в PHP - праздник продолжается!

Эмуляция плавности в ActionScript.

Программная анимация в ActionScript

Анимация при наведении в ActionScript

Использование кодировки UTF-8

Буквицца

Архив записей  

2017

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2016

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2015

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2014

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2013

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2012

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2011

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2010

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2009

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек