2017-03-09 64 views
-2

我一直在尝试调试这个多年,现在不明白为什么它没有发送数据到我的数据库。此外,作为一种指示,我使用Boostrap,这种形式是模式内的。请有人能帮助我。我将包括我的snipet以及php代码。使用PHP的Boostrap表单,MySQL不向数据库发送数据

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); 
} 
?> 
+0

代码在做什么?它以什么方式失败?当你检查你的PHP错误日志时会发生什么?当你检查'mysqli_error()'? – David

+0

再次检查你的SQL >>'$ Pass',)“;删除逗号 –

+0

,因为'LastName'是未定义的 –

回答

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')"; 

更好还是你可以绑定params来防止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'])){

然而,你<button type="submit" class="btn btn-primary" id="register">Sing Up</button>没有name="register">

因此它应该是:<button type="submit" class="btn btn-primary" id="register" name="register">Sing Up</button>

而且,你永远不应该保存密码为纯文本的数据库。您应该运行password_hash($pass, PASSWORD_DEFAULT);这将加密提交给数据库的密码 - 在此之前,我建议您阅读文档。

+1

这不仅仅像使用'password_hash()'一样简单,文档必须仔细阅读。保存散列的表格列必须足够大以容纳散列。第一次使用PHP的密码功能时,这是让许多用户绊倒的一件事。 –

+0

@Jay - 当然我完全同意,这就是为什么我没有深入研究它,以便操作系统能够通过基于使用它的文档来阅读。 – Option

+0

希望! ¯\\ _(ツ)_ /¯ –

-1

看来你没有送$_POST['register']register.php,所以if (isset($_POST['register']))将评估为假,绝对什么都不会发生。 其他字段也是如此,如果您将输入字段设置为name属性,则只有$_POST中的值才有效。

+4

这只是众多错误中的一个。 –

0

变化

<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> 

此外,你需要使用name领域,而不是id领域的所有其他$ _ POST变量。

你的SQL查询也有一个流浪的逗号。将其更改为

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

不要忘记变量,错误的名字。 –

+0

变量是完全错误的,这不会解决操作问题,只是其中之一。 – Option

+0

是的,我在我的答案中引用了这个问题... –

3

所有的$ _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> 

那么你应该使用预处理语句将数据保存在你的数据库,即使你在本地主机上的工作,也不要在数据库中存储INFACT永远不存储密码明文密码,使用password_hash()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"; 
    } 
} 
?> 

记下密码只存储散列值:如果我们想插入外部酸味任何数据ces(如用户输入),对数据进行消毒和验证非常重要。

然后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准备语句。

+2

好的答案,但是你将他们放在一个洞里而不使用'password_verify()',如果他们的密码列足够长举行哈希。这是因为他们使用PHP 5.5+,否则会使他们失败。 –

+0

以比我自己更好的方式回答,所以不需要我的:)好工作! – Option

+0

@Option我不明白你为什么删除了你的答案。 –