次のスクリプトがあります。
// Query
$STH = $DB->prepare('SELECT * FROM players WHERE game = ?');
$STH->execute(array($_POST['game']));
// Get the stored photos
$Used = array();
while ($row = $STH->fetch())
$Used[] = intval($row['photo']);
// (1)
// Get a random photo that is not stored already
$Photo = array_rand(array_diff(range(1, 6), $Used));
// (2)
// Insert the photo
$STH = $DB->prepare('INSERT INTO players (id, user, game, name, family, photo) VALUES (?, ?, ?, ?, ?, ?)');
$STH->execute(array($Id, $User->id, intval($_POST['game']), $Name, $Family, $Photo));
ただし、これにより、データベースで重複した結果が得られます。具体的には、1
と5
が何度も繰り返されています (6 要素の範囲を強制するために約 30 要素で実行したテストでは、他のものではありません。
var_dump(array_diff(range(1, 6), $Used));
さらに、何回も挿入した後に(1)を書くと、必ず が出力されますarray(2) { [1]=> int(2) [5]=> int(6) }
。したがって、どうやら、数字の 2 と 6 は考慮されていません。またecho $Photo;
、(2) の場合、数値は常に1
または5
であるため、明らかに挿入の問題ではありません。
では、なぜデータベース内のエントリが重複しているのでしょうか? PHP コードの何が問題になっていますか? 将来的には間違いなく 2 フィールドの一意の制約を設定しますが、ランダムな写真の ID を保存している PHP は修正されません。