【问题标题】:How can I use MySQL NOT NULL with PHP?如何在 PHP 中使用 MySQL NOT NULL?
【发布时间】:2015-04-08 01:54:29
【问题描述】:

我已经使用 PHP 在 MySQL 数据库中插入值(示例代码如下):

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<style>
label{text-align:left;
       width:150px;
       display:block;
           float:left;
           clear:right;
       font-size:18;}

form {
    width: 30%;
    margin: 0 auto;
}
</style>
<label>Name:</label><input name=name autocomplete=off><br>
<label>Date of Birth:</label><input size=2 name=dd placeholder=dd> / <input size=2 name=mm placeholder=mm> / <input size=6 name=yyyy placeholder=yyyy><br>
<label>Time of Birth:</label><input name=tob placeholder="hh : mm : ss"><br>
<label>City:</label><input name=city><br><br>
<center><input type=submit value=Save></center>
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST"){
$servername = "localhost";
$username = "userame";
$password = "password";
$dbname = "myDB2";
if(empty($_POST["name"])){ echo "Name is Required<br>";}
else {
$name = $_POST["name"];
}
var_dump($name);
$tob = $_POST["tob"];
$city = $_POST["city"];
$dd = $_POST["dd"];
$mm = $_POST["mm"];
$yyyy = $_POST["yyyy"];

$dob = "$yyyy-$mm-$dd";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

//Inserting Data
$sql = "INSERT INTO Person
VALUES('$name','$dob','$tob','$city')";
if ($conn->query($sql) === TRUE) {
    echo "<br>New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
}
?>

AND 列 Name 设置为 varchar(60) NOT NULL UNIQUE 数据类型和约束。


尽管

  • NOT NULL 约束 Name 列,和

  • if(empty($_POST["name"])){ echo "Name is Required";} else { $name = $_POST["name"]; }

当我插入提交表单而不在表单的名称输入中输入任何值时,我收到以下消息(根据代码)

姓名为必填项 空值 新记录创建成功

我的数据库输出如下:

在这里你可以看到var_dump($name)$nameNULL 但是MySQL 数据库仍然接受Name 列的这个值!


所以,我的问题是 NOT NULL我如何在 PHP 中使用 MySQL NOT NULL 在表单的帮助下插入数据?

【问题讨论】:

    标签: php mysql forms notnull


    【解决方案1】:

    您需要将 PHP 的 null 适当地转换为 SQL 的 NULL 类型。当您在 PHP 中进行简单的字符串插值时:

    "INSERT INTO foo VALUES ('$bar')"
    

    其中$barnull,结果为:

    INSERT INTO foo VALUES ('')
    

    MySQL 将其视为一个空字符串,它不是NULL,所以没关系。

    你必须这样做:

    $value = null;
    if ($value === null) {
        $bar = 'NULL';
    } else {
        $bar = "'$value'";
    }
    $query = "INSERT INTO foo VALUES ($bar)";
    

    这里的结果是这两个之一:

    INSERT INTO foo VALUES (NULL)
    INSERT INTO foo VALUES ('baz')
    

    然后 MySQL 会将null 视为NULL

    但是,如果您要在 PHP 中达到这样的长度,如果您的值为空,您显然可以简单地不触发查询,而不是触发查询并让 MySQL 由于约束而失败。

    您还需要learn about SQL injection

    【讨论】:

    【解决方案2】:

    空字符串不是NULL。您在表中插入的是一个空字符串:

    $sql = "INSERT INTO Person VALUES('$name','$dob','$tob','$city')";
    

    如果$name 在 PHP 中为 NULL,这只会产生一个字符串,如:INSERT INTO Person VALUES('','...','...','...')

    如果你想将NULL 传递给MySQL,你必须发送NULL,而不是"NULL",而不是""

    $nameForMysql = is_null($name) ? "NULL" : "'$name'";
    $sql = "INSERT INTO Person VALUES($nameForMysql,'$dob','$tob','$city')";
    

    【讨论】:

    • Error: INSERT INTO Person VALUES(NULL,'--','','')
    • 该错误消息正是您所要求的! :-) 现在您已将 NULL 发送到数据表,并且根据表字段声明,sql 会生成带有错误的异常 :-)
    • 好的。我得到的完整输出是: Name is Required Error: INSERT INTO Person VALUES(NULL,'--','','') Column 'Name' cannot be null 我接受了你的回答!
    • 我发现deceze's answer之前已经有类似的解决方案了;所以我接受了!
    【解决方案3】:

    所以只要让你的if...else 更宽:

    if(!isset($_POST["name"]) || empty($_POST["name"])){ echo "Name is Required<br>";}
    else {
    $name = $_POST["name"];
    $tob = $_POST["tob"];
    $city = $_POST["city"];
    $dd = $_POST["dd"];
    $mm = $_POST["mm"];
    $yyyy = $_POST["yyyy"];
    
    $dob = "$yyyy-$mm-$dd";
    
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    
    //Inserting Data
    $sql = "INSERT INTO Person
    VALUES('$name','$dob','$tob','$city')";
    if ($conn->query($sql) === TRUE) {
        echo "<br>New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
    
    $conn->close();
    }
    

    【讨论】:

    • 这实际上不是NOT NULL的用法!
    • 我同意你的看法。但是要在 php 中捕获 null 并将其作为 NULL 转换/发送到不接受它的 sql 表更复杂,并且在这种特殊情况下没有任何意义。恕我直言:-)
    【解决方案4】:

    在没有值的地方指定 NULL,sql 将您的数据视为空字符串而不是 null 所以使用下面的代码

    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
    <style>
    label{text-align:left;
           width:150px;
           display:block;
               float:left;
               clear:right;
           font-size:18;}
    
    form {
        width: 30%;
        margin: 0 auto;
    }
    </style>
    <label>Name:</label><input name=name autocomplete=off><br>
    <label>Date of Birth:</label><input size=2 name=dd placeholder=dd> / <input size=2 name=mm placeholder=mm> / <input size=6 name=yyyy placeholder=yyyy><br>
    <label>Time of Birth:</label><input name=tob placeholder="hh : mm : ss"><br>
    <label>City:</label><input name=city><br><br>
    <center><input type=submit value=Save></center>
    </form>
    
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST"){
    $servername = "localhost";
    $username = "userame";
    $password = "password";
    $dbname = "myDB2";
    if(empty($_POST["name"])){ echo "Name is Required<br>";
    $name = "NULL";
    }
    else {
    $name = $_POST["name"];
    }
    var_dump($name);
    $tob = $_POST["tob"];
    $city = $_POST["city"];
    $dd = $_POST["dd"];
    $mm = $_POST["mm"];
    $yyyy = $_POST["yyyy"];
    
    $dob = "$yyyy-$mm-$dd";
    
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    
    //Inserting Data
    $sql = "INSERT INTO Person
    VALUES('$name','$dob','$tob','$city')";
    if ($conn->query($sql) === TRUE) {
        echo "<br>New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
    
    $conn->close();
    }
    ?>
    

    希望对你有帮助

    【讨论】:

    • 这会将字符串NULL 输入到$name 并因此输入Name 列;这里实际上没有使用NOT NULL
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多