我在将日期时间对象转换为字符串时遇到问题,因此我可以通过指定数据类型的MySQLi预处理语句传递它。
我收到的错误是:
Catchable fatal error: Object of class DateTime could not be converted to string
此错误引用的行是我准备好的语句的执行。尽管尝试将Object转换为字符串,但仍然会收到此错误。下面我将粘贴我尝试解决此问题的主要方式。
$total_hours_calc = $time_diff->format('%h') + ($time_diff->format('%i'))/60;
$total_hours = (string)$total_hours_calc;
$total_hours_calc = $time_diff->format('%h') + ($time_diff->format('%i'))/60;
$total_hours = print_r($total_hours_calc, true)
$total_hours_calc = $time_diff->format('%h') + ($time_diff->format('%i'))/60;
$total_hours = $total_hours_calc . "";
所有这些尝试都会返回此问题开头所述的错误。
任何帮助,解决方案或魔术PHP函数都不为那些尚未在PHP领域实现黑带的人所知 - 非常感谢。
$sql = "INSERT INTO shift ".
"(uniqueid, shift_date, start_time, end_time, total_hours, rate_of_pay, addedBy, paidRate, totalPaid) ".
"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = $connection->prepare($sql);
$stmt->bind_param('sssssssss', $uniqueid, $shift_date, $start_time, $end_time, $total_hours, $rate_of_pay, $addedBy, $paidRate, $totalPaid);
$stmt->execute();
所有错误中引用的行是:$stmt->execute();
答案 0 :(得分:5)
根据php文档,DateTime本身并没有实现__toString()方法,这解释了你不断获得的异常。您可以自己扩展DateTime并实现__toString,前提是您使用的是PHP 5.2或更高版本。
class DateTimeExt extends DateTime
{
public function __toString()
{
return $this->format("Y-m-d H:i:s");
}
}
使用DateTimeExt替换bind_param调用中使用的所有DateTime实例,你应该是好的。
答案 1 :(得分:2)
我认为你通过关注$total_hours
来查找错误的地方,$start_time
已经是一个字符串(或者可以转换为字符串的整数)
在the snippet you linked中,您将变量$end_time
和DateTime
从字符串更改为$start_time
个对象,这会在您稍后尝试使用它们时抛出指示的错误在准备好的声明中
请参阅此代码段,该代码段正确打印diff值,但在打印DateTime对象$start_time
时出现错误:https://eval.in/145608
我可以想到两种可能的解决方案:
在预准备语句中使用另一个变量作为$end_time
和$start_time = "9:00";
$end_time = "17:30";
$start_time = new DateTime($start_time);
$end_time = new DateTime($end_time);
$time_diff = date_diff($start_time,$end_time);
$start_time_string = $start_time->format('Y-m-d H:i:s');
$end_time_string = $end_time->format('Y-m-d H:i:s');
$stmt->bind_param('sssssssss', $uniqueid, $shift_date, $start_time_string, $end_time_string, $total_hours, $rate_of_pay, $addedBy, $paidRate, $totalPaid);
的字符串值
DateTime
创建一个class DateTimeDb extends DateTime {
public function __toString() {
return $this->format('Y-m-d H:i:s');
}
}
$start_time = "9:00";
$end_time = "17:30";
$start_time = new DateTimeDb($start_time);
$end_time = new DateTimeDb($end_time);
$time_diff = date_diff($start_time,$end_time);
$stmt->bind_param('sssssssss', $uniqueid, $shift_date, $start_time, $end_time, $total_hours, $rate_of_pay, $addedBy, $paidRate, $totalPaid);
的子类,实现__toString()
,然后使用它。
{{1}}
答案 2 :(得分:0)
你不能添加两个字符串
$total_hours_calc = intval($time_diff->format('%h'),10) + intval($time_diff->format('%i'),10)/60;
答案 3 :(得分:0)
在将值相加之前将值解析为INT
$total_hours_calc = (int)$time_diff->format('%h') + ((int)$time_diff->format('%i'))/60;
在使用之前将结果日期引用为字符串
$total_hours = "'".$total_hours_calc."'";
根据您的实施情况,可能有更好的方式来引用最后一个值
但$int .""
通常是不够的;
答案 4 :(得分:0)
您可以使用DateTime类的格式方法:
$date = new DateTime('2014-01-01');
$result = $date->format('Y-m-d H:i:s');
如果格式失败,则返回FALSE:
if ($result) { // OK
echo $result;
}
else { // if format failed
echo "Unknown Time";
}