Mysql pdo在2台服务器上的行为不同

时间:2016-04-20 14:48:16

标签: php mysql pdo prepared-statement

为什么在第一台服务器上这样的代码在更新集“00-00-00 00:00:00”和2d设置当前时间

$pdo = new PDO;
$sth = $pdo->prepare("INSERT INTO `tbl_process`
                      SET `good` = :good, `type` = :type, `pid` = :pid, `time` = :time
                      ON DUPLICATE KEY UPDATE `time` = :time");
$sth->bindParam(':good', $good);
$sth->bindParam(':type', $type);
$sth->bindParam(':pid', $pid);
$sth->bindParam(':time', $time);
$sth->execute();

如果我将代码改为此(添加:time2) - 我在两种情况下都得到合适的时间

$pdo = new PDO;
$sth = $pdo->prepare("INSERT INTO `tbl_process`
                      SET `good` = :good, `type` = :type, `pid` = :pid, `time` = :time
                      ON DUPLICATE KEY UPDATE `time` = :time2");
$sth->bindParam(':good', $good);
$sth->bindParam(':type', $type);
$sth->bindParam(':pid', $pid);
$sth->bindParam(':time', $time);
$sth->bindParam(':time2', $time);
$sth->execute();

2 个答案:

答案 0 :(得分:0)

占位符在查询中必须是唯一的。你不能重复使用它们:

  SET `good` = :good, `type` = :type, `pid` = :pid, `time` = :time
                                                             ^^^^^
  ON DUPLICATE KEY UPDATE `time` = :time");
                                    ^^^^^

第二个查询有效,因为您使用了不同的占位符名称。

答案 1 :(得分:-3)

PDO有三种错误处理模式。

PDO :: ERRMODE_SILENT的行为类似于mysql_ *,您必须检查每个结果,然后查看$ db-> errorInfo();获取错误详细信息。 PDO :: ERRMODE_WARNING抛出PHP警告 PDO :: ERRMODE_EXCEPTION抛出PDOException。在我看来,这是你应该使用的模式。它的行为非常像或死(mysql_error());当它没有被捕获,但不像或死()时,如果您选择这样做,PDOException可以被优雅地捕获和处理。

获取上次插入ID

<?php
$result = mysql_query("INSERT INTO table(firstname, lastname) VALUES('John', 'Doe')") or die("Insert Failed ".mysql_error());
$insert_id = mysql_insert_id();

到目前为止,我们只展示了不接受任何变量的简单陈述。这些是简单的语句,PDO具有SELECT语句的快捷方法查询和INSERT,UPDATE,DELETE语句的exec。对于采用变量参数的语句,应使用绑定参数方法安全地执行查询。请考虑以下mysql_ *代码。