2

ここで、ランダムキーを生成する関数を作成しました。

function gen_link(){
$link = '';                             
$s = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
for ($i= 0 ; $i <= 4 ; $i++)
$link = $link.$s[rand(0,63)]; 
return $link;   
}

私はmysqlテーブルでキーを繰り返したくありません.mysqlで一意にしましたが、私がやりたいことは、キーがすでに存在する場合、別のランダムキーを再生成してテーブルに再度追加しようとすることです.以下のこのコード。

$con = mysqli_connect("localhost","shashi","asd123","redir");
$sql = " insert into 'links' ('link') values('$link') ";

do{
 $link = gen_link();
$result = mysqli_query($con,$sql);

}while(mysqli_errno($con)==1064);

 mysqli_close($con);

しかし、まったく機能していないようで、ループし続けます。私に何ができる?

4

3 に答える 3

2

実際のエラーを生成する代わりに、次のINSERT IGNOREようなクエリを使用します。

$sql = "insert ignore into `links` (`link`) values ('$link')";

そしてmysqli_affected_rows()、何かが実際に挿入されたことを確認します。

while (mysqli_affected_rows($con) == 0);

まとめると、次のようになります。

$con = mysqli_connect("localhost", "shashi", "asd123", "redir");

do {
    $link = gen_link();
    $sql = "insert ignore into `links` (`link`) values ('$link')";
    $result = mysqli_query($con, $sql);
} while (mysqli_affected_rows($con) == 0);

mysqli_close($con);

また、クエリに関するいくつかの注意事項:

  1. テーブル名と列名を囲む引用符をバッククォートに変更しました。これは、SQL でそれらを引用する正しい方法です。

  2. クエリに変数を直接含めているため、変数に値を指定した$linkにクエリを定義する必要があるため、その行をループ内に移動しました。これはおそらく、ループし続けた元の問題の原因です。$link

  3. 挿入する ( で生成される) 値を完全に制御できるため、このインスタンスでは重要ではありませんがgen_link()、クエリに挿入する変数を適切にエスケープする習慣を身に付けることをお勧めします。または、準備済みステートメントについて少し読んで、代わりにそれらを使用してください。

于 2013-06-22T05:28:32.787 に答える
0

DB から既存のキー値を配列として取得します。次に、関数を使用して既存のキーで現在のキーを検索しますin_array()。true の場合、新しいキーを生成します。条件が false の場合は、新しいキーを挿入します。

http://php.net/manual/en/function.in-array.php

if(in_array($new_key,$existing))
{
//generate new key
}
else
{
//insert current key
}
于 2013-06-22T05:30:58.127 に答える
0

私はMYSQLで重複値を変更するために、「ON DUPLICATE KEY」を使用してPrepared Statementを使用しています。

$sql = "INSERT INTO ".$this->table." ".
        "(".implode(',',$fields).") VALUES
        (".implode(',',$values).")
        ON DUPLICATE KEY 
        UPDATE key_field = concat(substr(key_field,1,".($laenge_key-3)."),FORMAT(FLOOR(RAND()*999),0))
于 2013-06-22T05:34:46.197 に答える