从mySQL切换到mariaDB timestamp messup

时间:2015-11-23 21:59:36

标签: php pdo mariadb

我已经从MySQL切换到MariaDB,这导致了一些“轻微”问题。一个人一直困扰我几个小时,我找不到解决方案。

我通过从MySQL导出数据库并将其导入到MariaDB中来移动我的数据库,这很顺利。

当我的一个更新查询不起作用时,我将其缩小到我的数据库处理程序中的此函数:

public function updateEquipment($type,$product,$acquisition,$calibration_interval,$equipment_no,$inspection_date,$equipment_id,$active)
    {       
        $stmt = $this->conn->prepare("UPDATE equipment SET type = :type, acquisition = :acquisition, calibration_interval = :calibration_interval, equipment_no = :equipment_no, product = :product, inspection_date = :inspection_date, active = :active WHERE id = :equipment_id");

        $stmt->bindParam(":equipment_id", $equipment_id,PDO::PARAM_INT);
        $stmt->bindParam(":type", $type,PDO::PARAM_STR);
        $stmt->bindParam(":acquisition", $acquisition,PDO::PARAM_STR);
        $stmt->bindParam(":calibration_interval", $calibration_interval,PDO::PARAM_STR);
        $stmt->bindParam(":equipment_no", $equipment_no,PDO::PARAM_STR);
        $stmt->bindParam(":product", $product,PDO::PARAM_STR);
        $stmt->bindParam(":inspection_date", $this->formatDateStrToTimeStamp($inspection_date),PDO::PARAM_STR);
        $stmt->bindParam(":active", $active,PDO::PARAM_INT);
        return $stmt->execute();        
    }

formatDateStrToTimeStamp功能:

private function formatDateStrToTimeStamp($inspection_date)
    {
        $day = substr($inspection_date,0,2);
        $month = substr($inspection_date,3,2);
        $year = substr($inspection_date,6,4);   
        return date('Y-m-d H:i:s', strtotime($year."-".$month."-".$day));
    }

正如您所看到的,我已将checked_date的绑定切换为表示我想要更新的时间戳的字符串。我测试了语句没有更新我的时间戳,然后它按预期工作。只要我添加时间戳(在我的情况下,我已经插入了一个静态时间戳),该行将不会更新并且执行不会返回(它应该返回true或false)。

继承我的桌面结构:

CREATE TABLE `equipment` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `type` text NOT NULL,
  `acquisition` text NOT NULL,
  `calibration_interval` text NOT NULL,
  `equipment_no` text NOT NULL,
  `product` text NOT NULL,
  `inspection_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `active` int(11) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

问题: mariaDB中的时间戳处理方式是不同的,因为自交换机以来我没有对我的代码进行任何更改,而我只是从我的MySQL数据库导出的数据库导入了我的数据库。

1 个答案:

答案 0 :(得分:1)

调完我的裤子后(因为我不太擅长调试网页应用程序)我终于找到了问题的答案。

PDO的bindparam必须将变量绑定到占位符或问号,这也在pdo文档中说明。在我的情况下,我尝试在绑定时直接插入字符串,并且带有错误的原始代码使用时间戳格式化程序的返回值。在这两种情况下,我在绑定到占位符时都没有使用变量,因此出错....

当我使用Chrome的Advanced Rest Client调试该功能时,我发现了错误:“只有变量应该通过引用传递”

解决方案1:

$inspect = $this->formatDateStrToTimeStamp($inspection_date);
$stmt->bindParam(":inspection_date", $inspect,PDO::PARAM_STR);

解决方案2:

Ryan Vincent在评论中指出使用bindValue(参见他的评论以获得进一步的灵感)

但仍有点困惑: 我仍然有点困惑,因为代码以前在另一台主机上运行没有问题。我不记得PHP版本或任何东西,但如果有人可以确认它在以前的版本中是可能的,它将解释为什么......