Не работает, вроде как правильный, SQL-запрос (Решено)

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

dzds

Новичок
Здравствуйте, помогите, пожалуйста, разобраться, уже несколько дней бьюсь и немогу ничего добиться

есть запрос формируемый в цикле:
Код:
...
$sql="INSERT INTO `".$database."`.`".$table_name."` (`ipn`, `surname`, `name`, `patrname`) VALUES ".$data[$i].";";
echo($sql);
mysql_query($sql) or die(mysql_error ());
...
Пробовал имена полей писать через простую (одинарную) кавычку, обратную, без кавычек - результат одинаковый:
INSERT INTO `aisrzppp`.`persons` (`ipn`, `surname`, `name`, `patrname`) VALUES ('1234567890', 'Иванов', 'Иван', 'Иванович');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 ''1234567890', 'Иванов', 'Иван',' at line 1
заметил что в конце сообщения о ошибке после запятой нету пробела, хотя если вывести массив пробел там есть.

подскажите что делать
 

artoodetoo

великий и ужасный
а зачем вам ";" в тесксте запроса? это так, оффтопик )

попробуйте скопировать свой готовый запрос и выполнить где-то в консоли (phpmyadmin и т.п.) единственно, что в консоли ";" после текста запроса это нормально, а для mysql_query() он не нужен.
 
Последнее редактирование:

dzds

Новичок
";" - это была попытка найти причину, щас поправлю
пробовал в phpmyadmin, после этого добавил обратные кавычки вокруг имен полей - не помогло

более того, если в запрос в коде записать руками "('1234567890', 'Иванов', 'Иван', 'Иванович')" все работает,
$data заполняется функцией которая читает из *.dbf и перекодирует
Код:
$value = iconv("CP866", "UTF-8", $value);
          $value = addslashes(trim($value));
          $value = "'".$value."'";
          $row[$key] = htmlspecialchars($value, ENT_QUOTES, "UTF-8");
потом имплоде сбивает все в одну строку в скобках и присваивается элементу массива, дальше массив в цикле формирует по запросу на каждый элемент массива.
Только, что пробовал вводил в *.dbf вручную данные (думал может некоректно что-то - пробелы табы...хотя есть же трим) и результат: INSERT INTO `aisrzppp`.`persons` (`ipn`, `surname`, `name`, `patrname`) VALUES ('12345678', 'Иванов', 'Иван', 'Иванович');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 ''12345678', 'Иванов', 'Иван', 'И' at line 1
такое ощучение что обрезает запрос по длине в 35 символов после скобки
 
Последнее редактирование:

artoodetoo

великий и ужасный
пробовал в phpmyadmin, после этого добавил обратные кавычки вокруг имен полей - не помогло
Не понял. Вы копируете тот запрос, который через echo($sql), вставляете в phpmyadmin — он выполняется без ошибок или как? Давайте без лишних подробностей, только по существу.
 

dzds

Новичок
если вместо
Код:
$sql="INSERT INTO `".$database."`.`".$table_name."` (`ipn`, `surname`, `name`, `patrname`) VALUES ".$data[$i];
пишу
Код:
$sql="INSERT INTO `".$database."`.`".$table_name."` (`ipn`, `surname`, `name`, `patrname`) VALUES "."('1234567890', 'Иванов', 'Иван', 'Иванович')";
то работает!
 

artoodetoo

великий и ужасный
еще раз, вы выводите для диагностики уже готовый текст запроса. ОН выполняется в pma?

$sql="INSERT Iblablablabla".$data[hujnane];
echo($sql); // <-- вы можете буквально скопировать то, что выведется?
 

michelle

Новичок
Товарисч!

Задумайся вопросом - А чем отличается - ....VALUES ".$data[$i] от VALUES "."('1234567890', 'Иванов', 'Иван', 'Иванович')?
 

dzds

Новичок
Код:
$count = count($data)+1;    //число проходов цикла.
    //var_dump($data);   
    for ($i=0; $i < $count; $i++) {
                   
    $sql="INSERT INTO `".$database."`.`".$table_name."` (`ipn`, `surname`, `name`, `patrname`) VALUES ".$data[$i].";";
    echo($sql);
    mysql_query($sql) or die(mysql_error ());
    echo ('Добавлено - '.$i);
    }
выводит:
INSERT INTO `aisrzppp`.`persons` (`ipn`, `surname`, `name`, `patrname`) VALUES ('1234567890', 'Иванов', 'Иван', 'Иванович');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 ''1234567890', 'Иванов', 'Иван', 'И' at line 1
А вот
Код:
$sql="INSERT INTO `".$database."`.`".$table_name."` (`ipn`, `surname`, `name`, `patrname`) VALUES "."('1234567890', 'Иванов', 'Иван', 'Иванович')";
mysql_query($sql) or die(mysql_error ());
echo ('Поздравляем!!!');
Выводит: Поздравляем!!! и в базе появляется необходимая запись

