Php 在查询结果或查询比较中包括列名

Php 在查询结果或查询比较中包括列名,php,arrays,mysqli,associative-array,Php,Arrays,Mysqli,Associative Array,我使用下面的选项来比较两个选择的结果,并显示它们之间的差异。 它按预期工作,但我无法同时包含相应的列名 有人能告诉我如何修改代码以获得下面示例中所需的结果吗 PHP: $stmt = $conn->prepare("SELECT * FROM locations WHERE vstId = ?"); $stmt->bind_param("s", $vstId); $stmt->execute(); $resultBefore = $stm

我使用下面的选项来比较两个选择的结果,并显示它们之间的差异。
它按预期工作,但我无法同时包含相应的列名

有人能告诉我如何修改代码以获得下面示例中所需的结果吗

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>
$stmt=$conn->prepare(“从vstId=?”的位置选择*”;
$stmt->bind_参数(“s”,$vstId);
$stmt->execute();
$resultBefore=$stmt->get_result()->fetch_row();
$stmt->store_result();
$stmt->close();
//一些事件
$stmt=$conn->prepare(“从vstId=?”的位置选择*”;
$stmt->bind_参数(“s”,$vstId);
$stmt->execute();
$resultAfter=$stmt->get_result()->fetch_row();
$stmt->store_result();
$stmt->close();
$conn->close();
对于($i=0;$i使用
fetch_assoc()
而不是
fetch_row()
。它将返回一个关联数组。然后使用
foreach
循环和关联键循环数组并比较元素

另外,删除
store\u result()
,您已经使用了
get\u 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>';
$stmt=$conn->prepare(“从vstId=?”的位置选择*”;
$stmt->bind_参数(“s”,$vstId);
$stmt->execute();
$resultBefore=$stmt->get_result()->fetch_assoc();
//一些事件
$stmt=$conn->prepare(“从vstId=?”的位置选择*”;
$stmt->bind_参数(“s”,$vstId);
$stmt->execute();
$resultAfter=$stmt->get_result()->fetch_assoc();
foreach($resultAfter作为$col\u name=>$value){
如果($value!==$resultBefore[$col\u name]){
$diff.='.htmlentities($col_name)。'.htmlentities($resultBefore[$col_name])。'.htmlenties($value)。';
}
}
回声“.$diff.”;

只需使用
fetch_assoc
而不是
fetch_row
,将
for
循环更改为
foreach($resultBefore as$key=>$value)
然后将现有循环中的
$i
替换为
$key
,并在需要“更改的列名”的地方输出
$key
我看到的唯一区别是确实缺少了第一个td。但是它是纯文本的?只需在diff.=?@Nick:非常感谢。我会尝试一下。@keewee279本来打算回答你之前的问题,但你在我有机会之前就把它删除了…@keewee279,哈哈,好吧,这更有意义。谢谢。这不起作用,因为它重复了所有的内容ws在最终结果中。它复制行是什么意思?你确定只循环一次吗?使用此方法将返回每个结果行两次,一次返回列名,一次返回数组中的数字id。可能是因为第一个数组未分配给$col_name=>$value?@keewe279我的错,很抱歉混淆。我修复了答案。值before应该在
$resultBefore[$col\u name]
中,后面的值应该在
$resultAfter[$col\u name]
$value