【问题标题】:Mysql pdo different behaviour at 2 servers [duplicate]Mysql pdo在2台服务器上的不同行为[重复]
【发布时间】:2016-04-20 14:48:16
【问题描述】:

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

$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();

【问题讨论】:

标签: php mysql pdo prepared-statement


【解决方案1】:

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

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

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

【讨论】:

  • 你没有仔细阅读问题
  • 你试过这个解决方案吗?您重新使用了占位符,这是不允许的。
【解决方案2】:

PDO 具有三种错误处理模式。

PDO::ERRMODE_SILENT 就像 mysql_* 一样,您必须检查每个结果,然后查看 $db->e​​rrorInfo();获取错误详细信息。 PDO::ERRMODE_WARNING 抛出 PHP 警告 PDO::ERRMODE_EXCEPTION 抛出 PDOException。在我看来,这是您应该使用的模式。它的行为非常像 or die(mysql_error());当它没有被捕获时,但与 or die() 不同,如果您选择这样做,可以优雅地捕获和处理 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_* 代码。

【讨论】:

  • 这没有回答问题,根据最后一句话,它也不完整。
  • OP 正在使用PDO,为什么回到mysql_?这也与 OP 遇到的问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多