我在将日期-时间对象转换为字符串时遇到问题,因此我可以通过MySQLi准备的指定数据类型的语句传递它。
我收到的错误是:
Catchable fatal error: Object of class DateTime could not be converted to string
这个错误所指的行是我准备好的语句的执行。尽管多次尝试将Object转换为字符串,但我仍然收到此错误。下面我将粘贴我试图解决这个问题的主要3种方法。
1-使用铸造操作员:
$total_hours_calc = $time_diff->format('%h') + ($time_diff->format('%i'))/60;
$total_hours = (string)$total_hours_calc;
2-使用Print_r:
$total_hours_calc = $time_diff->format('%h') + ($time_diff->format('%i'))/60;
$total_hours = print_r($total_hours_calc, true)
3-连接解决方法:
$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();
根据php文档,DateTime并没有以本机方式实现__toString()方法,该方法解释了您不断遇到的异常。如果您使用的是php5.2或更高版本,您可以扩展DateTime并自己实现__toString。
class DateTimeExt extends DateTime
{
public function __toString()
{
return $this->format("Y-m-d H:i:s");
}
}
将bind_param调用中使用的所有DateTime实例替换为DateTimeExt,应该会很好。
我认为你把注意力集中在$total_hours
上看错了地方,它已经是一个字符串(或可以转换为字符串的整数)
在您链接的代码段中,您将变量$start_time
和$end_time
从字符串更改为DateTime
对象,这将在稍后尝试在准备好的语句中使用它们时引发指示的错误
请参阅此片段,它正确打印diff值,但在打印DateTime对象$start_time
时出错:https://eval.in/145608
我能想到两种可能的解决方案:
为准备好的语句中的$start_time
和$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);
创建一个实现__toString()
的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);
不能添加两个字符串
$total_hours_calc = intval($time_diff->format('%h'),10) + intval($time_diff->format('%i'),10)/60;
在求和之前将值解析为INT
$total_hours_calc = (int)$time_diff->format('%h') + ((int)$time_diff->format('%i'))/60;
并以字符串形式引用结果日期,然后使用
$total_hours = "'".$total_hours_calc."'";
引用最后一个值可能有更好的方法。。根据您的实现,
但CCD_ 12通常是不够的;
您可以使用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";
}