【问题标题】:Form and SQL Validation using PHP使用 PHP 进行表单和 SQL 验证
【发布时间】:2019-04-01 21:54:38
【问题描述】:

当用户点击保存时,检查数据是否成功插入记录到表中,并显示相应的消息。如果表单为空,则应显示错误消息并且数据库不应有任何记录。

//SAVE

if (isset($_POST['SAVE'])) {
    $Name = $_POST['name'];
    $City = $_POST['city'];
    $query = "Insert Into Info Values('$Name','$City')";
    $result = mysqli_query($con, $query) or die ("query is failed" . mysqli_error($con));
    $Name = '';
    $City = '';
    if(mysqli_affected_rows($con)>0) {
        echo "record is saved";
    }else {
        echo "record is not saved";
    }

我只能通过 php 进行验证。我不确定我这样做是否正确。到目前为止,我可以在表单上收到“记录已保存”消息,但如果表单为空,我无法获得后者。它只是在我的数据库中创建一个空记录。

【问题讨论】:

  • 您需要通过 mysqli 或 PDO 使用准备好的语句。
  • 您可以使用!empty 代替isset,并检查所有三个字段。
  • 为什么不在你的 php 中使用 !emptyisset 检查值
  • 使用 !empty 仍会将空条目添加到我的表中
  • @Atheya 像空格一样空吗?

标签: php html mysql validation mysqli


【解决方案1】:

未经测试的代码:

if (!isset($_POST['SAVE'], $_POST['name'], $_POST['city'])) {  // avoid Notices
    echo "Missing required submission data";
} elseif (!strlen(trim($_POST['name']))) {  // validate however you wish
    echo "Name data is not valid";  // explain however you wish
} elseif (!strlen(trim($_POST['city']))) {  // validate however you wish
    echo "City data is not valid";  // explain however you wish
} elseif (!$con = new mysqli("localhost", "root", "", "db")) {  // declare and check for a falsey value
    echo "Connection Failure"; // $con->connect_error <-- never show actual error details to public
} elseif (!$stmt = $con->prepare("INSERT INTO Info VALUES (?,?)")) {
    echo "Error @ prepare"; // $con->error;  // don't show to public
} elseif (!$stmt->bind_param("ss", $_POST['name'], $_POST['city'])) {
    echo "Error @ bind";  // $stmt->error;  // don't show to public
} elseif (!$stmt->execute()) {
    echo "Error @ execute";  // $stmt->error;  // don't show to public
} else {
    echo "Insert Successful"; 
}

提交数据的验证条件确保值不为空且不完全由空白字符组成。如果您希望进一步细化验证要求,只需更新条件即可。

如果您想简单地确保$_POST['name']$_POST['city'] 不为空,则可以将前三个条件替换为

if (empty($_POST['SAVE']) || empty($_POST['name']) || empty($_POST['city'])) {
    echo "Submission data is missing/invalid";
}...

如果您不使用预准备语句,则 Paul O'Malley 之类的名称值会破坏您的查询。更糟糕的是,如果有人想尝试进行注入攻击,您的查询很容易受到攻击。

检查affected_rows() 是不必要的。如果查询执行没有错误消息,则 INSERT 查询成功。

以上建议都是我敦促您采用的最佳实践。

【讨论】:

    【解决方案2】:

    检查isset($_POST['SAVE']) 只会告诉您是否设置了“保存”。它不会告诉你字段是否有值。

    要在 PHP 中进行验证,请使用以下内容:

    if (isset($_POST['SAVE'])) {
        $Name = $_POST['name'];
        $City = $_POST['city'];
        if ($Name && $City)
        {
           //...
           //code to insert data into the database goes here
           //...
    
           if(mysqli_affected_rows($con)>0) {
              echo "record is saved";
           }else {
              echo "record is not saved (error saving)";
           }
        } else {
           echo "record is not saved (input was empty)";
        }
    }
    

    关键是if ($Name &amp;&amp; $City) 检查。

    或者,如果您想依靠 mysql 拒绝插入空白值,请确保 mySql 表中的字段不可为空,然后更改这部分代码:(但这会将验证移至MySql)

    $Name = $_POST['name']?$_POST['name']:null;
    $City = $_POST['city']?$_POST['city']:null;
    

    【讨论】:

    • 迫不及待地想看看反对者的解释。 OP 说他想用 PHP 进行验证。这就是这样做的方法。
    • @mickmackusa OP 说“我只能通过 php 进行验证。”此外,这个问题与安全无关。我没有在回答中写任何疑问。我没有向世界展示任何关于编写查询的内容。我使用了 OPs 代码。我所做的只是添加一个if statement 来检查NameCity 中是否有值。这完全回答了 OP 的问题。
    • @EvandelaCruz 非常感谢。我是 php 的初学者,这让我很困惑。
    • @mickmackusa 错误的查询无关紧要。使用准备好的语句是无关紧要的。所以我们回答这个问题。我们不会做出一堆假设。
    • @mickmackusa 好的,你去。我期待您的投票
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多