2016-08-18 19 views
0

我想选择表格中的最后一个元素。我幸运地做到了,但问题在于,我的循环中的插入总是重复我的第二个表中的条目。我在这里有我的代码,我不知道是什么问题。选择表格中的最后一个元素

我找到了一种避免检查是否最后一项还没有插入但是不起作用的方法。

$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

不涉及具体问题,但为什么你准备选择,而不是插入?如果查询无效(意思是语法上破坏),则execute的结果为false。 – Jakumi

+0

不确定是什么问题,请向我们展示样本数据的当前和预期结果。请阅读[** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t这里是[** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/),了解如何提高您的问题质量并获得更好的答案。 –

+0

我不明白为什么你有一个SELECT。 – Strawberry

回答

0

如果您确定数据库中只有一行,请不要使用“while”。

刚:

$data = $p->fetch(); 
if (!empty($data['Id'])){ 
    // Do your stuff 
} 

,因为使用的是在循环相同的对象$ PDO通过执行像在飞查询您将有可能是一些问题。

从我的意见,你之前所有的“选择”的结果为数组应该存储,然后将其动态显示为HTML表(以下MVC方法)

+0

我有很多行和“while”是因为我想永久检查是否从GPS跟踪器获得新的传入消息 –

+0

“SELECT * FROM messagein ORDER BY'Id' DESC limit 1”将返回最大1行作为脚本“说”。 “while”将不会永久循环,而是根据返回的行数(在这里,只有一行,即表的最后一个条目)。这是你的整个脚本应该永久运行在一个循环中,以检查你的数据库中是否有新消息。 – FragBis

+0

@CyrilleBelcoIer“永久”检查很有趣。你如何确保你不会错过任何一个条目? (如果gps一次插入2个或更多条目) – Jakumi

0

您检查{pdostatement}->execute()返回值将返回FALSE时该查询无效并且无法执行。由于您的查询显然是有效的并且已执行,因此它几乎总是会返回TRUE,这与已存在或不存在的行完全无关。

您应该SELECT COUNT(*) ...而不是fetch的实际值是0或1(或更多)。

或者,您可以将lat/long/temps/vitesse作为主键,并且始终使用INSERT IGNORE

在任何情况下,您应该使插入也是一个准备好的声明。

相关问题