INSERT IGNORE INTO无法正常工作

时间:2016-07-13 02:26:08

标签: php mysql pdo

我的代码看起来像这样(相关部分):

$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服务,所以这不是问题。

1 个答案:

答案 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将忽略任何重复的密钥错误。