【问题标题】:PHP form validation not functioning having copied the tutorial code复制教程代码后,PHP 表单验证不起作用
【发布时间】:2021-10-16 03:40:31
【问题描述】:

我希望社区可以让我对我的代码不起作用的部分有所了解,我正在学习 Udemy 课程。我关注了随附的视频,该视频开发了一个未定义的变量错误,经过一些研究后,我相信我已经通过将变量声明为能够被表单数据覆盖的空字符串来修复。

如果两者都完成,则表单将数据发送到数据库,如果其中一个字段为空,则它不会,这是应该的。

如果其中一个字段为空,则应返回一条语句,要求用户在相应字段中输入数据,但不会发送任何内容。

本教程和我的代码之间的唯一区别是我使用了物化框架,本教程使用引导程序,但我看不出这是问题所在。

我附上了我的代码,并注释掉了多余的部分。

    <?php

    include('php/connection.php');

    //validates data for create user form
    if( isset( $_POST["createUserBtn"])){

        $createUsername = "";
        $createUserPassword = "";
        
        function validateFormData( $formData ) {
            $formData = trim( stripcslashes( htmlspecialchars( $formData)));
            return $formData;
        }

        if( !$_POST["createUsername"]){
            $createUsernameError = "Enter a username <br>";
        } else {
            $createUsername = validateFormData( $_POST["createUsername"]);
        }

        if( !$_POST["createUserPassword"]){
            $createUserPasswordError = "Enter a Password <br>";
        } else {
            $createUserPassword = validateFormData( $_POST["createUserPassword"]);
        }

        if( $createUsername && $createUserPassword) {
            
            $query = "INSERT INTO users (user_id, userName, userPassword) VALUES (NULL, '$createUsername', '$createUserPassword')";

            // if( mysqli_query( $connection, $query)){
            //     echo "New User added";
            // } else {
            //     echo "Error: ".$query."<br>".mysqli_error($connection);
            // }
        }
    }
?>

<!DOCTYPE html>
<html lang="en">

<?php require('static/header.php'); ?>

<?php
    $createUsernameError = "";
    $createUserPasswordError = "";
?>


<div class="col s8 m8 l5 valign-wrapper">
    <div class="container">
        <form action="<?php echo htmlspecialchars( $_SERVER["PHP_SELF"] ); ?>" method="post">
            <div class="row">
                <div class="col s12">
                    <span><h4>Create your user account - create user.php</h4></span>
                    <div class="row form-font">
                        <div class="col s12">
                            <div class="input-field">
                                <a class="red-text"><?php echo $createUsernameError; ?></a>
                                <input placeholder="Enter your username" type="text" name="createUsername">
                                <label for="email">Username</label>
                            </div>
                            <div class="input-field">
                                <a class="red-text"><?php echo $createUserPasswordError; ?></a>
                                <input placeholder="Enter your password" type="password" name="createUserPassword">
                                <label for="password">Password</label>
                            </div>
                            <div class="row left-align">
                                <div class="col s2"></div>
                                <div class="col s8">
                                    <button class="btn-flat waves-effect waves-custom" type="submit" name="createUserBtn"><i class="material-icons left">create</i>Create Account</button>
                                </div>
                                <div class="col s2"></div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </form>
    </div>
</div>

<?php require('static/footer.php'); ?>
</html>

【问题讨论】:

  • 能否提供浏览器实际接收到的HTML?您是否(在浏览器的开发控制台中)检查了单击提交按钮时实际发送了哪个请求?
  • 当我检查开发者窗口时,控制台没有记录任何内容,但表单数据正在发送到数据库。
  • nothing is being logged to the console...实际上,网络请求在开发工具的网络部分可见。打开该部分,然后运行代码并查看记录的内容。 (使用保留日志复选框以确保日志不会在回发/重新加载之间消失)。您可以单击请求以查看其中发送了哪些数据,以及收到了哪些数据。
  • 警告:您的代码容易受到 SQL 注入攻击。您应该使用参数化查询和准备好的语句来帮助防止攻击者通过使用恶意输入值来破坏您的数据库。 bobby-tables.com 给出了风险解释,以及如何使用 PHP / mysqli 安全地编写查询的一些示例。 切勿将未经处理的数据直接插入您的 SQL 中。按照您现在编写代码的方式,有人可以轻松窃取、错误更改甚至删除您的数据。
  • phpdelusions.net/mysqli 还包含使用 mysqli 编写安全 SQL 的好例子。另见mysqli documentation 和这个:How can I prevent SQL injection in PHP?。参数化查询还将大大降低由于未转义或错误引用的输入值而导致意外语法错误的风险。

标签: php html forms mysqli


【解决方案1】:

仔细查看您的代码以及您使用的地方 - 例如 - $createUsernameError 变量。

如果出现错误,您可以使用以下行在其中设置一条消息:$createUsernameError = "Enter a username &lt;br&gt;";。太好了,正是您想要的。

但是,稍后在代码中,您运行 $createUsernameError = "";,这会将其再次重置为空。这发生在所有情况下,无论是否发现错误。它发生在您尝试将该变量echo 到页面上之前。

所以基本上你是在设置值,然后在输出之前立即再次将其消隐。您需要确保仅在没有错误的情况下将其设置为空白。密码错误信息也是同样的问题。

一种简单的方法就是在运行错误检查之前将值设置为空白。如果没有错误,它将保持空白,但不会覆盖任何已设置的错误消息。

所以只需移动这些行:

$createUsernameError = "";
$createUserPasswordError = "";

到脚本的顶部。


附:请注意 cmets 中发布的安全警告并紧急修复您的代码以消除这些漏洞,然后再在任何类型的现场环境中使用此代码。即使您不打算真正使用此代码,您仍然应该解决这些问题,以便您学会以正确、安全、可靠的方式做事,并且不会养成坏习惯。如果您从在线课程中复制此代码,我建议您找到更好的课程。

【讨论】:

  • 它解决了问题!感谢您的帮助
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2019-05-26
  • 2013-09-23
  • 2017-11-04
  • 2012-05-25
  • 2016-07-07
相关资源
最近更新 更多