我想选择表格中的最后一个元素。幸运的是我做到了,但问题是我的循环中的插入总是重复我的第二个表中的条目。我有自己的笔记本,我不知道问题是什么。
我找到了一种方法可以避免检查最后一个条目是否尚未插入,但它不起作用。
$p = $pdo->query("SELECT * FROM messagein ORDER BY `Id` DESC limit 1 ");
// SELECT * FROM messagein WHERE Id = (select MAX('Id') from messagein)
echo "<table style='border-width: 1px solid black;'>";
echo "<tr>";
echo "<td> ID </td>";
echo "<td> SendTime </td>";
echo "<td> ReceiveTime </td>";
echo "<td> MessageFrom </td>";
echo "<td> MessageTo </td>";
echo "<td> MessageText </td>";
echo "<td> MessageType </td>";
echo "</tr>";
while ($data = $p->fetch())
{
// $p = $pdo->query("SELECT * FROM messagein ORDER BY `Id` DESC limit 1");
// $data = $p->fetch();
echo "<tr>";
echo "<td>" . $data['Id'] . "</td>";
echo "<td>" . $data['SendTime'] . "</td> ";
echo "<td>" . $data['ReceiveTime'] . "</td> ";
echo "<td>" . $data['MessageFrom'] . "</td> ";
echo "<td>" . $data['MessageTo'] . "</td> ";
echo "<td>" . $data['MessageText'] . "</td> ";
echo "<td>" . $data['MessageType'] . "</td>";
echo "</tr>";
if (substr($data['MessageText'], 0, 3) == "lat")
{
$final = explode(" ", $data['MessageText']);
$latitude = substr($final['0'], 4);
$longitude = substr($final['1'], 5);
$vitesse = substr($final['2'], 6);
$temps = $data['ReceiveTime'];
$exists = $pdo->prepare("SELECT * FROM donneesgps WHERE latitude = ? AND longitude = ? AND temps = ? AND vitesse = ?");
$response = $exists->execute(array(
$latitude,
$longitude,
$temps,
$vitesse
));
echo $response;
if ($response == true)
{
$donneesgps = "INSERT INTO donneesgps (latitude, longitude, temps, vitesse)
VALUES ('$latitude', '$longitude', '$temps', '$vitesse')";
$pdo->exec($donneesgps);
}
}
}
答案 0 :(得分:0)
如果您确定数据库中只有一行,则不要使用“while”。
只需:
$data = $p->fetch();
if (!empty($data['Id'])){
// Do your stuff
}
你可能会遇到一些问题,因为你在循环中使用相同的对象$ pdo,通过在飞行中执行类似的查询。
从我的观点来看,你应该在所有“SELECT”结果存储到数组之前,然后将它动态显示到HTML表中(遵循MVC方法)
答案 1 :(得分:0)
检查{pdostatement}->execute()
的返回值,当查询无效且无法执行时,将返回FALSE
。由于您的查询显然有效且已执行,因此它几乎总是返回TRUE
,这与已存在的行完全无关。
您应该SELECT COUNT(*) ...
代替fetch
的实际值是0还是1(或更多)。
或者,您可以将lat / long / temps / vitesse设为主键并始终INSERT IGNORE
。
在任何情况下,您都应该将插入内容也作为准备好的声明。