2016-06-16 6 views
0

Я пытаюсь выполнить запрос внутри цикла WHILE, запущенного на mysqli_fetch_array. Запрос дает следующее сообщение об ошибке:PHP/MySQL: одновременные запросы внутри цикла WHILE?

Error: Commands out of sync; you can't run this command now

Я узнал, что вы не можете иметь одновременно запросы. Вот мой код

$query "SELECT * FROM table"; 
$exec = mysqli_query($con, $query); 

while($loop = mysqli_fetch_array($exec)){ 

$data = $loop['data']; 

$sim = "SELECT * FROM table2 WHERE col1 = '$data'"; 
$execsim = mysqli_query($con, $sim); 
$getsim = mysqli_fetch_array($execsim); 
$somedata = $getsim['somedata']; 

//insert $somedata and $data into table3 

} 

После некоторых исследований, я вижу, что store_result() может быть полезным здесь. Извините мое невежество, поскольку это ново для меня. Нет никаких примеров/решений, которые я могу найти, которые используют это при сценарии цикла WHILE (это делает разницу?) - большинство из них также относятся к объектно-ориентированному стилю.

Что является наиболее эффективным способом решения этой проблемы?

+0

Существует причина, по которой мне нужно использовать выбор в цикле, я буду обновлять –

+1

Вместо того, чтобы выполнять другой запрос на выбор, основанный на результате первого, вы можете ПРИСОЕДИНИТЬ две таблицы вместе с одним запросом. –

+0

Мне было бы любопытно; Я бы подумал: «SELECT * FROM table2 WHERE col1 IN (SELECT data FROM table)» будет получать все записи из таблицы2, где col1 соответствует данным. В этот момент вы сможете вставить table2.somedata и table2.col1 в таблицу3. –

ответ

3

Самый эффективный способ решения этой проблемы - избегать обработки строки-по-агонизирующей строке (RBAR) и просто выполнять операцию над множеством и выполняться с ней.

INSERT INTO table3 (somedata, col1) 
SELECT t2.somedata 
    , t2.col1 
    FROM table2 t2 
    JOIN table1 t1 
    ON t1.data = t2.col1 
ORDER BY t2.somedata, t2.col1 

Если это не удовлетворяет требованиям, то некоторые требования были исключены из спецификации, и мы можем только догадываться, что вы на самом деле пытаетесь достичь.

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

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

+0

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

Смежные вопросы