【问题标题】:Boostrap Form with PHP, MySQL not sending data to database [closed]使用 PHP 的引导表单,MySQL 不向数据库发送数据 [关闭]
【发布时间】:2017-03-09 14:39:22
【问题描述】:

我多年来一直在尝试调试它,但不明白为什么它不向我的数据库发送数据。另外作为一个指示,我正在使用 Boostrap 并且此表单位于模态框内。有人可以帮帮我吗?我将包括我的 html 片段以及 php 代码。

HTML 代码

<form class="form-horizontal" role="form" action="register.php" method="POST">
      <div class="input-group margin-bottom-sm"><span class="input-group-addon"><i class="glyphicon glyphicon-user" aria-hidden="true"></i></span>                        <input class="form-control" type="text" name="fname" id="FirstName" placeholder="First Name" required>
           </div></br>
          
        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-user" aria-hidden="true"></i></span>
                    <input class="form-control" type="text" name="lname" id="LastName" placeholder="Last Name" required>
        </div></br>
        
        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-calendar" aria-hidden="true"></i></span>
                    <input class="form-control" type="text" name="dob" id="dob" placeholder="Date of Birth" required>
        </div><br>
        
        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-book" aria-hidden="true"></i></span>
                    <input class="form-control" type="text"  name="school" id="SchoolName" placeholder="School" required>
        </div></br>
    
        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-user" aria-hidden="true"></i></span>
                    <input class="form-control" type="text" name="username" id="Username" placeholder="Username" required>
        </div></br>
      
        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-lock" aria-hidden="true"></i></span>
                    <input class="form-control" type="password"  name="pass" data-minlenght= "6" id="Pass" placeholder="Password" required> 
        </div><div class="help-block">Minimum of 6 characters</div></br></br>
        
        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-lock" aria-hidden="true"></i></span>
                    <input class="form-control" type="password" id="inputPasswordConfirm" data-match="#inputPassword"
                           data-match-error="Whoops, these don't match" placeholder="Confirm" required>
        </div></br>
    
        <div class="form-group">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary" id="register">Sing Up</button>
        </div>
    
        </form>

PHP

<?php

$conn=mysqli_connect("localhost","mydatabase","mypassword")
    or die("Could not connect:".mysqli_error($conn));
mysqli_select_db($conn , 'mydatabase') or die ('Database will not open');

if(isset($_POST['register'])){


    $fname = ($_POST['FirstName']);  
    $lname = ($_POST['LastName']);
    $dob = ($_POST['dob']);
    $school = ($_POST['SchoolName']);
    $username = ($_POST['Username']);
    $pass = ($_POST['Pass']);


    $query = "INSERT INTO users (FirstName,LastName,dob,SchoolName,Username,Pass)VALUES('$FirstName','$LastName','$Username','$dob', '$SchoolName','$Pass',)";
    $result = mysqli_query($conn,$query);
}
?>

【问题讨论】:

  • 代码在做什么?它以什么方式失败?检查 PHP 错误日志时会发生什么?当你检查mysqli_error()?
  • 再次检查你的 SQL >> '$Pass',)"; 去掉逗号。
  • 因为LastName是未定义的
  • 这个'$Pass',)去掉逗号
  • 像这样的小错误,'$Pass',)" 这就是准备好的语句发挥作用的地方

标签: php html mysql forms boost-random


【解决方案1】:

你所有的 $_POST 变量都是未定义的。您应该使用表单中的 name 属性来分配 $_POST 值,而不是输入中的 ID

<form class="form-horizontal" role="form" action="register.php" method="POST">
      <div class="input-group margin-bottom-sm"><span class="input-group-addon"><i class="glyphicon glyphicon-user" aria-hidden="true"></i></span>                        <input class="form-control" type="text" name="fname" id="FirstName" placeholder="First Name" required>
           </div></br>

        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-user" aria-hidden="true"></i></span>
                    <input class="form-control" type="text" name="lname" id="LastName" placeholder="Last Name" required>
        </div></br>

        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-calendar" aria-hidden="true"></i></span>
                    <input class="form-control" type="text" name="dob" id="dob" placeholder="Date of Birth" required>
        </div><br>

        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-book" aria-hidden="true"></i></span>
                    <input class="form-control" type="text"  name="school" id="SchoolName" placeholder="School" required>
        </div></br>

        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-user" aria-hidden="true"></i></span>
                    <input class="form-control" type="text" name="username" id="Username" placeholder="Username" required>
        </div></br>

        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-lock" aria-hidden="true"></i></span>
                    <input class="form-control" type="password"  name="pass" data-minlenght= "6" id="Pass" placeholder="Password" required> 
        </div><div class="help-block">Minimum of 6 characters</div></br></br>

        <div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-lock" aria-hidden="true"></i></span>
                    <input class="form-control" type="password" id="inputPasswordConfirm" data-match="#inputPassword"
                           data-match-error="Whoops, these don't match" placeholder="Confirm" required>
        </div></br>

        <div class="form-group">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary" id="register" name="register">Sing Up</button>
        </div>

        </form>

那么你应该使用准备好的语句将数据保存在你的数据库中,即使你在本地主机上工作,也不要在数据库中存储纯文本密码事实上永远不要存储密码,只需使用 @ 存储密码的哈希值987654327@和password_verify()

