@iSensetivity
бухгалтер, програміст-самоук

Почему в PHPMyAdmin запрос проходит а с PHP нет?

Вообшем генерирую на php запрос:
INSERT INTO `anime_long` (`aid`, `mal_id`, `MPAA`) VALUES (NULL, '6772', 'R - 17+ (violence & profanity)'); INSERT INTO `anime_short` (`aid`, `title_uk`, `title_en`, `title_rom`, `title_kan`, `title_others`, `poster`, `synopsis`, `type`, `series_count`, `date_begin`, `date_end`) VALUES (LAST_INSERT_ID(), '', 'Broken Blade', 'Break Blade 1: Kakusei no Toki', 'ブレイク ブレイド 覚醒ノ刻', 'Breaker Blade, Break Blade 1: The Time of Awakening', 'http://cdn.myanimelist.net/images/anime/3/18281l.jpg', 'In the continent of Cruzon, an impending war between the Kingdom of Krisna and the nation of Athens is brimming. The people of this land are able to use quartz for whatever purpose they desire. Yet one person, Rygart Arrow, is not. He is an \"un-sorcerer,\" a person unable to use quartz. But this characteristic will enable him to pilot an ancient Golem, one strong enough to put up a fight against the invading army of Athens.', '1', '1', '2010-05-29', '1970-01-01');

Вьіполнию на php
$result = mysql_query($q) or die("Invalid query: " . mysql_error());

И получаю ошибку: "Invalid query: 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 'INSERT INTO `anime_short` (`aid`, `title_uk`, `title_en`, `title_rom`, `title_ka' at line 1"
Но в тоже время запрос исполняеться в phpmyadmin.
Почему так происходит и как вьіполнить запрос с php?
  • Вопрос задан
  • 2627 просмотров
Решения вопроса 2
@bohdan-shulha
@aumarov
все верно. Нужно заменить это ` на это '

С какой такой радости? Там все символы на своих местах. ` используется для названий сущностей (таблицы, колонки, которые имеют в названии спецсимволы или их имя совпадает з какими либо зарезерврованными словами), а ' используется для строк.

Попробуйте выполнить эти запросы отдельно.
mysql_query("START TRANSACTION");
$sql = "INSERT INTO `anime_long` (`aid`, `mal_id`, `MPAA`) VALUES (NULL, '6772', 'R - 17+ (violence & profanity)')";
mysql_query($sql);
$sql = "INSERT INTO `anime_short` (`aid`, `title_uk`, `title_en`, `title_rom`, `title_kan`, `title_others`, `poster`, `synopsis`, `type`, `series_count`, `date_begin`, `date_end`) VALUES (LAST_INSERT_ID(), '', 'Broken Blade', 'Break Blade 1: Kakusei no Toki', 'ブレイク ブレイド 覚醒ノ刻', 'Breaker Blade, Break Blade 1: The Time of Awakening', 'http://cdn.myanimelist.net/images/anime/3/18281l.jpg', 'In the continent of Cruzon, an impending war between the Kingdom of Krisna and the nation of Athens is brimming. The people of this land are able to use quartz for whatever purpose they desire. Yet one person, Rygart Arrow, is not. He is an \"un-sorcerer,\" a person unable to use quartz. But this characteristic will enable him to pilot an ancient Golem, one strong enough to put up a fight against the invading army of Athens.', '1', '1', '2010-05-29', '1970-01-01')";
mysql_query($sql);
mysql_query('COMMIT');


В данном случае, транзакция используется исключительно из соображений производительности. По-хорошему, нужно проверять, удалось ли выполнить запросы и откатывать их (выполнять ROLLBACK), если что-то пошло не так.

P.S.: почему используются mysql_*? Они же deprecated. Лучше брать mysqli_* или PDO (что я думаю предпочтительнее).
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
1. Не используйте mysql_, он уже больше года в статусе deprecated. Используйте mysqli_ или PDO.
2. Запросы надо передавать по одному, то есть каждый INSERT отдельным вызовом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@aumarov111
все верно. Нужно заменить это ` на это '
Ответ написан
bahek2462774
@bahek2462774
я бы включил логирование запросов и посмотрел бы на запрос - когда идет от PHP. И сравнил с тем - что ты пишешь в phpmyadmin.
Ответ написан
Комментировать
@nemesis1980
Извините за офтоп, но тем кто ищет, может будет полезным.
mysqli позволяет выполнить один запрос за один вызов (т.е. то, что до ";").
PMA разбирает запрос на части, и выполняет их по очереди, примерно так же, как предлогает bohdan4ik
В данном случае, можно отправить запрос пачкой, что бы не писать несколько запросов по очереди:
INSERT INTO table (field1,field2,fieldn) VALUES ('value1_1', 'value2_1', 'valuen_1'),('value1_2', 'value2_2', 'valuen_2'),('value1_n', 'value2_n', 'valuen_n');
Тогда уйдет один запрос с несколькими инсертами, это быстрее и правильней.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы