Слово "status" и MySQL


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

$popol = 0;
$polgod = time() - 15724800;
$db->Query("SELECT * FROM db_payeer_insert WHERE user_id = '$usid' and sum >= '10' and status = '1' and date_add > '".$polgod."' ");
if ($db->NumRows()) {
$popol = 1;	
$db->Query("UPDATE db_users_b SET ekonomik = '0' WHERE id = '$usid'");
}
Если кому интересно, то здесь надо было узнать, вносил ли пользователь деньги последние полгода, была ли эта сумма больше десяти рублей, закончилась ли операция (поступили ли деньги). При выполнении всех этих условий обновляем некий коэффициент пользователя, по которому он может покупать саженцы за обычную цену.

Итак, запрос простейший, но для любого пользователя он ничего не выводил. То есть, число рядов в выборке равняется false, и условие никогда не выполняется. Почему? Начинаем разбираться. Путем обрезки и методом исключения находим, что виноват вот этот кусок:

status = '1'
Что же тут такого? Мы просто сравниваем значение поля status с единицей – то есть прошел ли платеж. Почему же происходит ошибка? Дело в том, что хотя слово «STATUS» и не указано как зарезервированное служебное слово в спецификации MySQL – на самом деле оно таким и является. Оно входит в конструкцию «SHOW STATUS».

Вы спросите, почему же, в таком случаем, мы можем использовать, например, слово «date» как идентификатор? Все просто: проблема со «status» проявляется не во всех СУБД, не во всех версиях phpmyadmin – в некоторых это не вызовет затруднений при использовании.

Но, чтобы все гарантированно избежать проблем, заключайте идентификаторы в одинарные кавычки – как и рекомендуется делать в спецификации для MySQL. Именно в одинарные, а не в апострофы – такая конструкция также не пройдет! Итого, имеем такую строку:

$db->Query("SELECT * FROM db_payeer_insert WHERE user_id = '$usid' and sum >= '10' and `status` = '1' and date_add > '".$polgod."' ");
Как видите, все просто, но незнание такой информации может заставить неопытного программиста потратить немало времени для решения данной задачи. А если вам не хочется тратить время на это, то вы всегда можете обратиться ко мне: почта up777up@yandex.ru, вконтакте или скайп up777up2 - я могу проконсультировать вас по PHP, MySQL, JavaScript или сделать любую работу по вашему сайту. Быстро и недорого.

Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, mysql, status




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Периодическое копирование файлов в C++ с паузой
Как создать анимированный html5 баннер с помощью Google Web Designer
Протоколы TCP/IP