Вставить в несколько таблиц с помощью ключа автоинкремента - PullRequest
1 голос
/ 06 апреля 2011

То, о чем я думаю, может быть невозможным, я не уверен. Вот моя ситуация:

Я собрал проект для класса, который позволяет учителю создавать тесты для учащихся. В php, где тестовые вопросы / ответы вводятся в базу данных, я использую подготовленные MySQL заявления. Поскольку я использую идентификаторы вопросов / ответов, чтобы связать их, я настроил их так:

$q_stmt = $db -> prepare('query with no correct_answer_id')
$a_stmt = $db -> prepare('query with ? = $q_stmt -> insert_id')
$a_stmt -> bind_params($q_id)
$q_update = $db -> prepare('query with ? = $a_stmt -> insert_id for correct answer')
$q_update -> bind_params($correct_answer_id)

, а затем скрипт зацикливается как:

foreach ($question)
  $q_stmt -> execute()
  $q_id = $db -> insert_id
  foreach ($answers)
     $a_stmt -> execute()
     id (correct_answer) $correct_answer_id = $db -> insert_id
$q_update -> execute()

Теперь, это работает на моем ноутбуке (Mac OS X.6 с последними (на январь) PHP и MySQL), но когда я загрузил другую часть моего проекта, которая также использовала вложенные подготовленные операторы в мой Веб-сервер Я получил сообщение об ошибке, в котором говорится, что он не оценил мое вложение. Это говорит:

Предупреждение: mysqli :: prepare () [mysqli.prepare]: все данные должны быть извлечены до подготовки нового оператора в root / path / file-name .php в строке 124

Итак, из чего я предполагаю, что вложенные подготовленные утверждения должны быть плохой вещью? Это весьма прискорбно, так как мне действительно понравилось, как я это собрал.

В качестве альтернативы, я мог бы перебирать все вопросы, собирая идентификаторы, а затем повторять цикл по вопросам и ответам, также собирая идентификаторы, а затем зацикливаться еще раз, чтобы обновить вопросы, но это кажется Мне нравится много дополнительной работы для сервера, и я хотел бы попытаться быть эффективным.

Тем не менее, я ищу одну из двух вещей.
1 - каким-то чудом есть способ выполнить мой запрос за один шаг
a - Мне бы понравилось решение, которое позволило бы вставить пару вопрос / правильный ответ за один раз, а затем выполнить цикл позже для переменного числа неправильных ответов, также связанных с вопросом
2 - способ изменить мой веб-сервер (у меня есть полный доступ к cpannel) так, чтобы он больше не ненавидел мои вложенные подготовленные операторы

Заранее спасибо

1 Ответ

1 голос
/ 06 апреля 2011

Основная проблема заключается в том, что у одного из подготовленных операторов есть набор результатов для вас, но вы не извлекаете его перед попыткой следующего оператора. Некоторые версии библиотек MySQL имеют проблемы с этим, а другие нет.

Взгляните на mysqli_stmt::store_result. Вы можете вызвать его сразу после вызова execute для передачи результирующего набора из MySQL. Даже если вы не будете работать с результирующим набором немедленно (или вообще?), Это действие должно позволить вам продолжить выполнение других подготовленных операторов.

(В земле PDO это можно контролировать с помощью переключения буферизованных запросов .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...