我的代码看起来像这样(相关部分):
$json = file_get_contents('php://input');
$obj = json_decode($json, true);
$device_id =$obj['device_id'];
$num =$obj['sensor_value'];
$sensor_value =intval($num);
$date = new DateTime();
$date->setTimezone(new DateTimeZone('America/New_York'));
$fdate = $date->format('Y-m-d H:i:s');
$sql = "INSERT IGNORE INTO rr_emergency SET `device_id` = $device_id, `sensor_value` = $sensor_value, `date_time` = $fdate;";
$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
使用此语法没有任何内容发布到我的数据库。我正在尝试仅在不存在具有相同device_id
值的记录时插入新记录。
而且,是的,我知道这段代码似乎存在SQL注入风险......数据来自我控制的另一个Web服务,所以这不是问题。
答案 0 :(得分:2)
使用值发送查询时,应使用参数化查询。我怀疑那是你的问题。您可以修复根本原因,也可以为字符串和日期值添加单引号。我建议使用更标准的语法:
INSERT IGNORE INTO rr_emergency(device_id, sensor_value, date_time)
VALUES($device_id, $sensor_value, '$fdate')";
注意:您获得的错误是编译时错误,因为MySQL不了解查询的含义。 INSERT IGNORE
忽略运行时错误,但查询必须先编译才能运行。
并且,让我重复使用参数化查询的建议。如果你这样做了,你的代码可以更快地运行。
编辑:
如果device_id
在表中应该是唯一的,那么定义一个唯一约束:
alter table rr_emergency add constraint unq_emergency_device unique (device_id);
然后insert ignore
将忽略任何重复的密钥错误。