【问题标题】:Include column names in query results or query comparison [duplicate]在查询结果或查询比较中包含列名 [重复]
【发布时间】:2020-11-14 02:49:23
【问题描述】:

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

有人可以告诉我如何修改我的代码以获得所需的结果,如下例所示?

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 并将for 循环更改为foreach ($resultBefore as $key =&gt; $value) 然后将现有循环中的$i 替换为$key 并在您想要的位置输出$key “更改的列名”
  • 我看到的唯一区别确实是缺少第一个 td。但它是纯文本?只需在 diff .= 之后添加它?
  • @Nick:非常感谢。会试试的。
  • @keewee279 本来打算回答你之前的问题,但你在我有机会之前就删除了它......
  • @keewee279,哈哈好吧,这更有意义 XD

标签: php arrays mysqli associative-array


【解决方案1】:

使用fetch_assoc() 代替fetch_row()。它将返回一个关联数组。然后使用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>';

【讨论】:

  • 谢谢。这不起作用,因为它会复制最终结果中的所有行。
  • 重复行是什么意思?你确定你只循环一次吗?
  • 使用它会返回每个结果行两次,一次使用列名,一次使用数组中的数字 id。可能是因为第一个数组没有分配给 $col_name => $value ?
  • @keewee279 对不起,很抱歉造成混乱。我确定了答案。
  • 之前的值应该在$resultBefore[$col_name]中,之后的值应该在$resultAfter[$col_name]$value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多