2016-01-25 19 views
0

Я следующий код:Одновременные mysqli_stmt подготовлены запросы

<ol> 
<?php 
    $db = mysqli_connect("host","login","pass","dbase"); 
    $stmt = $db->prepare("SELECT id,name FROM table1 WHERE faculty=?"); 
    $stmt->bind_param("d",$fac); 
    $stmt->execute(); 
    $stmt->bind_result($id,$name); 
    while($stmt->fetch()) 
    { 
     echo "<li>$name:<ul>"; 
     $stmt2 = $db->prepare("SELECT mac,ip FROM table2 WHERE uid=?"); 
     $stmt2->bind_param("d",$id); 
     $stmt2->execute(); 
     $stmt2->bind_result($mac,$ip); 
     while($stmt2->fetch()) 
     { 
      echo "<li>$mac ($ip)</li>"; 
     } 
     echo "</ul></li>"; 
    } 
?> 
</ol> 

Я получаю ошибку Commands out of sync; you can't run this command now. Я знаю, что я не могу сразу запустить несколько запросов, но я прочитал, что могу использовать $stmt->store_result(). Проблема в том, что это не помогает в моем случае (я пробовал называть его сразу после $stmt->execute()). Как я могу заставить мой код работать? Возможно ли это сделать без хранения результатов первого запроса в массиве?

+4

Почему не только сделать один запрос с соединением? – Steve

+0

@Steve это один из способов сделать это, но я хотел знать, есть ли еще более простая возможность, так как мой фактический код и второй запрос намного сложнее и переписывают их, чтобы иметь один длинный запрос и фрагмент кода, разделяющий результаты в группы (как в этом примере) было бы настоящей болью в шее ... – burtek

+1

Более простая возможность * - правильно выполнить запрос, а не пытаться заставить PHP сгибаться таким образом. Другой способ - закрыть соединение с базой данных каждый раз, когда вы выполняете запрос. –

ответ

2

Один запрос с LEFT JOIN будет работать в этом случае:

SELECT `t1`.`id`, `t1`.`name`, `t2`.`mac`, `t2`.`ip` 
FROM `table1` AS `t1` 
LEFT JOIN `table2` AS `t2` 
ON `t1`.`id` = `t2`.`uid` 
WHERE `t2`.`uid` = ? 

Этот запрос вернет все четыре столбца в одном кадре при условии id в таблице 1, uid в таблице 2.