首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UPSERT使用InnoDB引擎?

UPSERT使用InnoDB引擎?
EN

Stack Overflow用户
提问于 2013-10-04 01:27:07
回答 1查看 265关注 0票数 1

以下是UPSERT的解决方案,该解决方案使用主键id填充来检查重复项。我只是不确定它是否是sql注入的证明,还是甚至是有效的?

代码语言:javascript
复制
$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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-04 01:30:50

如果可以,插入将添加一个新行。

使用INSERT...ON重复键更新时,如果插入将在主键或唯一键列中创建重复值,则只执行更新

谢谢你贴出你的表格定义。我现在看到除了主键idfill之外,您没有唯一的列。

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

必须在INSERT语句中为主键或唯一键指定一个现有值,以便使INSERT失败并失败以执行更新。否则,插入将成功,方法是为主键创建一个具有不同值的新行。

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

代码语言:javascript
复制
INSERT INTO afillInfo (idfill, agency, agentPhone, afillChoice, id_actor)
VALUES (?, ?, ?, ?, ( SELECT id FROM actorsInfo WHERE email = ?))
   ...

很抱歉,我没有立即注意到这一点,但另一个问题是,语句的更新部分没有改变任何东西。

代码语言:javascript
复制
        ... UPDATE
`id_actor` = `id_actor`,
`agency` = `agency`,
`agentPhone` = `agentPhone`,
`afillChoice` = `afillChoice`

这会将列设置为与以前完全相同的值。这是个禁止行动。这相当于在PHP中这样做:

代码语言:javascript
复制
$sql = $sql;

您可以通过使用value()函数来重用尝试插入的值来解决这个问题。下面是一个例子:

代码语言:javascript
复制
        ... UPDATE
`id_actor` = VALUES(`id_actor`),
`agency` = VALUES(`agency`),
`agentPhone` = VALUES(`agentPhone`),
`afillChoice` = VALUES(`afillChoice`)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19171709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档