ПС: всё что в скобках после VALUES ". просто скопировано из браузера и вставлено в код.
 

dzds

Новичок
Товарисч!

Задумайся вопросом - А чем отличается - ....VALUES ".$data[$i] от VALUES "."('1234567890', 'Иванов', 'Иван', 'Иванович')?
echo($sql); выводит полный текст аж до последеней (закрывающей) скобки (INSERT INTO `aisrzppp`.`persons` (`ipn`, `surname`, `name`, `patrname`) VALUES ('1234567890', 'Иванов', 'Иван', 'Иванович'))
а вот следующая строка: mysql_query($sql) or die(mysql_error ()); выводит - 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 ''1234567890', 'Иванов', 'Иван', 'И' at line 1
Почему???
 

Andkorol

Новичок
Потому, что в тексте ошибки важно показать именно то место, на котором споткнулся парсер SQL-запроса, + некоторый последующий фрагмент строки, позволяющий идентифицировать место ошибки с достаточной точностью (для сложных запросов).
При этом не является целью в тексте ошибки вывести всю оставшуюся часть запроса до конца – в этом нет необходимости в абсолютном большинстве случаев.
 

dzds

Новичок
Это я понимаю, я не могу понять где моя ошибка.
Пробовал другие ФИО посчитал что все обрезаются после 34-го символа (считал с 1) включая пробелы, запятые и кавычки, но не считал скобку.
Меня удивляет то, что если, вывести запрос (командой echo) он есть весь, если ЭТОТ ЖЕ запрос вставить в код в виде строки он прекрасно обрабатывается и код выполняется, почему же тогда он не хочет выполняться когда часть запроса берется из переменной?
 

Andkorol

Новичок
Чудеса в программировании – большая редкость.
Что выводит var_dump($data); ?
 

artoodetoo

великий и ужасный
$count = count($data)+1; //число проходов цикла.
//var_dump($data);
for ($i=0; $i < $count; $i++) {

Этот цикл должен перебрать на одну запись больше, чем их есть.

Так какой текст запроса выводится перед ошибкой?
 
Последнее редактирование:

dzds

Новичок
$count - поправил, и точку с запяой убрал.

запрос, по идее, правильный, если я копирую строку которую выводит echo($sql); и вставляю непосредственно в код, или часть строки вместо $data[$i]) то всё работает
 

michelle

Новичок
Попробуй так
Код:
.......
$the_values = $data[$i];
$sql="INSERT INTO `".$database."`.`".$table_name."` (`ipn`, `surname`, `name`, `patrname`) VALUES $the_values";
......
 

dzds

Новичок
попробовал, та же ерунда :mad:
но кажется понял в чём проблема, если глянуть html который выводится там:
INSERT INTO `aisrzppp`.`persons` (`ipn`, `surname`, `name`, `patrname`) VALUES (&#039;1234567890&#039;, &#039;Иванов&#039;, &#039;Иван&#039;, &#039;Иванович&#039;)</br>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 '&#039;1234567890&#039;, &#039;Иванов&#039;, &#039;Иван&#039;, &#039;И' at line 1

мне не нравятся вот эти
 

Фанат

oncle terrible
Команда форума
Топик - ад.
Вот реально - зашел на форум, и как будто из современного мегаполиса к папуасам попал, которые голышом бегают и на пипиську тыкву надевают для красоты. Мало того что mysql_query из прошлого века. Мало того, что запрос собирается руками. Но вот это этот ужас откуда взялся?
Код:
          $value = addslashes(trim($value));
          $value = "'".$value."'";
          $row[$key] = htmlspecialchars($value, ENT_QUOTES, "UTF-8");
На крыльях ночи, не иначе, прилетел.

Ведь где-то он это вычитал. У каких-то папуасов.
Самым лучшим подарком языку РНР будет, если из сети разом исчезнут ВСЕ посвященные ему сайты. Включая мой.

Впрочем, крупные специалисты в контактике все равно так и будут друг другу такие вот советы давать
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Просмотреть исходник страницы человек видимо не решился =) А подгадил ему именно htmlspecialchars, как мне думается, примененный сюда, как сказал Фанат, ни к лугу, ни к болоту.
 

Фанат

oncle terrible
Команда форума
Просмотреть исходник страницы человек видимо не решился =) А подгадил ему именно htmlspecialchars, как мне думается, примененный сюда, как сказал Фанат, ни к лугу, ни к болоту.
Не надо передергивать. Я конкретно перечислил, что ему подгадило:
- ископаемая mysql_query
- ручная сборка запроса
- варварское форматирование.
- дебильный источник информации про РНР

На фоне всего этого htmlspecialchars - это так, мелкий эпизод
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху