我已经从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数据库导出的数据库导入了我的数据库。
答案 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版本或任何东西,但如果有人可以确认它在以前的版本中是可能的,它将解释为什么......