使用php的html表单和sql验证

xe55xuns  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(517)

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

//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进行验证。我不确定我是否做得对。到目前为止,我可以在我的表单上获得“记录已保存”消息,但如果表单为空,我就无法获得后者。它只是在我的数据库中做了一个空记录。

lx0bsm1f

lx0bsm1f1#

未测试代码:

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查询成功。
以上建议都是我敦促你们采纳的最佳做法。

9avjhtql

9avjhtql2#

检查 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 && $City) 检查。
或者,如果您希望依靠mysql拒绝插入空值,那么请确保mysql表中的字段不可为空,然后更改代码的这部分:(但这将把验证移到mysql)

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

相关问题