php - UPSERT 使用 InnoDB 引擎?

标签 php mysql

这是 UPSERT 的解决方案,它使用主键 idfill 检查重复项。我只是不确定它是否是 sql 注入(inject)证明甚至是有效的?

$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);
}

最佳答案

如果可以,INSERT 添加一个新行。

当您使用 INSERT...ON DUPLICATE KEY UPDATE 时,如果您的 INSERT 将在主键或唯一键列中创建重复值,它执行更新。

感谢您发布表定义。我现在看到除了主键 idfill 之外,您没有 UNIQUE 列。

因此,如果您没有为 idfill 指定值,它将在新行中生成一个新值。这不可能触发重复键。像您一样运行查询而不期望它创建新行是没有意义的。

您必须在 INSERT 语句中为 PRIMARY 或 UNIQUE KEY 指定一个现有值,以导致 INSERT 失败并失败以执行 UPDATE。否则 INSERT 将成功,方法是创建一个主键具有不同值的新行。

因此您必须将 idfill 列添加到您的 INSERT 中,并指定一个与数据库中已存在的值冲突的值。

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`)

关于php - UPSERT 使用 InnoDB 引擎?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19171709/

相关文章:

php - MySQL 表锁定(读)

mysql - 带有计数操作的 SQL 连接查询

php mysql查询更新多个表

php - OOP PHP 用户类 (usercake) 不添加到数据库

PHP XML/HTML DOM 获取带空格的 CSS 类属性

php - 插入不适用于 PHP 变量

php - 如何在 PHP 中检查变量是否已设置以及检查两个值是否与设置的变量匹配?

php - Font Awesome 没有出现在浏览器中

c# - W10 Universal App如何连接MySQL数据库

mysql - 按赞成票-反对票对评论进行排序,确保没有投票的评论显示在否定上方