За последние 24 часа нас посетили 17739 программистов и 1676 роботов. Сейчас ищут 864 программиста ...

MySQLi INSERT-запрос ошибка 1064

Тема в разделе "PHP и базы данных", создана пользователем crite, 25 ноя 2016.

  1. crite

    crite Новичок

    С нами с:
    25 ноя 2016
    Сообщения:
    5
    Симпатии:
    0
    Доброго времени суток.
    Помогите найти ошибку. Маюсь сутки. Перепробовал все варианты(кавычки, пробелы и т.д.), перечитал кучу инфы, а ошибку не вижу. Забиваю уже не переменные, а строку запроса явно(пма) - результат 1064(ошибка синтаксиса).

    MySQL 5.7x64(на 5.6 та же хрень), PHP 5.6x64

    PHP:
    1. $quere="INSERT INTO `contragents` (`id`, `name`, `town`, `address`, `url`, `rs`, `coments`, `deleted`)".
    2.             " VALUES (NULL, 'Рога и копыта', 'Новосибирск', 'Ленина 12', 'www.roga.ru', '124168414312438', 'Опять ппц','0')";
    3.     $query=$connection->real_escape_string($quere);
    4.     $result=f_Insert($query,$connection);
    5.     if(!$result){
    6.         echo $connection->error,' ',$connection->errno,$query,' ',$connection->error_list;
    7.         $connection->close();
    8.         exit();
    Вот, что прилетает:
    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 '\'Рога и копыта\', \'Новосибирск\', \'Ленина 12\', \' at line 1 1064 INSERT INTO `contragents` (`id`, `name`, `town`, `address`, `url`, `rs`, `coments`, `deleted`) VALUES (NULL, \'Рога и копыта\', \'Новосибирск\', \'Ленина 12\', \'www.roga.ru\', \'124168414312438\', \'Опять ппц\',\'0\')
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Не стоит экранировать весь запрос. Нужно экранировать конкретные значения. Например

    Код (PHP):
    1. <?php
    2. $query = sprintf("INSERT INTO `c` (`id`, `name`) VALUES (null, '%s')", $connection->real_escape_string('Рога и копыта');
    3. f_Insert($query,$connection);
     
  3. crite

    crite Новичок

    С нами с:
    25 ноя 2016
    Сообщения:
    5
    Симпатии:
    0
    Сейчас попробую, но боюсь что не в этом дело - запрос то корректно экранируется
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Вы понимаете что когда начинаете экранировать SQL запрос полностью, то в результате получите невалидный SQL.

    Пример:
    Код (SQL):
    1. INSERT INTO `contragents`
    Выполняем над этой строкой функцию экранирования real_escape_string

    В результате получится следующая строка:
    Код (SQL):
    1. INSERT INTO \`contragents\`
    И уже эту строку вы пытаетесь скормить в Mysql. Естественно что он вас не понимает. Это уже неправильный SQL

    Повторюсь: экранировать надо то что внутри VALUES
     
    Fell-x27 нравится это.
  5. crite

    crite Новичок

    С нами с:
    25 ноя 2016
    Сообщения:
    5
    Симпатии:
    0
    INSERT INTO `contragents` (`id`, `name`, `town`, `address`, `url`, `rs`, `coments`, `deleted`) VALUES (NULL, \'Рога и копыта\', \'Новосибирск\', \'Ленина 12\', \'www.roga.ru\', \'124168414312438\', \'Опять ппц\',\'0\')

    Так выглядит запрос - выводит пхп. Там обратные кавычки и они не экранируются
     
  6. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Код (Text):
    1. \'Новосибирск\',
    Здесь обратных слешей быть не должно. Обратные слеши нужны внутри кавычек. Например так

    Код (Text):
    1. 'Д\'Артаньян'
     
    Fell-x27 нравится это.
  7. crite

    crite Новичок

    С нами с:
    25 ноя 2016
    Сообщения:
    5
    Симпатии:
    0
    ПМА пишет именно так - экранирует кавычки. Пробовал явно прописать слэши в строке, пробовал без слэшей - всё то же:(
     
  8. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    У вас неправильный SQL запрос
    Код (SQL):
    1. INSERT
    2. INTO `contragents` (`id`, `name`, `town`, `address`, `url`, `rs`, `coments`, `deleted`)
    3. VALUES (NULL, \'Рога и копыта\', \'Новосибирск\', \'Ленина 12\', \'www.roga.ru\', \'124168414312438\', \'Опять ппц\',\'0\')
    Должно быть
    Код (SQL):
    1. INSERT
    2. INTO `contragents` (`id`, `name`, `town`, `address`, `url`, `rs`, `coments`, `deleted`)
    3. VALUES (NULL, 'Рога и копыта', 'Новосибирск', 'Ленина 12', 'www.roga.ru', '124168414312438', 'Опять ппц\',\'0')
     
  9. crite

    crite Новичок

    С нами с:
    25 ноя 2016
    Сообщения:
    5
    Симпатии:
    0
    Спасибо, что на путь истинный направили - получилось:), только и последних слэшей не должно было быть.
    ПМА со своим кодом с толку сбил - там всё заэкранировано
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Высока вероятность, что PMA тут не причем. У меня вот в нем нет никаких экранированных кавычек там, где их быть не должно. НО...они могут появиться, если у вас включены magic_quotes в настройках php. Проверьте. Если так, то выключите.