簡體   English   中英

PHP:將字符串日期存儲為MySQL日期格式,但是存儲日期原來是1969-12-31

[英]PHP: stored string date into MySQL date format, but the stored date turns out to be 1969-12-31

public function storeUser($name, $email, $password, $str_birthday) {
    $uuid = uniqid('', true);
    $hash = $this->hashSSHA($password);
    $encrypted_password = $hash["encrypted_password"]; // encrypted password
    $salt = $hash["salt"]; // salt
    $tmp_dobformat = split('-', $str_birthday);
    $tmp = $tmp_dobformat[2].'-'.$tmp_dobformat[1].'-'.$tmp_dobformat[0];
    $dob = date('Y-m-d', strtotime($tmp));

    $result = mysqli_query($this->db->connect(), "INSERT INTO users(unique_id, name, email, encrypted_password, birthday, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$dob', '$salt', NOW())");

    // check for successful store
    if ($result) {

        // get user details
        $result = mysqli_query($this->db->connect(), "SELECT * FROM users WHERE email = '$email'");

        // return user details
        return mysqli_fetch_array($result);

    } else {
        return false;
    }
}

如果$ str_birthday是27-03-1982那么它應該以1982-03-27形式存儲在MySQL數據庫中。 但是無論輸入日期是什么,我在數據庫中只得到1969-12-31 我的代碼有什么問題?

補充說,我創建了一個index.html文件來檢查JSON響應。 這是index.html文件。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="index.php" method="post">
Tag: <input type="text" name="tag"><br>
Name: <input type="text" name="name"><br>
Email: <input type="text" name="email"><br>
Password: <input type="password" name="password"><br>
Birthday: <input type="date" name="birthday"><br>
<input type="submit">
</form>
</body>
</html>

這是獲取POST變量並獲取JSON響應的index.php文件。

<?php

if (isset($_POST['tag']) && !empty($_POST['tag'])) {

    $tag = $_POST['tag'];

    // get the variables.
    $name = $_POST['name'];
    $email = $_POST['email'];
    $password = $_POST['password'];
    $gender = $_POST['gender'];
    $birthday = $_POST['birthday'];

    echo $birthday;

    // response Array
    $response = array("error" => FALSE);

    require_once 'mysql/DB_Functions.php';
    $db = new DB_Functions();

    if ($tag == 'register') {

        // check if user is already exists

        if ($db->userExists($email)) {

            // user already exists - error response
            $response["error"] = TRUE;
            $response["error_msg"] = "User already exists";

            echo json_encode($response);
        } else {

            // store user
            $user = $db->storeUser($name, $email, $password, $gender, $birthday);

            if ($user) {
                // user successfully saved to MySQL database
                $response["error"] = FALSE;
                $response["uid"] = $user["unique_id"];
                $response["user"]["name"] = $user["name"];
                $response["user"]["email"] = $user["email"];
                $response["user"]["gender"] = $user["gender"];
                $response["user"]["birthday"] = $user["birthday"];
                $response["user"]["created_at"] = $user["created_at"];
                $response["user"]["updated_at"] = $user["updated_at"];

                echo json_encode($response);

            } else {
                // user failed to store
                $response["error"] = TRUE;
                $response["error_msg"] = "JSON Error occured in Registration";
                echo json_encode($response);
            }
        }
    } else {
        // user failed to store
        $response["error"] = TRUE;
        $response["error_msg"] = "Unknow 'tag' value. It should be either 'login' or 'register'";
        echo json_encode($response);
    }
} else {
    $response["error"] = TRUE;
    $response["error_msg"] = "Operation failed due to the missing tag!";
    echo json_encode($response);
}

var_dump($_SERVER['REQUEST_METHOD'], $_POST);
?>

最后,這是我從直接在index.html文件中鍵入每個值得到的JSON響應。

{"error":false,"uid":"564901af9bb9f2.79708336","user":{"name":"Learning PHP","email":"learning@php.com","gender":"","birthday":"1969-12-31","created_at":"2015-11-15 17:05:35","updated_at":null}}string(4) "POST" array(5) { ["tag"]=> string(8) "register" ["name"]=> string(12) "Learning PHP" ["email"]=> string(16) "learning@php.com" ["password"]=> string(11) "learningphp" ["dob"]=> string(10) "1981-10-12" }

因此,獲取POST變量“ birthday”似乎沒有問題,但實際上是返回值。 1969-12-31。

最大的線索是要返回的日期。 1969-12-31可能是某個負時區的1970-01-01 (例如GMT-05)。 1970-01-01是Unix時間戳0。

這里的問題是date函數是它的第二個參數,它需要Unix時間戳-一個數字值。 但是您要傳遞一個日期字符串。 PHP不知道如何處理字符串,因此將其轉換為0,然后date()取零並返回您看到的日期。

實際上,您不需要所有拆分和合並等操作。如果$str_birthday已在YYYY-MM-DD中格式化,則應該可以直接將其傳遞到數據庫中。

無關但更重要的是:不建議使用現有的SQL字符串。 您正在接受SQL注入攻擊。 例如,如果$name="');drop table users則您會遇到麻煩。您應該使用mysqli_prepare代替。這是一些有關SQL注入的推薦讀物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM