Reputation: 71
I have a database that contains an DATETIME column, I want to insert current date into it using JSON/PHP, but I kept having this error :
Object of class DateTime could not be converted to string in /storage/h3/744/754744/public_html/SendBookingReq.php on line 13 And this is my php file
<?php
require("password.php");
$connect = mysqli_connect("localhost", XXXX, XXXX, XXXX);
$driver_id = $_POST["driver_id"];
$email = $_POST["email"];
$duree = $_POST["duree"];
$distance = $_POST["distance"];
$response = array();
$dt_obj = new DateTime($response['DateTime'], new
DateTimeZone('America/Chicago'));
$dt_obj->setTimezone(new DateTimeZone('Europe/Paris'));
$dt_obj->format('d-m-Y H:i:s');
echo $dt_obj;
function AddRequest() {
global $connect, $driver_id, $email, $duree, $distance, $dt_obj ;
$statement = mysqli_prepare($connect, "INSERT INTO demande (driver_id, pass_id, duree, distance, send_moment) VALUES (?, (SELECT user_id FROM passager WHERE email = ?), ?, ?, '$dt_obj')");
mysqli_stmt_bind_param($statement, "isdis", $driver_id, $email, $duree, $distance,$dt_obj);
mysqli_stmt_execute($statement);
mysqli_stmt_close($statement);
}
$response["success"] = false;
AddRequest();
$response["success"] = true;
echo json_encode($response);
?>
And honestly ,I looked a lot for what letter should I use with datetime ex: "s" for string but I didn't find any.
Upvotes: 0
Views: 1275
Reputation: 83
Error
Object of class DateTime could not be converted to string in /storage/h3/744/754744/public_html/SendBookingReq.php on line 13
This error occurs because of echo $dt_obj
on line 13, but echo
outputs one or more strings. You may want to use var_dump($dt_obj)
or print_r($dt_obj)
instead.
EDITED AFTERWARDS
<?php
require("password.php");
$connect = mysqli_connect("localhost", XXXX, XXXX, XXXX);
$driver_id = $_POST["driver_id"];
$email = $_POST["email"];
$duree = $_POST["duree"];
$distance = $_POST["distance"];
$response = array();
$dt_obj = new DateTime($response['DateTime'], new
DateTimeZone('America/Chicago'));
$dt_obj->setTimezone(new DateTimeZone('Europe/Paris'));
/* create a DATETIME string to use in mysqli_stmt_bind_param() in line 24
* https://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html */
$send_time = $dt_obj->format('Y-d-m H:i:s');
function AddRequest() {
global $connect, $driver_id, $email, $duree, $distance, $send_time ;
echo($send_time);
/* proper number of parametres (?) according to the db table's number of columns (5) */
$statement = mysqli_prepare($connect, "INSERT INTO demande (driver_id, pass_id, duree, distance, send_moment)
VALUES (?, (SELECT user_id FROM passager WHERE email = ?), ?, ?, ?)");
/* http://php.net/manual/en/mysqli-stmt.bind-param.php */
mysqli_stmt_bind_param($statement, "isdis", $driver_id, $email, $duree, $distance,$send_time);
mysqli_stmt_execute($statement);
mysqli_stmt_close($statement);
}
$response["success"] = false;
AddRequest();
$response["success"] = true;
echo json_encode($response);
?>
Upvotes: 1
Reputation: 1270181
Don't insert the datetime
value from the application. Application level timestamps are troublesome, because of clock skew, time zones, latency, and so on. Using the database server date time avoids these problems.
Set it based on the database datetime. The simplest way is to default send_moment
to have the current date time when a new row is inserted. This is handled in the CREATE TABLE
statement (see here).
If you are going to do it in a statement, I would recommend using now()
:
INSERT INTO demande (driver_id, pass_id, duree, distance, send_moment)
SELECT ?, user_id, ?, ?, NOW()
FROM passager
WHERE email = ?;
Note that this slightly changes the ordering of the parameters. The email is now the last parameter instead of the second.
I think the bind statement is:
mysqli_stmt_bind_param($statement, "isis", $driver_id, $duree, $distance, $email);
You'll have to double check on the types.
Upvotes: 2