2013-10-04 56 views
1

以下是UPSERT的解决方案,它使用主键idfill来检查重复项。我只是不确定它是否具有sql注入证明或者甚至是有效的?UPSERT使用InnoDB引擎?

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

Upsert?插入还是更新? –

+1

与您的问题无关,但将$ _POST变量直接插入SQL语句是不安全的。请参阅http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

+0

谢谢我会在稍后解决。 – user2714558

回答

2

如果可以,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 
`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`) 
+0

我做了一些改变,你可以看看我做错了什么? – user2714558

+0

谢谢。除了缺失的缺口,我设法让它插入,但更新仍然像以前一样。你提到将idfill添加到重复密钥更新中。我如何添加这个主键参考? – user2714558

+0

谢谢。我尝试了新版本,在删除sss params以适应最新修改后,即使所有字段都重复,仍会添加另一行。 – user2714558