Несколько подготовленных операторов MySQL с одним и тем же соединением

Каковы правила одновременной настройки нескольких подготовленных операторов (с одним подключением к БД)? У меня часто возникают циклы, включающие несколько запросов; было бы неплохо настроить 3 подготовленных оператора, прокрутить их, а затем закрыть их все.

Я обнаружил, что иногда они работают вместе, иногда нет. Например, мне удалось настроить 3 одновременных оператора SELECT. Но я думаю, что наличие подготовленных SELECT и INSERT для одной и той же таблицы, выполняемых в цикле, отключает меня от базы данных (или, по крайней мере, не работает должным образом). Однако, когда я изменяю подготовленные операторы на обычные запросы, я могу выполнять те же запросы в том же порядке, и все в порядке.

Я в значительной степени новичок и был бы признателен за некоторые разъяснения о том, как это работает!


person user276598    schedule 19.02.2010    source источник
comment
Я работал над упрощением своего кода для размещения здесь, и я думаю, что решил свою насущную проблему: если я использую mysqli_stmt_free_result() после запроса SELECT, это, кажется, помогает. Так что нет ничего изначально неправильного в том, чтобы открывать несколько подготовленных операторов, перебирать их и закрывать их все позже?   -  person user276598    schedule 19.02.2010


Ответы (1)


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

Что касается того, почему ваша текущая система не работает; Я думаю, вы, вероятно, видите «Команды не синхронизированы; теперь вы не можете запустить эту команду в своем клиентском коде, вы вызываете клиентские функции в неправильном порядке.

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

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

person e4c5    schedule 19.02.2010
comment
спасибо, это проясняет ситуацию. Сейчас пойду изучать хранимые процедуры. - person user276598; 19.02.2010
comment
всего наилучшего. В качестве сноски; На самом деле может быть возможно (в зависимости от ваших данных) переписать ваш sql, чтобы использовать синтаксис INSERT SELECT (dev.mysql.com/doc/refman/5.1/en/insert-select.html) и сделать это в одном запросе. - person e4c5; 19.02.2010