【问题标题】:PHP Form adding NULL rows to my SQL database when making user account创建用户帐户时,PHP 表单将 NULL 行添加到我的 SQL 数据库
【发布时间】:2016-08-30 12:34:42
【问题描述】:

我正在用 PHP 为我的网站创建一个用户注册表单,并将用户数据“发布”到我的 SQL 数据库。当我创建前两个用户时,它会将用户信息发布到我的数据库中,例如用户名和电子邮件,每个字段都有一行 NULL。我没有更改我的 PHP 代码中的任何内容,但是现在当我创建一个用户时,它会向数据库添加一个新行,但所有字段都是 NULL,并且是密码的哈希码。我不知道为什么它出现为 NULL。下面我将包括我的 register.php 代码。

    <?php
#session_start();
#if(isset($_SESSION['User']))
#{
# header("Location: home.php");
#}
include_once 'dbconnect.php';

#if(isset($_POST['submit']))
#
     $uname = $_POST['uname'];
     $email = $_POST['email'];
     $upass = $_POST['upass'];

     $stmt = $dbh->prepare("SELECT COUNT(*) as `emailcount` FROM `User` WHERE email=:email");
     $stmt->execute(array("email" => $_POST['email']));
     $row = $stmt->fetch(PDO::FETCH_ASSOC);

     if ($row['emailcount'] > 0) {
        echo "<script>alert('Email $email already exists in our system. Please try another email')</script>";
     } else {


        $stmt = $dbh->prepare("INSERT INTO User(`uname`, `email`, `upass`) VALUES (:uname, :email, :upass)");

        $stmt->execute(array("uname" => $_POST['uname'], "email" => $_POST['email'], "upass" => md5($_POST['upass'])));
     }


?>

我还将在此处包含我正在使用的 HTML 表单

            <form method='post' action='register.php'>
                <pre>
                <div>
            <label>Name : (letters only)*</label>
<input type="text" name="uname" pattern="[A-Za-z]+" title="only letters" required />
</div>

<div>
<label>E-mail : (xyz@zyx.com)*</label>
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" title="xyz@something.com" required />
</div>


<div>
<label>password : (at least 6 chars)</label>
<input type="password" name="upass" pattern=".{6,}" title="Six or more characters" required />
</div>



<input type='submit' name='submit' value='Sign Up'>
</pre>
</form>

【问题讨论】:

  • 警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。当任何现代的development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。至少遵循recommended security best practices 并且永远不要将密码存储为纯文本或使用非常弱的MD5。
  • 你真的不应该使用MD5 password hashes请使用PHP的built-in functions来处理密码安全。在散列之前,请确保您 don't escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。
  • 值得注意的是,您要测试是否有重复,然后继续插入。
  • 您没有适当的控制措施来检查空 POST 变量,甚至是语句准备失败。那里可能出现任何问题,您需要检查所有操作的结果。
  • 您好,在您获得帮助后,请不要破坏您的帖子。这就像在树下避难后砍倒一棵树。请允许其他未来的用户从知识中获益。回答者会付出很多努力。不要浪费他们宝贵的时间。

标签: php mysql email post pdo


【解决方案1】:

您是否曾经访问过register.php没有提交帖子?因为如果您在不提交的情况下进入该页面,插入仍将执行,但您的变量将全部为null,因为它们仅在设置$_POST['submit'] 时设置。

如果是这种情况,请尝试以下方法:

if(isset($_POST['submit']))
{
     $uname = $_POST['uname'];
     $email = $_POST['email'];
     $upass = $_POST['upass'];

     $stmt = $dbh->prepare("SELECT COUNT(*) as `emailcount` FROM `User` WHERE email=:email");
     $stmt->execute(array("email" => $_POST['email']));
     $row = $stmt->fetch(PDO::FETCH_ASSOC);

     if ($row['emailcount'] > 0) {
        echo "<script>alert('Email $email already exists in our system. Please try another email')</script>";
     } else {


        $stmt = $dbh->prepare("INSERT INTO User(`uname`, `email`, `upass`) VALUES (:uname, :email, :upass)");

        $stmt->execute(array("uname" => $_POST['uname'], "email" => $_POST['email'], "upass" => md5($_POST['upass'])));
     }
}

【讨论】:

  • 我之所以发布“提交”是因为提交是我提交表单的 HTML 按钮的名称
  • @BC0148 我明白,但是您描述问题的方式听起来像是您通过某种方式访问​​该页面,而不是通过您的表单提交。例如,如果您只是在浏览器中输入http://mywebite.com/register.php,它将看到没有设置$_POST['submit']。因此,不会设置这三个变量。但是按照您设置它的方式,它仍然会执行低于它的所有内容,同时仍然尝试使用$uname$email$upass,除非您通过表单提交重定向到达该页面,否则它们不会发送。这有意义吗?
  • ahhh 也许这就是问题所在..因为实际上我只是通过输入 www.xxx/register.php 来访问该页面。
  • 我也认为我误解了提交 isset 方法。我认为这只是将 php 代码与 register.php 上该注册表单上的提交按钮相关联。我不知道这意味着只有在提交重定向访问该页面时才会设置这些变量
  • 所以我是否需要更改我的代码,以便在通过在浏览器中输入 url 访问页面时不发布 NULL
猜你喜欢
  • 2016-11-04
  • 2023-01-27
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多