2017-07-01 2 views
0

Ich versuche, einen neuen Eintrag in meine Datenbank mit einer eindeutigen ID einzufügen. Irgendwo in meinem Code ist ein Fehler, aber ich kann es nicht finden. Kannst du bitte helfen?PHP mysql Bericht mit eindeutiger ID einfügen

Autoincrement ist keine Option

$newConversationID = uniqid(); 

    $checkID = $DBcon->query("SELECT * FROM tbl_conversations WHERE conversation_id=$newConversationID"); 
    $countID = $checkID->num_rows; 


    while($countID) { 

     if ($countID==0) { 
      $DBcon->query("INSERT INTO tbl_conversations (conversation_id,user_id, date) VALUES('$newConversationID','$fromID',UNIX_TIMESTAMP())");break; 
     } else { 

      $newConversationID = uniqid(); 

      $checkID = $DBcon->query("SELECT * FROM tbl_conversations WHERE conversation_id=$newConversationID"); 
      $countID = $checkID->num_rows; 

     } 

    } 
+0

Sie sind bereits eine API verwenden, die ** vorbereitete Anweisungen ** mit beschränktem variablen Eingang unterstützt, sollten Sie parametrisierte Abfragen mit Platzhalter (Prepared Statements) nutzen zu schützen Ihre Datenbank gegen [SQL-injection] (http://stackoverflow.com/q/60174/)! Beginnen Sie mit [mysqli :: prepare() '] (http://php.net/mysqli.prepare) und [mysqli_stmt :: bind_param()'] (http://php.net/mysqli-stmt .bind-param). – Qirel

+0

@Qirel In diesem Fall macht es keinen Unterschied, wie die Daten im Skript generiert werden. – RiggsFolly

+0

Während das stimmt, ist es eine gute Angewohnheit zu adoptieren. Bereite alles vor, was eine Variable ist. – Qirel

Antwort

2

Ja, die Fehler in der where($countId) ist. Angenommen, Sie finden keine ähnliche Zeile mit dem Schlüssel, erhalten Sie 0 in $countId und Null entspricht FALSE. Also wird die Where-Klausel niemals ausgeführt.

Wenn also die neue uniqueid keinem vorhandenen Schlüssel in dieser Tabelle entspricht, wird die while-Schleife nicht ausgeführt!

Wenn die neue uniqueid mit einer vorhandenen Zeile übereinstimmt, wird die while-Schleife ausgeführt, aber NUR die ELSE-Bedingung wird ausgeführt, was eigentlich nichts Sinnvolles bewirkt.

Ich nehme an, Sie möchten Schleife, bis Sie eine gültige neue uniqid erstellen und dann diese Zeile speichern.

$qfind = "SELECT COUNT(conversion_id) FROM tbl_conversations WHERE conversion_id = ?"; 
$search = $mysqli->prepare($qfind); 
$qinsert = "INSERT INTO tbl_conversations (conversion_id) VALUES(?)"; 
$insert = $mysqli->prepare($qinsert); 

//loop till we end up with a new unique id 
while(true) { 
    $id = uniqid(); 
    $search->bind_param('s', $id); 
    $search->execute(); 
    $result = $search->get_result(); 
    $row = $result->fetch_array(MYSQLI_NUM); 

    if ($row[0] == 0) { 
     // we have a new unique index so store the row 
     $insert->bind_param('s', $id); 
     $insert->execute(); 

     // we are all done here so break out of the while loop 
     break; 
    } 
} 
+0

es ist ein "while" -Operator –

+1

Ja, und während Operatoren nur laufen, wenn die Bedingung WAHR ist und Null ist NICHT WAHR – RiggsFolly

+0

und könnten Sie mir sagen, wie man das besser macht? –

-1

Ich glaube, Sie haben einen logischen Fehler

wir

$countID = $checkID->num_rows; 

return 1

so die Bedingung, dass Code annehmen, wenn nicht

ausführen und auch wenn

$countID = $checkID->num_rows; 

Rückkehr 1 der während Iterator wille ausführt nicht