2017-07-01 18 views
0

一意のIDを持つデータベースに新しいエントリを挿入しようとしています。私のコードのどこかに間違いがありますが、私はそれを見つけることができません。助けてもらえますか?php mysqlが一意のIDを持つレポートを挿入

自動インクリメントはい間違いがwhere($countId)であるnoオプション

$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

を実行しない**有界変数入力して、あなたが保護するためにプレースホルダ(準備文)とのパラメータ化クエリを使用する必要がありますあなたのデータベース[SQLインジェクション](http://stackoverflow.com/q/60174/)! ['mysqli :: prepare()'](http://php.net/mysqli.prepare)と['mysqli_stmt :: bind_param()'](http://php.net/mysqli-stmt)から始めましょう。 .bind-param)。 – Qirel

+0

@Qirelこの場合、スクリプトでデータが生成されているので、実際には違いはありません。 – RiggsFolly

+0

これは本当ですが、採用するのは良い習慣です。変数であるものを準備します。 – Qirel

答えて

2

ではありません。キーを使って同様の行を見つけることができないと仮定すると、$countIdにゼロが入り、ゼロはFALSEと等しくなります。したがって、where句は決して実行されません。

したがって、新しいuniqueidがそのテーブルの既存のキーと一致しない場合、whileループは実行されません。

新しいuniqueidが既存の行と一致する場合は、whileループが実行されますが、実際には何も役立たないELSE条件のみが実行されます。

有効な新しいuniqidを作成してその行を格納するまでループしたいと仮定しています。

$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

これは 'while'演算子です –

+1

はい、演算子は条件がTRUEでゼロがTRUEでない場合にのみ実行します – RiggsFolly

+0

これをより良くする方法を教えてください。 –

-1

は私が

$countID = $checkID->num_rows; 

リターン1

ので状態はまた

とを実行しない場合のは、そのコードを想定してみましょうあなたは論理的な間違いがあると思いますif

$countID = $checkID->num_rows; 

リターン1中のイテレータWILLEあなたは既に**プリペアドステートメントをサポートしてAPIを使用している

関連する問題