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

Тема в разделе "PHP", создана пользователем hipachka, 15 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. hipachka

    hipachka

    Регистр.:
    16 мар 2009
    Сообщения:
    391
    Симпатии:
    78
    Сегодня заметил что если из базы данных делаю запрос выходит ошибка
    PHP:
    SELECT FROM privatepages WHERE reads=0",$db);
    В БД были записи была строка reads и там были только цифровые значения.
    Когда я поменял название строки таблицы запрос прошел корректно. Вопрос: а какие еще особенности еще есть в php+mysql, и как нельзя делать ни в коем случае. Предлагаю здесь собрать ТОП из таких ошибок и сделать FAQ. И прошу тех кто знает разъяснить почему мой запрос "кривой" )
     
  2. Eihwaz

    Eihwaz

    Регистр.:
    7 окт 2007
    Сообщения:
    156
    Симпатии:
    54
    Сейчас прибегут ясновидящие и объяснят, почему не работает :)
    Как объяснить, если вы даже строчку, которой запрос делаете не полностью указали? Какие типы полей в этой таблице используются?
    И что такое "название строки таблицы"?
     
  3. hipachka

    hipachka

    Регистр.:
    16 мар 2009
    Сообщения:
    391
    Симпатии:
    78
    Нет ошибки
    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` (
      `
    idint(5NOT NULL auto_increment,
      `
    linkvarchar(255NOT NULL,
      `
    titlevarchar(255NOT NULL,
      `
    loginvarchar(255NOT NULL,
      `
    readsvarchar(255NOT NULL,
      
    PRIMARY KEY  (`id`)
    ENGINE=MyISAM AUTO_INCREMENT=DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=;
    Ошибка:
    PHP:
    Warningmysql_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
     
  4. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    как я понял, reads является зарезервированам словом, для выполнения запроса возьмите имя поля в кавычки, как пример
    Код:
    SELECT * FROM privatepages WHERE `reads`='0';
     
    hipachka нравится это.
  5. hipachka

    hipachka

    Регистр.:
    16 мар 2009
    Сообщения:
    391
    Симпатии:
    78
    Да, я уже по другому назвал.

    P.S. Кавычки сделали запрос корректным. :ay:
     
  6. omega

    omega Создатель

    Регистр.:
    21 янв 2008
    Сообщения:
    30
    Симпатии:
    10
    Еще момент связанных с мускулем, которые наверняка пригодятся:

    В MySQL имена баз данных и таблиц зависит от ОС где он запущен. Это означает, что имена баз данных и таблиц нечувствительны к регистру под виндовс, а под юникс наоборот чувствительны. Для строгости советую пользоваться правилом, что все имена регистрозависимы. Тогда у вас код будет одинаково работать и под линуксом/юниксом/бсд и под виновсом.
    Еще по поводу имен - не используйте . в названии, т.к. этот символ является разделителем между базой/таблицей/колонкой.
     
    hipachka нравится это.
  7. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    WHERE `reads`='0';
    надо..цифровые значения не надо заключать в одинарные кавычки...
    WHERE `reads`=0;
    ну и стараться не использовать зарезервированные имена
     
  8. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    тогда больше вероятность sql-инъекции ;) (если входные данные не фильтруются, то хотя бы magic_quotes могут спасти при использовании кавычек)
     
  9. sympler

    sympler Постоялец

    Регистр.:
    24 окт 2008
    Сообщения:
    131
    Симпатии:
    6
    это не только имен баз данных а вообще всех названий (папок, файлов, изображений, названий переменных и т д)

    у меня вообще строгое правило: использую только латиницу, буквы и тире (никаких подчеркиваний, спецсимволов, пробелов и т д)
    и все в нихнем регистре и все всегда пашет, а со временем и без всяких, тем более синтаксических ошибок получается код в 100 строк, причем работающий именно так как хотел
     
  10. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    не надо путать синтаксис sql с фильтрацией данных
    обрабатывайте через intval()цифру..
    а magic_quotes вообще нахрен отключить желательно на уровне настроек сервера и обрабатывать строковые переменные mysql_real_escape_string() тогда и небудет проблем с sql-инФекцией ...
     
Статус темы:
Закрыта.