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

не касается конкретного вопроса, но почему вы готовите выбор, но не вставку? результат выполнения будет ложным, если запрос недействителен (это означает, что он сломан ... синтаксически). – 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 путем выполнения запросов, как, что в лету.

С моей точки зрения, вы должны хранить перед всеми «SELECT» результатов в массивы, а затем отображать его динамически в HTML таблицу (после MVC методы)

+0

У меня много строки и «while» - это потому, что я хочу постоянно проверять, получил ли я новое входящее сообщение от трекера GPS –

+0

«SELECT * FROM messagein ORDER BY' Id' DESC limit 1 »вернет вам максимум 1 строку в качестве вашего скрипта». ». «В то время как« не будет циклически «циклически», но в соответствии с количеством возвращаемых строк (и здесь только один, то есть последний элемент вашей таблицы). Весь ваш скрипт должен постоянно работать в цикле, чтобы проверить, есть ли у вас новое сообщение в вашей базе данных. – FragBis

+0

@CyrilleBelcoIer «постоянно» проверка интересна. Как вы гарантируете, что не пропустите запись? (если gps вставляет 2 или более записей сразу) – Jakumi

0

Вы проверить возвращаемое значение {pdostatement}->execute(), которая будет возвращать FALSE когда запрос недействителен и не может быть выполнен. Поскольку ваш запрос, по-видимому, действителен и был выполнен, он почти всегда возвращает TRUE, который полностью не связан с уже существующей или нет.

Вместо этого вы должны указать SELECT COUNT(*) ... и посмотреть, действительно ли значение fetch составляет 0 или 1 (или больше).

В качестве альтернативы, вы можете просто сделать lat/long/temps/vitesse основным ключом и INSERT IGNORE все время.

В любом случае вы должны сделать вставку также подготовленным заявлением.

Смежные вопросы