1

主キー idfill を使用して重複をチェックする UPSERT のソリューションを次に示します。それがSQLインジェクションプルーフなのか、それとも効率的なのかさえわかりません。

$idq="SELECT idafill FROM afillInfo, actorsInfo
WHERE (actorsInfo.id = afillInfo.id_actor) AND email = '$_SESSION[email]'" or die    (mysql_error());



$sql = "INSERT INTO afillInfo (idfill, agency, agentPhone, afillChoice, id_actor)
VALUES ( ?,?,?,?, ( select id FROM actorsInfo WHERE email = ?))
ON DUPLICATE KEY UPDATE
`id_actor` = VALUES(`id_actor`),
`agency` = VALUES(`agency`),
`agentPhone` = VALUES(`agentPhone`),
`afillChoice` = VALUES(`afillChoice`)
";


if (($stmt = $con->prepare($sql)) === false) {
trigger_error($con->error, E_USER_ERROR);
}

$result= mysqli_query($con, $idq);
$row_number = 1;
while ($row = mysqli_fetch_array($result)) {

$idfill= $row["idafill"];
}

if ($stmt->bind_param("sssss",
$idfill,
$_POST["agency"], $_POST["agentPhone"],
$_POST["afillChoice"], $_SESSION["email"]) === false) {
trigger_error($stmt->error, E_USER_ERROR);
}


if (($stmt->execute()) === false) {
trigger_error($stmt->error, E_USER_ERROR);
}
4

1 に答える 1

2

INSERT は、可能であれば新しい行を追加します。

INSERT...ON DUPLICATE KEY UPDATE を使用すると、INSERT によって主キー列または一意キー列に重複値が作成される場合にのみ、UPDATE が実行されます。

テーブル定義を投稿していただきありがとうございます。idfill主キー以外に UNIQUE 列がないことがわかりました。

したがって、idfill の値を指定しない場合、新しい行に新しい値が生成されます。これが重複キーをトリガーする方法はありません。実行しているようにクエリを実行し、新しい行が作成されることを期待しないのは意味がありません。

INSERT が失敗して失敗して UPDATE が実行されるようにするには、PRIMARY または UNIQUE KEY の INSERT ステートメントで既存の値を指定する必要があります。それ以外の場合、主キーの個別の値を持つ新しい行を作成することにより、INSERT は成功します。

したがって、INSERT に idfill 列を追加し、データベースに既に存在する値と競合する値を指定する必要があります。

INSERT INTO afillInfo (idfill, agency, agentPhone, afillChoice, id_actor)
VALUES (?, ?, ?, ?, ( SELECT id FROM actorsInfo WHERE email = ?))
   ...

すぐに気付かなかったことをお詫びしますが、別の問題は、ステートメントの UPDATE 部分が何も変更していないことです。

        ... UPDATE
`id_actor` = `id_actor`,
`agency` = `agency`,
`agentPhone` = `agentPhone`,
`afillChoice` = `afillChoice`

これにより、列が以前とまったく同じ値に設定されます。それはノーオペレーションです。これは、PHP でこれを行うのと同じです。

$sql = $sql;

これを回避するには、VALUES() 関数を使用して、挿入しようとした値を再利用します。次に例を示します。

        ... UPDATE
`id_actor` = VALUES(`id_actor`),
`agency` = VALUES(`agency`),
`agentPhone` = VALUES(`agentPhone`),
`afillChoice` = VALUES(`afillChoice`)
于 2013-10-04T01:30:50.387 に答える