Почему запрос возвращает ошибку 500?

Ссылка скопирована
1 ответ

Всех приветствую!

Формирую запрос внутри цикла следующим образом:

$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)

  • freelancer007, не получается вывести результат. В консоль только выдаёт ошибку 500. Может из-за асинхронного вызова не работает этот обработчик ошибок?
  • Ошибка 500 - это ошибка сервера, а не базы. В логах сервера и смотрится.
    Банально пропущенные точка с запятой в пыхе, например...
  • Как только люди не извращаются, лишь бы 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 можно убрать.

    • Спасибо за помощь!
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Алексей Денисов Ответ

    Ошибка 500 на сайте обычно связана с серверной проблемой, что означает, что сервер не смог обработать запрос из-за непредвиденных обстоятельств. Это может быть вызвано различными причинами, такими как ошибка в коде, проблемы с базой данных, недостаточностью ресурсов сервера и т. д.

    Чтобы найти причину ошибки 500, вам нужно пройти через несколько шагов:

    1. Проверьте логи сервера: Проверьте журналы ошибок на сервере, чтобы увидеть более подробную информацию о том, что могло вызвать ошибку 500.

    2. Проверьте код: Если вы владеете кодом, который вызывает ошибку 500, убедитесь, что он не содержит синтаксических ошибок, обращается к несуществующим переменным или функциям, или другие потенциальные проблемы.

    3. Проверьте базу данных: Если ваше приложение взаимодействует с базой данных, убедитесь, что подключение к базе данных работает корректно, таблицы существуют, и запросы к базе данных выполняются без ошибок.

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

    5. Обновите серверные компоненты: Убедитесь, что все компоненты на вашем сервере (PHP, Apache, MySQL и т. д.) обновлены до последних версий, так как устаревшие версии могут вызывать проблемы.

    Если после выполнения этих шагов вы не смогли найти причину ошибки 500, рекомендуется обратиться к администратору сервера или разработчику для дальнейшей диагностики проблемы.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно