Некоторое время я использовал несколько SQL-соединений в php, чтобы избежать «Вы не можете запускать эту команду сейчас. Команды не синхронизированы» -error.Несколько SQL-объектов в PHP/MySQLi
Кажется, что я не могу понять, когда могу делать только одно соединение, и когда мне нужно несколько. Следующий код - это то, как я извлекаю вещи из разных таблиц, связанных друг с другом.
$sql
s - объекты mysqli по умолчанию, подключенные к одной базе данных. Пример - это проблема с нумерованной версией проблемы и не имеет реальной цели, если вам интересно.
$stmt1 = $sql1->prepare ('SELECT orderid,date FROM orders');
$stmt2 = $sql2->prepare ('SELECT product,price FROM orderlines WHERE orderid= ?');
$stmt1->execute();
$stmt1->bind_result($orderid,$date);
while ($stmt1->fetch()) {
echo "Order ID: " . $orderid . " from date: " . $date . ":<br>";
$stmt2->bind_param("i",$orderid);
$stmt2->execute();
$stmt2->bind_result($product, $price);
while ($stmt2->fetch() {
echo "Product from order is: " . $product . " and costs " . $price . "<br>";
}
echo "End of order " . $orderid;
}
$stmt1->close();
$stmt2->close();
$sql1->close();
$sql2->close();
Это работает, но только если я не использую тот же объект mysqli. Если я попытаюсь сделать оба только с одним общим объективом $sql
, результаты со второго stmt останутся пустыми.
Итак, вопрос: должно ли это случиться, и является ли вышеупомянутый подход хорошей или плохой практикой?
У меня нет проблем с этим - все работает очень хорошо, но способ, которым это делается, кажется мне странным, и я не могу найти ничего об этой конкретной проблеме.
EDIT: Обновлен вопрос к примеру с заказами и порядковыми номерами, чтобы отобразить, где это произойдет.
EDIT 2: I Найдено two mysqli querys, one in a while loop - но это сообщение мой вопрос как решение.
Правильный подход: использование 'JOIN' из таблицы' orders' и 'orderlines' –
Ну, вступив в таблицу не очень измените, как это закончится, это приведет к тому, что запрос будет выполняться медленнее, поскольку мне все еще нужен список заказов (первый оператор может иметь предложение WHERE), а затем для каждого из этих заказов мне нужно получить что-то совсем другое. Исправьте меня, если я ошибаюсь с примером. – nickdnk
Что вы подразумеваете под «получить что-то совсем другое»? Пока обе таблицы могут быть связаны в соединении, вы просто указываете поля, которые вы хотите использовать, даже если они не являются ключевыми полями. – T9b