Интересности и полезности или так не делать никогда

Статус
В этой теме нельзя размещать новые ответы.

hipachka

Гуру форума
Регистрация
16 Мар 2009
Сообщения
393
Реакции
82
Сегодня заметил что если из базы данных делаю запрос выходит ошибка
PHP:
SELECT * FROM privatepages WHERE reads=0",$db);
В БД были записи была строка reads и там были только цифровые значения.
Когда я поменял название строки таблицы запрос прошел корректно. Вопрос: а какие еще особенности еще есть в php+mysql, и как нельзя делать ни в коем случае. Предлагаю здесь собрать ТОП из таких ошибок и сделать FAQ. И прошу тех кто знает разъяснить почему мой запрос "кривой" )
 
Сейчас прибегут ясновидящие и объяснят, почему не работает :)
Как объяснить, если вы даже строчку, которой запрос делаете не полностью указали? Какие типы полей в этой таблице используются?
И что такое "название строки таблицы"?
 
Нет ошибки
PHP:
$db = mysql_connect ("localhost","root","root");
mysql_select_db("root",$db);
  $rezultz = mysql_query("SELECT * FROM privatepages WHERE login='0'",$db);
       $myrowz = mysql_fetch_array  ($rezultz) or die (mysql_error()."<br><b>$sql</b>");
Вызывает ошибку
PHP:
$db = mysql_connect ("localhost","root","root");
mysql_select_db("root",$db);
  $rezultz = mysql_query("SELECT * FROM privatepages WHERE reads='0'",$db);
       $myrowz = mysql_fetch_array  ($rezultz) or die (mysql_error()."<br><b>$sql</b>");
Дамп БД
PHP:
CREATE TABLE `privatepages` (
  `id` int(5) NOT NULL auto_increment,
  `link` varchar(255) NOT NULL,
  `title` varchar(255) NOT NULL,
  `login` varchar(255) NOT NULL,
  `reads` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=3 ;
Ошибка:
PHP:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/site/www/ere/error.php on line 8
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 'reads='0'' at line 1
 
как я понял, reads является зарезервированам словом, для выполнения запроса возьмите имя поля в кавычки, как пример
Код:
SELECT * FROM privatepages WHERE `reads`='0';
 
как я понял, reads является зарезервированам словом, для выполнения запроса возьмите имя поля в кавычки, как пример
Код:
SELECT * FROM privatepages WHERE `reads`='0';
Да, я уже по другому назвал.

P.S. Кавычки сделали запрос корректным. :ay:
 
Еще момент связанных с мускулем, которые наверняка пригодятся:

В MySQL имена баз данных и таблиц зависит от ОС где он запущен. Это означает, что имена баз данных и таблиц нечувствительны к регистру под виндовс, а под юникс наоборот чувствительны. Для строгости советую пользоваться правилом, что все имена регистрозависимы. Тогда у вас код будет одинаково работать и под линуксом/юниксом/бсд и под виновсом.
Еще по поводу имен - не используйте . в названии, т.к. этот символ является разделителем между базой/таблицей/колонкой.
 
WHERE `reads`='0';
надо..цифровые значения не надо заключать в одинарные кавычки...
WHERE `reads`=0;
ну и стараться не использовать зарезервированные имена
 
WHERE `reads`='0';
надо..цифровые значения не надо заключать в одинарные кавычки...
WHERE `reads`=0;
тогда больше вероятность sql-инъекции ;) (если входные данные не фильтруются, то хотя бы magic_quotes могут спасти при использовании кавычек)
 
Еще момент связанных с мускулем, которые наверняка пригодятся:
В MySQL имена баз данных и таблиц зависит от ОС где он запущен. Это означает, что имена баз данных и таблиц нечувствительны к регистру под виндовс, а под юникс наоборот чувствительны. Для строгости советую пользоваться правилом, что все имена регистрозависимы. Тогда у вас код будет одинаково работать и под линуксом/юниксом/бсд и под виновсом.
Еще по поводу имен - не используйте . в названии, т.к. этот символ является разделителем между базой/таблицей/колонкой.

это не только имен баз данных а вообще всех названий (папок, файлов, изображений, названий переменных и т д)

у меня вообще строгое правило: использую только латиницу, буквы и тире (никаких подчеркиваний, спецсимволов, пробелов и т д)
и все в нихнем регистре и все всегда пашет, а со временем и без всяких, тем более синтаксических ошибок получается код в 100 строк, причем работающий именно так как хотел
 
тогда больше вероятность sql-инъекции ;) (если входные данные не фильтруются, то хотя бы magic_quotes могут спасти при использовании кавычек)
не надо путать синтаксис sql с фильтрацией данных
обрабатывайте через intval()цифру..
а magic_quotes вообще нахрен отключить желательно на уровне настроек сервера и обрабатывать строковые переменные mysql_real_escape_string() тогда и небудет проблем с sql-инФекцией ...
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху