代码之家  ›  专栏  ›  技术社区  ›  TheOrdinaryGeek

PHP MariaDB Insert NULL值无效

  •  3
  • TheOrdinaryGeek  · 技术社区  · 7 年前

    我将表单数据提交到MySQL数据库,我的一个值是 NULL 但是在数据库中它是空的。

    我已经确保我的数据库表设置为;

    • allow null=是

    (请忽略任何安全漏洞这是简化代码) ;

    $id = $_POST['id '];
    $name = $_POST['name'] ? $_POST['name'] : NULL ;
    $sql = "INSERT INTO staff (id, name) VALUES ('".$id."', '".$name."')
    // query runs and inserts successfully
    

    var_dump($name) 无效的 ,尽管 name 我的数据库中的值为空(即不是 )

    知道我做错了什么吗?

    4 回复  |  直到 7 年前
        1
  •  2
  •   Tschallacka    7 年前

    首先,你显然没有使用事先准备好的语句。我强烈建议你以安全和稳定的名义使用事先准备好的声明。

    "" . null . "" === ""
    

    保留(非常危险和易受攻击的)示例代码,并修改在要插入的字符串周围添加“引号”的位置。如果名称为空,只需插入 NULL 没有引号。数据库服务器将解释为必须插入空值

    $name = $_POST['name'] ? "'".$_POST['name']."'" : 'NULL';
    $sql = "INSERT INTO staff (id, name) VALUES ('".$id."', ".$name.")";
    

    现在,研究如何进行准备好的查询以防止SQL注入 或者至少使用mysqli\u real\u escape\u string或者类似的东西。

    $sql = "INSERT INTO staff (id,name) VALUES (:id,:name)";
    $stmt= $dpo->prepare($sql);
    $stmnt->bindParam(':id', $id, PDO::PARAM_INT);
    
    if(!$POST['name']) {
        $stmnt->bindParam(':name', null, PDO::PARAM_NULL);
    }
    else {
       $stmnt->bindParam(':name', $POST['name'], PDO::PARAM_STR);
    }
    $stmt->execute();
    
        2
  •  3
  •   dqfan2012    7 年前

    编辑

    原来的海报说

    我将其解释为“我知道SQL注入,我正在代码中采取措施防止它。我简化了我的帖子,以便更容易得到答案。”

    我下面的回答是按照他们的格式。这就是为什么我没有在我的帖子中使用PDO,mysqli,prepared statements/escape措施。如果我亲自编写代码将数据插入数据库,我会确保我的数据经过清理,并使用类似ORM的原则(这是PDO的包装器)直接与数据库交互。

    引用原帖子中的代码:

    $id = $_POST['id '];
    $name = $_POST['name'] ? $_POST['name'] : NULL ;
    $sql = "INSERT INTO staff (id, name) VALUES ('".$id."', '".$name."')
    // query runs and inserts successfully
    

    您的查询的行为方式与您编写代码的方式相同。如果将PHP变量设置为NULL后将其回显/打印到标准输出,则根本看不到值。Null表示没有值。因为您已经将没有值(no value,null)的情况用单引号括起来,所以您告诉MySQL您想在name列中插入一个空字符串。

    我会重写代码如下:

    $id = $_POST['id '];
    $name = $_POST['name'] ? "'$_POST[name]'" : 'NULL';
    $sql = "INSERT INTO staff (id, name) VALUES ('$id', $name)";
    

    在MySQL中向列添加null值。

        3
  •  0
  •   George Hanson    7 年前

    相反,我会使用PDO准备的语句。应该将值设置为NULL而不是空字符串。因为你在包装 '".$name"' '') -即空字符串。

        4
  •  0
  •   Lelio Faieta    7 年前

    我想这样做:

    $id = $_POST['id '];
    if(isset($_POST['name'])){
        $sql = "INSERT INTO staff (id, name) VALUES ('".$id."', '".$name."')
    }else{
        $sql = "INSERT INTO staff (id) VALUES ('".$id."')
    }
    

    推荐文章