Почему запрос возвращает ошибку 500?
Всех приветствую!
Формирую запрос внутри цикла следующим образом:
$request= NULL; foreach ($exampleO as $key => $value) { $request.= "INSERT INTO Words (word, example) SELECT '$key', '$value' WHERE NOT EXISTS ( SELECT word FROM Words WHERE word = '$key');"; } |
$request= NULL; foreach ($exampleO as $key => $value) { $request.= "INSERT INTO Words (word, example) SELECT '$key', '$value' WHERE NOT EXISTS ( SELECT word FROM Words WHERE word = '$key');"; }
Далее отправляю запрос на сервер:
if (mysqli_query($conn, $request)) { $result = "ok"; } else { $result = "error"; } |
if (mysqli_query($conn, $request)) { $result = "ok"; } else { $result = "error"; }
Всегда выдаёт ошибку.
При этом, если через СУБД, напрямую, отправить собранный запрос - все работает.
Например, отправляю на обработку несколько слов и получаю такое значение переменной $request
INSERT INTO Words (word, example) SELECT 'Qneone', 'Qneone twotwo' WHERE NOT EXISTS ( SELECT word FROM Words WHERE word = 'Qneone'); INSERT INTO Words (word, example) SELECT 'Twotwo', 'Qneone twotwo ' WHERE NOT EXISTS ( SELECT word FROM Words WHERE word = 'Twotwo'); |
INSERT INTO Words (word, example) SELECT 'Qneone', 'Qneone twotwo' WHERE NOT EXISTS ( SELECT word FROM Words WHERE word = 'Qneone'); INSERT INTO Words (word, example) SELECT 'Twotwo', 'Qneone twotwo ' WHERE NOT EXISTS ( SELECT word FROM Words WHERE word = 'Twotwo');
Если этот запрос отправить через phpMyAdmin - отрабатывает отлично, но как только через mysqli_query($conn, $request) - ошибка.
Подскажите, где какой кавычки не хватает или в чем проблема?
Дополнительно:
А какую именно ошибку возвращает?
mysqli_error($conn)
Банально пропущенные точка с запятой в пыхе, например...
Как только люди не извращаются, лишь бы SQL не изучать. А ведь достаточно сделать уникальный ключ по `word` и использовать запрос INSERT IGNORE.
Перед подключением к базе разрешить выброс исключений, вместо ручной проверки ошибок:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); |
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
В начале скрипта включить отображение ошибок PHP:
ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); |
ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1);
Ну и использовать подготовленные выражения. Готовить один раз перед циклом, а в цикле только вызывать с разными значениями параметров.
- Вариант с primary key не работает: на первом повторе останавливается процесс добавления, поэтому извратился с exist.
Но вот с INSERT IGNORE не пробовал. Может покажите вариант применения на моей задаче?
- EvgenyApMr, Как-то так. Но я, в основном, работаю с PDO, поэтому могу где-то и ошибиться.
$stmt = $conn->prepare('INSERT IGNORE INTO `Words` VALUES (`word`, `example`)'); $stmt->bind_param('ss', $word, $example); foreach ($exampleO as $word => $example) { $stmt->execute(); }
$stmt = $conn->prepare('INSERT IGNORE INTO `Words` VALUES (`word`, `example`)'); $stmt->bind_param('ss', $word, $example); foreach ($exampleO as $word => $example) { $stmt->execute(); }
Вангую, что мульти запросы не разрешены. А phpmyadmin их просто парсит и делит на одиночные.
PS вы что-то слышали про sql инъекции?
- Похоже на правду. Как тогда собирать большие запросы? Делать множество мелких?
- EvgenyApMr, insert into TABLE (col1, col2, …) values (…), (…), …
Вы можете вставлять сразу много значений в одну таблицу таким синтаксисом.
Если нужно проверять существование каждого слова , то либо INSERT IGNORE либо по одному запросу выполняйте без конкатенации. Либо третий способ - выберите слова, которые уже есть в бд в массив и проверяйте наличие слова в массиве перед добавлением запроса. Тогда ignore / not exists можно убрать.
- Спасибо за помощь!
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Ошибка 500 на сайте обычно связана с серверной проблемой, что означает, что сервер не смог обработать запрос из-за непредвиденных обстоятельств. Это может быть вызвано различными причинами, такими как ошибка в коде, проблемы с базой данных, недостаточностью ресурсов сервера и т. д.
Чтобы найти причину ошибки 500, вам нужно пройти через несколько шагов:
1. Проверьте логи сервера: Проверьте журналы ошибок на сервере, чтобы увидеть более подробную информацию о том, что могло вызвать ошибку 500.
2. Проверьте код: Если вы владеете кодом, который вызывает ошибку 500, убедитесь, что он не содержит синтаксических ошибок, обращается к несуществующим переменным или функциям, или другие потенциальные проблемы.
3. Проверьте базу данных: Если ваше приложение взаимодействует с базой данных, убедитесь, что подключение к базе данных работает корректно, таблицы существуют, и запросы к базе данных выполняются без ошибок.
4. Проверьте ресурсы сервера: Проверьте, достаточно ли у вас ресурсов на сервере для обработки запроса. Возможно, не хватает памяти, процессора или других ресурсов.
5. Обновите серверные компоненты: Убедитесь, что все компоненты на вашем сервере (PHP, Apache, MySQL и т. д.) обновлены до последних версий, так как устаревшие версии могут вызывать проблемы.
Если после выполнения этих шагов вы не смогли найти причину ошибки 500, рекомендуется обратиться к администратору сервера или разработчику для дальнейшей диагностики проблемы.