选择表格中的最后一个元素

时间:2016-08-18 14:41:03

标签: php mysql

我想选择表格中的最后一个元素。幸运的是我做到了,但问题是我的循环中的插入总是重复我的第二个表中的条目。我有自己的笔记本,我不知道问题是什么。

我找到了一种方法可以避免检查最后一个条目是否尚未插入,但它不起作用。

$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);
            }
        }
}

2 个答案:

答案 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

在任何情况下,您都应该将插入内容也作为准备好的声明。