Al Ma
Al Ma

Reputation: 71

Insert DATETIME into mysql databse using JSON/PHP

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

Answers (2)

Gfour
Gfour

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

Gordon Linoff
Gordon Linoff

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

Related Questions