2014-12-03 52 views
0

我在与我创建(仅用于测试目的,我知道这是容易受到SQL注入)一个形式的问题PHP的形式不插入值到数据库

基本上,形式不插入到数据库,但它似乎在剧本上回归真实。

的代码如下:

form.php的

<form action="create.php" method="post"> 
     <p>Username: <input type="text" name="username" /> 
     </p> 
     <p>Password: <input type="password" name="password" /> 
     </p> 
     <p><input type="submit" value="Create" name= "cre" /> 
     </p> 
    </form> 

create.php

<?php 
session_start(); 
$dbname = "obsidian"; 

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


    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $mysqli = new mysqli('localhost','admin1', 'password1','obsidian') or die('Failed to connect to DB' . $mysqli->error); 

    $hashed_password = password_hash($password,PASSWORD_DEFAULT); 

     $registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
     if($registerquery = true) 
     { 
      echo "<h1>Success</h1>"; 
      echo "<p>Your account was successfully created. Please <a href=\"index.php\">click here to login</a>.</p>"; 
     } 
     else 
     { 
      echo "<h1>Error</h1>"; 
      echo "<p>Sorry, your registration failed. Please go back and try again.</p>";  
     }  
    } 


    ?> 

我得到了成功的消息,但正如我所说,价值没有得到插入到数据库中。

任何帮助都会很好。

+2

永远不会在数据库上运行插入查询。 – Pitchinnate 2014-12-03 19:04:45

+4

...你很容易受到[sql注入攻击](http://bobby-tables.com) – 2014-12-03 19:06:20

+0

你有没有区别=和==? – bksi 2014-12-03 19:07:48

回答

6

这定义了查询,但确实运行:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 

的这个是不是 “试验” 成功。它只是看到变量设置为true:

if($registerquery = true) 

=是分配,==是平等的测试。

+0

是的,它仍然需要'prepare()','bind_param()'和'execute()'调用。 – tadman 2014-12-03 19:14:48

1

您错过了将SQL查询实际交给数据库的步骤。

$mysqli->query($registerquery); 

必须在它被插入之前运行。

你也可以改变你的if语句下面

if ($mysqli->query($registerquery)) 

此外,您目前正在使用一个单一的=,这是设置$registerquery,而不是检查它的价值。

1

所有你正在做的事情:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
if($registerquery = true) 

树立了一个字符串,然后再串设置为true。这总是会回到真实的。有两个问题:

  • 您需要执行存储在字符串中的SQL语句,以便在数据库中发生任何事情。
  • 你并没有真正检查返回值(“==”),而是使用“=”,它只是简单地设置变量。一个非常常见的错误。

此外,您应该不再使用内置函数中的mysqli,因为它们很快就会被弃用。我建议在进一步移动之前切换到PDO

+0

他实际上没有检查它 – ofrommel 2014-12-03 19:07:37

+0

正确指出并编辑。最重要的一点仍然是,他没有执行任何SQL语句。不确定这是否值得倒戈。 – 2014-12-03 19:10:34

+0

我没有downvote。不知道是谁做的,但我的回答也被低估了,所以我删除了它,因为周围显然有太多愚蠢的人。 – ofrommel 2014-12-03 19:11:24

3

你必须查询该数据库。试试这个:

$registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 

if ($mysqli->query($registerquery)) 
{ 
    // success. 
} 
else 
{ 
    // failed. 
} 

下面是文档:http://php.net/manual/en/mysqli.query.php

1

形式上,你应该做这样的事情:

if(isset($_POST['cre'])){ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $mysqli = new mysqli('localhost','admin1', 'password1','obsidian') or die('Failed to connect to DB' . $mysqli->error); 

    $hashed_password = password_hash($password,PASSWORD_DEFAULT); 

    $registerquery = "INSERT INTO users (username, hash) VALUES('$username', '$hashed_password')"; 
    $stmt=$mysqli->prepare($registerquery); 
    if($stmt->execute()) 
    { 
     echo "<h1>Success</h1>"; 
     echo "<p>Your account was successfully created. Please <a href=\"index.php\">click here to login</a>.</p>"; 
    } 
    else 
    { 
     echo "<h1>Error</h1>"; 
     echo "<p>Sorry, your registration failed. Please go back and try again.</p>";  
    }  
    $stmt->close(); 
} 

此外,您可以只调用mysqli_query

if($mysqli->query($registerquery)){ 
.... 
} 

这将是足够的。如果需要绑定参数并使用不同的值对同一查询进行多次调用,则第一个调用会更好。

Regards.-