if(isset($_POST['register'])){


    //validate these
    $fname = ($_POST['fname']);  
    $lname = ($_POST['lname']);
    $dob = ($_POST['dob']);
    $school = ($_POST['school']);
    $username = ($_POST['username']);
    $pass = ($_POST['pass']);

    $hash = Password_hash($pass,PASSWORD_DEFAULT); //hash password

    $query = $conn->prepare("INSERT INTO users (FirstName,LastName,dob,SchoolName,Username,Pass) VALUES(?,?,?,?,?,?)");
    $query->bind_param("ssssss",$fname,$lname,$dob,$school,$username,$hash);

    if($query->execute()){

        echo "data inserted success";
    }
}
?>

注意:如果我们要插入来自外部来源的任何数据(如用户输入),对数据进行清理和处理非常重要 验证。

然后password_verify(); 将在您的登录页面上运行,它基本上将用户输入的密码与存储在数据库中的哈希值进行比较。

有关password_hash()password_verify(); 的更多信息,请查看手册:

http://php.net/manual/en/function.password-hash.php

http://php.net/manual/en/function.password-verify.php

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php 准备好的语句。

【讨论】:

  • 很好的答案,但是如果不使用password_verify() 并且如果他们的密码列足够长以容纳散列,那么您会将它们留在一个洞中。这是因为他们使用的是 PHP 5.5+,否则他们会失败。
  • 以比我自己更好的方式回答,所以不需要我的 :) 干得好!
  • @Option 我不明白你为什么删除你的答案。
  • @Fred -ii- 我看到这个答案比我自己的好,因此我的答案毫无意义。不过我会恢复它。
  • @MasivuyeCokile 对。但是,您使用 “你只错过了准备好的语句部分” 对选项进行了 ping 操作 - 尽管添加准备好的声明以帮助他们保护更好,但说他们“错过”恕我直言重写不是强制性的,我发布了关于这个的元数据关于这个meta.stackoverflow.com/q/344703/1415724 - 注意:你将无法看到一些问题的链接,因为它们已被删除。只有 10k+ 会员可以。
【解决方案2】:

所以让我们稍微澄清一下..

首先,您的查询顺序完全不正确(注意:FirstName,LastName,dob)这意味着前 3 个值应该是 $fname,$lname,$dob,但由于某种原因您已添加到 $username..

注意:您添加了不存在的变量,例如 $FirstName,而实际分配的变量实际上是:$fname

您的查询(记下最后一个变量$Pass,),因为这是您不加逗号的最后一个变量条目看看:

$query = "INSERT INTO users (FirstName,LastName,dob,SchoolName,Username,Pass)VALUES('$FirstName','$LastName','$Username','$dob', '$SchoolName','$Pass',)";

应该是:

$query = "INSERT INTO users (`FirstName`,`LastName`,`dob`,`SchoolName`,`Username`,`Pass`)VALUES('$fname','$lname','$dob','$school','$username','$pass')";

更好您可以绑定参数以防止 SQL 注入,如下所示:

$query = "INSERT INTO users (`FirstName`,`LastName`,`dob`,`SchoolName`,`Username`,`Pass`)VALUES(?,?,?,?,?,?)";
$query->bind_param("ssssss", $fname, $lname, $dob, $school, $username, $pass);

接下来..

你打电话给if(isset($_POST['register'])){

然而你的&lt;button type="submit" class="btn btn-primary" id="register"&gt;Sing Up&lt;/button&gt; 没有name="register"&gt;

因此应该是:&lt;button type="submit" class="btn btn-primary" id="register" name="register"&gt;Sing Up&lt;/button&gt;

此外,您永远不应该将密码以纯文本形式保存到数据库中。您应该运行 password_hash($pass, PASSWORD_DEFAULT); 这将加密提交到数据库的密码 - 在这样做之前,我建议您阅读文档。

【讨论】:

  • 不只是使用password_hash()那么简单,文档一定要仔细阅读。保存散列的表列必须足够大以保存散列。这是许多用户第一次使用 PHP 的密码功能时绊倒的一件事。
  • @Jay - 当然,我完全同意,这就是为什么我没有深入研究它,以便 Op 会根据使用它阅读文档。
  • 希望如此! ¯\_(ツ)_/¯
  • 指导意图是有的。我也希望他们会为了安全起见对其进行研究:-)
【解决方案3】:

改变

  <button type="submit" class="btn btn-primary" id="register">Sing Up</button>

  <button type="submit" class="btn btn-primary" id="register" name="register">Sing Up</button>

此外,对于所有其他 $_POST 变量,您需要使用 name 字段而不是 id 字段。

您的 SQL 查询也有一个杂散的逗号。改成

  $query = "INSERT INTO users (FirstName,LastName,dob,SchoolName,Username,Pass)VALUES('$FirstName','$LastName','$Username','$dob', '$SchoolName','$Pass')";

【讨论】:

  • 别忘了变量,错误的名字。
  • 变量完全错误,这不能解决操作问题,只是其中之一。
  • 是的,我在回答中提到了这个问题...
  • 你们太棒了……我是个犯错的高手。
【解决方案4】:

您似乎没有将$_POST['register'] 发送到您的register.php,因此if (isset($_POST['register'])) 将评估为false,绝对不会发生任何事情。 其他字段也是如此,如果您为输入字段提供name 属性,您将只有在$_POST 中有值。

【讨论】:

  • 这只是众多错误之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2014-04-07
  • 2014-01-25
  • 2022-11-26
  • 2013-05-16
  • 2013-01-04
  • 1970-01-01
相关资源
最近更新 更多