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
。那么只有一个需要包含更多行
你好, 我正在尝试发送两个 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
。那么只有一个需要包含更多行