PHP表单不会将值插入DB

时间:2014-12-03 19:02:51

标签: php mysql

我遇到了一个我创建的表单的问题(仅限测试目的,我知道它易受SQL注入攻击)

基本上,表单不会插入到DB中,但它似乎在脚本上返回true。

代码如下:

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>";    
        }       
     }   


  ?>

我收到了成功消息,但正如我所说,这些值不会插入到数据库中。

任何帮助都会很好。

5 个答案:

答案 0 :(得分:6)

这定义了一个查询,但 NOT 运行它:

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

这不是&#34;测试&#34;为了成功。它只是将变量视为真:

    if($registerquery = true)

=是赋值,==用于等式测试。

答案 1 :(得分: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

答案 2 :(得分:1)

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

$mysqli->query($registerquery);

必须在插入之前运行。

您还可以将if语句更改为以下

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

此外,您目前正在使用单=,即设置$registerquery而非检查其值。

答案 3 :(得分:1)

你在这里做的一切:

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

正在设置字符串,然后将字符串设置为true。这总是会回归真实。这有两个问题:

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

此外,您可能不应再使用mysqli内置函数,因为它们很快就会被弃用。我建议在继续前进之前切换到PDO

答案 4 :(得分: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)){
....
}

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

问候.-