【问题标题】:Why isset($_POST{'variable']) return true even if array $_POST is empty?为什么即使数组 $_POST 为空,isset($_POST{'variable']) 也会返回 true?
【发布时间】:2019-12-04 00:40:21
【问题描述】:

这是我的代码:

    if(isset($_POST['make']) && isset($_POST['year']) && isset($_POST['mileage']))
    {
        $stmt = $pdo->prepare('INSERT INTO Autos (make,year,mileage) VALUES (:mk, :yr, :mi)'); 
        $stmt->execute(array(':mk' => $_POST['make'],':yr' => $_POST['year'],':mi' => $_POST['mileage']));
        $_POST = Array(); 
    }

我收到一个错误:

致命错误:未捕获的 PDOException:SQLSTATE[22007]:无效的日期时间格式:1366 不正确的整数值:'' 列 Automobiles.Autos.year 在 /opt/lampp/htdocs/Automobiles 的第 1 行/autos.php:15 堆栈跟踪:#0 /opt/lampp/htdocs/Automobiles/autos.php(15): PDOStatement->execute(Array) #1 {main} 抛出 /opt/lampp/htdocs/Automobiles/ autos.php 在第 15 行

我不明白为什么if里面的代码执行,如果没有设置,为什么isset返回true?

【问题讨论】:

  • year 也是一个日期时间列,但是你将一个像 2010 这样的整数传递给它?
  • 你能告诉我们帖子的 var_dump 吗?也许值是一个字符串?
  • var_dump 是:array(3) { ["make"]=> string(0) "" ["year"]=> string(0) "" ["mileage"]=> string(0) "" },但那仍然是空字符串,我是 php 的菜鸟,所以对我来说很困惑
  • isset("") 返回 true,因为空字符串不是 null
  • 它们是空的,但它们已经设置好了!它们只是空字符串。

标签: php mysql


【解决方案1】:

您应该在插入之前验证年份参数并使用empty 进行检查

    function validateDate($date, $format = 'Y-m-d')
    {
        $d = DateTime::createFromFormat($format, $date);
        // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
        return $d && $d->format($format) === $date;
    }

    if(!empty($_POST['make']) && !empty($_POST['year']) && !empty($_POST['mileage']) && validateDate($_POST['year']))
    {
        $stmt = $pdo->prepare('INSERT INTO Autos (make,year,mileage) VALUES (:mk, :yr, :mi)'); 
        $stmt->execute(array(':mk' => $_POST['make'],':yr' => $_POST['year'],':mi' => $_POST['mileage']));
        $_POST = Array(); 
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多