php - 准备 MySQL INSERT INTO ON DUPLICATE KEY UPDATE 的语法是否正确?

标签 php mysql sql

我一直在对我的代码进行故障排除,搜索 stackoverflow 以找到使用 PHP 执行此操作的正确语法。我无法弄清楚 ON DUPLICATE KEY UPDATE 语法如何与准备好的语句一起使用:

INSERT INTO placements_by_date (DateVal, PlacementName, PlacementId, 
CampaignId, AdName, Format, TagId, Impressions, Clicks, Leads, MediaCost) 
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE 
// HERE COMES THE TRICKY SYNTAX: 
DateVal = VALUES(DateVal), PlacementName = VALUES(PlacementName), 
PlacementId = VALUES(PlacementId), CampaignId = VALUES(CampaignId), 
AdName = VALUES(AdName), Format = VALUES(Format), TagId = VALUES(TagId), 
Impressions = ?, Clicks = ?, Leads = ?, MediaCost = ?

我尝试了很多变体:

...ON DUPLICATE KEY UPDATE 
DateVal = VALUES('$DateVal'), PlacementName = VALUES('$PlacementName'), 
PlacementId = VALUES('$PlacementId'), CampaignId = VALUES('$CampaignId'), 
AdName = VALUES('$AdName'), Format = VALUES('$Format'), TagId = VALUES('$TagId'),
Impressions = VALUES(?), Clicks = VALUES(?), Leads = VALUES(?), 
MediaCost = VALUES(?)";

我将其存储为字符串 $sql,并执行我通常的操作:

$mysqli = new mysqli(...
...
$stmt = $mysqli -> prepare($sql);
$stmt -> bind_param('sissiiiis', $PlacementName, $PlacementId, 
                     $AdName, $Format, $TagId, $Impressions, 
                     $Clicks, $Leads, $MediaCost);
...

但也许参数应该以不同的方式绑定(bind)?

我尝试阅读反馈,但这太笼统,没有可操作的见解。

$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL;

希望您有一些见解可以分享?

谢谢!

最佳答案

为什么不继续使用 VALUES() 方法?

INSERT INTO placements_by_date(DateVal, PlacementName, PlacementId, 
                               CampaignId, AdName, Format, TagId,
                               Impressions, Clicks, Leads, MediaCost
                              ) 
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
    ON DUPLICATE KEY UPDATE 
        DateVal = VALUES(DateVal), PlacementName = VALUES(PlacementName), 
        PlacementId = VALUES(PlacementId), CampaignId = VALUES(CampaignId), 
        AdName = VALUES(AdName), Format = VALUES(Format), TagId = VALUES(TagId), 
        Impressions = VALUES(Impressions), Clicks = VALUES(Clicks), Leads = VALUES(Leads),
        MediaCost = VALUES(MediaCost);

您没有指定唯一键是什么。但是,您不需要在 update 语句中包含这些列,因为它们已经相同。

如果您想增加最后四个值而不是仅仅分配它们,您也可以这样做:

    ON DUPLICATE KEY UPDATE 
        DateVal = VALUES(DateVal), PlacementName = VALUES(PlacementName), 
        PlacementId = VALUES(PlacementId), CampaignId = VALUES(CampaignId), 
        AdName = VALUES(AdName), Format = VALUES(Format), TagId = VALUES(TagId), 
        Impressions = Impressions + VALUES(Impressions),
        Clicks = Clicks + VALUES(Clicks),
        Leads = Leads + VALUES(Leads),
        MediaCost = MediaCost + VALUES(MediaCost)

编辑:

以下内容应该仅适用于更新最后​​四列:

INSERT INTO placements_by_date(DateVal, PlacementName, PlacementId, 
                               CampaignId, AdName, Format, TagId,
                               Impressions, Clicks, Leads, MediaCost
                              ) 
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
    ON DUPLICATE KEY UPDATE 
        Impressions = VALUES(Impressions), Clicks = VALUES(Clicks), Leads = VALUES(Leads),
        MediaCost = VALUES(MediaCost);

关于php - 准备 MySQL INSERT INTO ON DUPLICATE KEY UPDATE 的语法是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23973548/

相关文章:

mysql - 如何在 mysql 中使用 union with group by 子句避免重复

php - 记录在交易过程中被删除

php - 备份mysql数据库并下载为文件

mysql - 在子查询中使用查询中的列

php - "Class not found"尝试对 WordPress 插件使用 Composer 自动加载时

php - 多输入类型文件元素jquery ajax php mysql

php - 从 Laravel vagrant box 连接到 MySQL

mysql - SQLSTATE[23000] : Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

PHP - 实际执行变量的值

php - JEdi​​table 未保存在 Mysql 中