在查询结果或查询比较中包含列名
Include column names in query results or query comparison
我正在使用下面的方法比较两个 select 结果并显示它们之间的差异。
它按预期工作,但 我无法同时包含相应的列名称。
谁能告诉我如何修改我的代码才能获得想要的结果,如下例所示?
PHP:
$stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?");
$stmt->bind_param("s", $vstId);
$stmt->execute();
$resultBefore = $stmt->get_result()->fetch_row();
$stmt->store_result();
$stmt->close();
// some event
$stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?");
$stmt->bind_param("s", $vstId);
$stmt->execute();
$resultAfter = $stmt->get_result()->fetch_row();
$stmt->store_result();
$stmt->close();
$conn->close();
for($i=0; $i<count($resultAfter); $i++) {
if($resultAfter[$i] != $resultBefore[$i]) {
$diff.= '<tr><td>' . $resultBefore[$i] . '</td><td>' . $resultAfter[$i] . '</td></tr>';
}
}
echo '<table>' . $diff . '</table>';
当前结果:
<table>
<tr>
<td>10408</td><td>10407</td>
</tr>
<tr>
<td>168</td><td>167</td>
</tr>
</table>
想要的结果:
<table>
<tr>
<td>Column name that changed</td><td>10408</td><td>10407</td> // I am missing the 1st td
</tr>
<tr>
<td>Column name that changed</td><td>168</td><td>167</td> // I am missing the 1st td
</tr>
</table>
使用 fetch_assoc()
而不是 fetch_row()
。它将 return 一个关联数组。然后使用foreach
循环和关联键循环数组并比较元素。
此外,删除 store_result()
,您已经使用了 get_result()
。
固定代码如下所示:
$stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?");
$stmt->bind_param("s", $vstId);
$stmt->execute();
$resultBefore = $stmt->get_result()->fetch_assoc();
// some event
$stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?");
$stmt->bind_param("s", $vstId);
$stmt->execute();
$resultAfter = $stmt->get_result()->fetch_assoc();
foreach ($resultAfter as $col_name => $value) {
if ($value !== $resultBefore[$col_name]) {
$diff .= '<tr><td>' . htmlentities($col_name) . '</td><td>' . htmlentities($resultBefore[$col_name]) . '</td><td>' . htmlentities($value) . '</td></tr>';
}
}
echo '<table>' . $diff . '</table>';
我正在使用下面的方法比较两个 select 结果并显示它们之间的差异。
它按预期工作,但 我无法同时包含相应的列名称。
谁能告诉我如何修改我的代码才能获得想要的结果,如下例所示?
PHP:
$stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?");
$stmt->bind_param("s", $vstId);
$stmt->execute();
$resultBefore = $stmt->get_result()->fetch_row();
$stmt->store_result();
$stmt->close();
// some event
$stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?");
$stmt->bind_param("s", $vstId);
$stmt->execute();
$resultAfter = $stmt->get_result()->fetch_row();
$stmt->store_result();
$stmt->close();
$conn->close();
for($i=0; $i<count($resultAfter); $i++) {
if($resultAfter[$i] != $resultBefore[$i]) {
$diff.= '<tr><td>' . $resultBefore[$i] . '</td><td>' . $resultAfter[$i] . '</td></tr>';
}
}
echo '<table>' . $diff . '</table>';
当前结果:
<table>
<tr>
<td>10408</td><td>10407</td>
</tr>
<tr>
<td>168</td><td>167</td>
</tr>
</table>
想要的结果:
<table>
<tr>
<td>Column name that changed</td><td>10408</td><td>10407</td> // I am missing the 1st td
</tr>
<tr>
<td>Column name that changed</td><td>168</td><td>167</td> // I am missing the 1st td
</tr>
</table>
使用 fetch_assoc()
而不是 fetch_row()
。它将 return 一个关联数组。然后使用foreach
循环和关联键循环数组并比较元素。
此外,删除 store_result()
,您已经使用了 get_result()
。
固定代码如下所示:
$stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?");
$stmt->bind_param("s", $vstId);
$stmt->execute();
$resultBefore = $stmt->get_result()->fetch_assoc();
// some event
$stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?");
$stmt->bind_param("s", $vstId);
$stmt->execute();
$resultAfter = $stmt->get_result()->fetch_assoc();
foreach ($resultAfter as $col_name => $value) {
if ($value !== $resultBefore[$col_name]) {
$diff .= '<tr><td>' . htmlentities($col_name) . '</td><td>' . htmlentities($resultBefore[$col_name]) . '</td><td>' . htmlentities($value) . '</td></tr>';
}
}
echo '<table>' . $diff . '</table>';