Em uma conexão MySQL, você pode trabalhar com apenas uma consulta por vez. Você pode preparar mais instruções de uma só vez (esses dados ainda são mantidos no driver MySQLi), no entanto, uma vez que você use execute(), a instrução será enviada para o banco de dados e o banco de dados esperará que todas as solicitações futuras de bind_param() e bind_result() sejam de o mesmo extrato, até que você envie um novo extrato.
Duas instruções ao mesmo tempo => duas conexões com o banco de dados => dois objetos mysqli.
Além disso, seu problema pode ser resolvido em uma única consulta como:
$stmt1 = $sql1->prepare ('SELECT o.orderid,o.date,b.product,b.price FROM orders o LEFT JOIN orderlines b ON b.orderid=o.orderid ORDER BY o.orderid');
$stmt1->execute();
$stmt1->bind_result($orderid,$date,$product,$price);
$prev_order_id=false;
while ($stmt1->fetch())
{
if($prev_order_id!=$orderid)
{
if($prev_order_id!==false)
echo "End of order " . $prev_orderid."<br>";
echo "Order ID: " . $orderid . " from date: " . $date . ":<br>";
}
if(is_null($product))
echo "Product from order is: " . $product . " and costs " . $price . "<br>";
$prev_order_id=$orderid;
}
if($prev_order_id!==false)
echo "End of order " . $prev_orderid."<br>";
$stmt1->close();
$sql1->close();