我遇到了一个我创建的表单的问题(仅限测试目的,我知道它易受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>";
}
}
?>
我收到了成功消息,但正如我所说,这些值不会插入到数据库中。
任何帮助都会很好。
答案 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.
}
答案 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。这总是会回归真实。这有两个问题:
此外,您可能不应再使用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)){
....
}
这就够了。如果您需要绑定参数并使用不同的值对同一查询进行多次调用,则第一次调用会更好。
问候.-