【发布时间】:2020-03-10 22:55:56
【问题描述】:
我需要在票表中不存在行时插入和/或在行存在时更新 1 个查询。
我尝试了以下方法,它没有添加新记录,也没有增加现有记录。
$query_upsert = mysqli_query($mysqli,
"INSERT INTO tickets (
ticket_companyname,
ticket_ordernumber,
ticket_datetimedeliverydate,
ticket_ritech,
ticket_ticketstatus
)
SELECT
nextgenorder_companyname,
nextgenorder_ordernumber,
nextgenorder_deliverydate,
'$ticket_ritech',
'$ticket_ticketstatus'
FROM nextgenorders2
WHERE
nextgenorder_companyname LIKE CONCAT(SUBSTRING_INDEX('$nextgenorder_companyname', ' ', 1),'%')
AND nextgenorder_deliverydate='$nextgenorder_deliverydate'
ON DUPLICATE KEY UPDATE,
ticket_companyname='$ticket_companyname',
ticket_ordernumber='$ticket_ordernumber',
ticket_datetimedeliverydate='$ticket_datetimedeliverydate',
ticket_ritech='$ticket_ritech',
ticket_ticketstatus='$ticket_ticketstatus'
WHERE
ticket_companyname LIKE CONCAT(SUBSTRING_INDEX('$nextgenorder_companyname', ' ', 1),'%')
AND ticket_datetimedeliverydate='$nextgenorder_deliverydate'
)"
);
你可以在 upsert 查询中使用 WHERE 子句吗?我有所有错误,我没有收到任何错误。
请帮忙。
谢谢,
【问题讨论】:
-
警告:使用
mysqli时,您应该使用parameterized queries 和bind_param将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug。 切勿将$_POST、$_GET或任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 -
这个查询由于冗长而很难阅读。您可以将显示的字段数量减少到更小的相同版本吗?如果您没有收到任何错误,您确定要检查它们吗?他们被记录了吗?尝试运行查询
"SELECT this should not work",如果没有出现错误,则必须先修复它。 -
我马上就做
-
去掉查询末尾
ON DUPLICATE KEY UPDATE ...之后的WHERE子句。这不是有效的语法。ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE ticket_companyname LIKE CONCAT(SUBSTRING_INDEX('$nextgenorder_com' at line 58 -
内部
SELECT是否独立工作?
标签: php mysql sql sql-insert on-duplicate-key