2016-08-18 3 views
0

테이블의 마지막 요소를 선택하고 싶습니다. 다행히도 그랬지만 문제는 내 루프의 삽입이 항상 두 번째 테이블의 항목을 복제한다는 사실입니다. 나는 여기에 내 scrip을 가지고 있고 나는 그 문제가 무엇인지 모른다.테이블의 마지막 요소를 선택하십시오.

마지막 항목이 아직 삽입되지 않았지만 작동하지 않는지 확인하여 피하는 방법을 찾았습니다.

$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

무엇이 문제인지, plese는 현재 및 예상 된 결과를 샘플 데이터로 보여줍니다. [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t 그리고 [** 시작 **] (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"결과 이전에 저장 한 다음 (MVC 방법 다음) 동적 HTML 테이블로 표시되어야합니다

+0

많은 항목이 있습니다. 행 및 "while"은 GPS 추적기에서 새로운 수신 메시지가 있는지 영구적으로 확인하기 때문에입니다. –

+0

"SELECT * FROM messagein ORDER BY 'ID' DESC 제한 1은 스크립트로 최대 1 행을 반환합니다."라고 말합니다. ". "while"은 "영구적으로"반복되지 않지만 반환되는 행 수에 따라 반복됩니다 (여기서는 테이블의 마지막 항목을 말합니다). 데이터베이스에 새 메시지가 있는지 확인하기 위해 루프에서 영구적으로 실행해야하는 것은 전체 스크립트입니다. – FragBis

+0

@CyrilleBelcoIer "영구적으로"점검하는 것이 재미 있습니다. 출품작을 놓치지 않으려면 어떻게해야합니까? (gps가 2 개 이상의 항목을 동시에 삽입하는 경우) – Jakumi

0

당신은 FALSE 때를 반환합니다 {pdostatement}->execute()의 반환 값을 확인 쿼리가 유효하지 않아 실행할 수 없습니다. 쿼리가 분명히 유효하고 실행되었으므로 거의 항상 기존 행과 관련이없는 TRUE을 반환합니다.

SELECT COUNT(*) ... 대신 fetch의 실제 값이 0 또는 1 (또는 이상)인지 확인해야합니다.

또는 lat/long/temps/vitesse를 기본 키로 만들고 INSERT IGNORE을 항상 만들 수 있습니다.

어쨌든 삽입 문을 준비된 문으로 만들어야합니다.

관련 문제