使用预准备语句将空值插入数据库PHP MYSQL

时间:2017-02-23 14:53:27

标签: php mysql mysqli prepared-statement bindparam

您好,我是第一次使用预备语句。我有一个表单的值,我在Mysql数据库中插入使用Mysqli编写的语句。但问题是如果用户将输入框留空,则Query不会向数据库插入行。

表格

<form action="test.php" method="post" class="signupform">
    <input type="text" Placeholder="Name" name="name" Required="required"/>
    <br />
    <input type="email" Placeholder="Email-id" name="email" Required="required"/>
    <br />
    <input type="password" Placeholder="Password" name="pass" Required="required"/>
    <br />
    <span>Male<input type="radio" name="sex" value="M" checked="checked"/>&nbsp;&nbsp;&nbsp;Female<input type="radio" name="sex" value="F"/></span>
    <br />
    <input type="text" Placeholder="City" name="city"/>
    <br /><br />
    <input type="submit" value="CREATE MY ACCOUNT" name="submit"/>
</form>

<?php

if(isset($_POST['submit'])){
    include_once('includes/db.php');
    $name=$_POST['name'];
    $pass=$_POST['pass'];
    $email=$_POST['email'];
    $sex=$_POST['sex'];
    $city = $_POST['city'];
    if ($stmt = $mysqli->prepare("INSERT INTO login VALUES('',?,?,?,?,?,'')")) {
        $stmt->bind_param("sssss", $name, $email, $pass, $sex, $city);
        $stmt->execute();
        if($stmt){
            echo "result inserted";
        }
    }
}

?>

当我填写表单的所有框时使用上面的表单和查询,它为我插入一个新行。但如果我将输入框留空,则不会插入任何行。

我也看过很多问题,如果我使用像这样的变量

if(empty($_POST['city'])) { $city = null; } else { $city = $_POST['city']; }
然后它会起作用,其中大多数都是公认的答案。我很困惑,为什么这个解决方案不适合我?

感谢任何帮助......谢谢

2 个答案:

答案 0 :(得分:1)

您的查询错误:

if ($stmt = $mysqli->prepare("INSERT INTO login VALUES('',?,?,?,?,?,'')")) {

应该是这样的:

if (!empty($name) || !empty($pass) || !empty($email))
    {
        $stmt = $mysqli->prepare("INSERT INTO login(`name`,`password`,`email`,`sex`,`city`) VALUES(?,?,?,?,?)");
        $stmt->execute([$name, $pass, $email, $sex, $city]);
        echo "result inserted";

    } else {
        echo 'You have not entered all of the fields.';
    }

在这种情况下,如果变量不为空,则执行insert。否则,如果它们是空火,那么回声表明这些区域尚未被填满。

如果您对字段为null感到高兴,只需将!empty()更改为empty(),但如上所述,请确保您的数据库在其字段中允许NULL。

答案 1 :(得分:1)

可能这不是最聪明的方法之一,但是,嘿,它将完成工作。

在将变量分配给$ _POST字段之前需要做的事情之一,你需要检查是否设置了$ _POST字段并且它是非空的,然后分配值,如果不为空,目前如果有人遗漏运行查询时,表单中的字段可能会收到未定义的通知。

这是你可以做的。

<?php

if (isset($_POST['submit'])) {
    include_once('includes/db.php');


    if (!empty($_POST['name'])) {

        $name = $_POST['name'];
    } else {

        $name = " ";
    }

    if (!empty($_POST['pass'])) {

        $pass = $_POST['pass'];
    } else {

        $pass = " ";
    }

    if (!empty($_POST['email'])) {

        $email = $_POST['email'];
    } else {

        $email = " ";
    }

    if (isset($_POST['sex'])) {

        $sex = $_POST['sex'];
    } else {

        $sex = " ";
    }

    if (!empty($_POST['city'])) {
        $city = $_POST['city'];
    } else {

        $city = " ";
    }
    if ($stmt = $mysqli->prepare("INSERT INTO login VALUES(?,?,?,?,?)")) {
        $stmt->bind_param("sssss", $name, $email, $pass, $sex, $city);
        $stmt->execute();
        if ($stmt) {
            echo "result inserted";
        } else {

            echo "could not insert";
        }
    }
}

?>

还有其他更好的方法可以做到这一点。