fetch_array 只得到一行

fetch_array gets only one row

你好, 我正在尝试发送两个 MySQL 查询,每个查询针对不同的 table,以便随后将结果连接到一个数组中以供进一步处理。 这是我的代码:

function list_invoice($invoice_id){
global $conn;
    $query_getinvoice = "SELECT * FROM invoices WHERE id = ".$invoice_id;
    $query_getlines = "SELECT * FROM invoice_lines WHERE invoice_id = ".$invoice_id;
    $result = $conn->query($query_getinvoice);
    $result2 = $conn->query($query_getlines);

    $invdata = $result->fetch_array(MYSQLI_ASSOC);
    $invdata2 = $result2->fetch_array(MYSQLI_ASSOC);
    
    $the_data = array_merge($invdata,$invdata2);
}

我上面代码的问题是 invoice_lines table 实际上有三行 invoice_id,但是 print_f($the_data) 甚至 print_f($result2) returns 只有一行。这是为什么?

这就是 fetch_array 应该做的。它从数据中提取一行。
要遍历所有行,您必须执行以下操作:

while ($invdata = $result->fetch_array(MYSQLI_ASSOC) and $invdata2 = $result2->fetch_array(MYSQLI_ASSOC)) {
   $the_data = array_merge($invdata,$invdata2);
   // Do something with this row of data
}

同样重要的是要注意,如果 $invoice_id 是用户输入,您现在创建查询的方式可能会导致 SQL 注入。攻击者可以插入引号 ' 来关闭字符串并执行恶意的 SQL 命令。为防止这种情况,您需要使用准备好的语句来确保用户输入不会被解释为代码。这是 post 解释如何用 mysqli 做到这一点:How can I prevent SQL injection in PHP?

正如@El_Vajna 所指出的,这将在两个结果中的任何一个结束时停止循环。为了使其更进一步,即使只有一个结果有数据,您可以将 if 语句中的 and 更改为 or。那么只有一个需要包含更多行