繁体   English   中英

PHP表单未将值插入数据库

[英]PHP form not inserting values into DB

我创建的表单存在问题(仅出于测试目的,我知道它很容易受到SQL注入的攻击)

基本上,表单不会插入数据库,但似乎在脚本上返回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>";    
        }       
     }   


  ?>

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

任何帮助都会很好。

这定义查询,但运行它:

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

这不是成功的“测试”。 只是看到变量为true:

    if($registerquery = true)

=是分配, ==用于相等性测试。

您必须查询数据库。 尝试这个:

$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

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

$mysqli->query($registerquery);

必须先运行,然后才能插入。

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

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

另外,您当前使用的是单个= ,它设置了$registerquery而不是检查其值。

您在这里所做的一切:

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

先设置一个字符串,然后再将该字符串设置为true。 这总是会返回true。 这有两个问题:

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

另外,您可能不再应该使用mysqli内置函数,因为它们很快就会被弃用。 我建议在进一步进行操作之前切换到PDO

正式地,您应该执行以下操作:

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)){
....
}

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

问候。-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM