2016-08-18 54 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

在任何情況下,您應該使插入也是一個準備好的聲明。

相關問題