doubu2730
doubu2730
2017-04-16 16:48

使用JSON / PHP将DATETIME插入到mysql数据库中

已采纳

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.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • doudu5029 doudu5029 4年前

    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);
    ?>
    
    点赞 评论 复制链接分享
  • douchui1657 douchui1657 4年前

    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.

    点赞 评论 复制链接分享