我是php和sql以及所有这些东西的新手,我正在关于php的论坛上观看关于youtube的教程,并想知道为什么这段代码没有回应"成功"提交表格时。我也想知道为什么它在我提交表格之前就会回复失败。我已成功连接到数据库。
<!DOCTYPE HTML>
<html>
<head>
<title>Register</title>
</head>
<body>
<form action="register.php" method="POST">
Username: <input type="text" name="username">
<br/>
Password: <input type="password" name="password">
<br/>
Confirm Password: <input type="password" name="confirmPassword">
<br/>
Email: <input type="text" name="email">
<br/>
<input type="submit" name="submit" value="Register"> or <a href="login.php">Log in</a>
</form>
</body>
</html>
<?php
require('connect.php');
$username = $_POST['username'];
$password = $_POST['password'];
$confirmPassword = $_POST['confirmPassword'];
$email = $_POST['email'];
if(isset($_POST["submit"])){
if($query = mysql_query("INSERT INTO users ('id', 'username', 'password', 'email') VALUES('', '".$username."', '".$password."', '".$email."')")){
echo "Success";
}else{
echo "Failure" . mysql_error();
}
}
?>
Connect.php
<?php
$connect = mysqli_connect("localhost", "root", "") or die("Could not connect to server!");
mysqli_select_db($connect, "php_forum") or die("Could not connect to database!");
?>
答案 0 :(得分:4)
这里有一些问题。
您在列中使用了错误的identifiers(并且是引号):
('id', 'username', 'password', 'email')
删除它们
(id, username, password, email)
或使用反引号
(`id`, `username`, `password`, `email`)
mysql_error()
应该给你一个错误,但它不是因为:
mysqli_
混合以进行连接,然后将mysql_
与您的查询混合。这两种不同的API不会相互混合。
独占使用mysqli_
并将您当前的查询更改为:
if($query = mysqli_query($connect, "INSERT...
并将mysql_error()
更改为mysqli_error($connect)
作为该块的重写:
if(isset($_POST["submit"])){
if($query = mysqli_query($connect,"INSERT INTO users ('id', 'username', 'password', 'email') VALUES('', '".$username."', '".$password."', '".$email."')")){
echo "Success";
}else{
echo "Failure" . mysqli_error($connect);
}
}
只是为了测试错误, 按照我上面的概述进行更改,同时按照现在的方式保留列的引号。然后,您将看到MySQL将抛出的错误。然后,您可以执行上面已经概述的操作并删除列名称周围的引号,或者用反引号替换它们。
你看到的教程可能很好地使用了反引号,但可能没有足够的区别来告诉你它们确实是反引号而不是单引号。
但是,您目前的代码向SQL injection开放。使用mysqli
with prepared statements或PDO with prepared statements,它们更安全。
我注意到您可能以纯文本格式存储密码。如果是这种情况,则非常气馁。
我建议您使用CRYPT_BLOWFISH或PHP 5.5的password_hash()
功能。对于PHP&lt; 5.5使用password_hash() compatibility pack
。
此外,而不是:
$connect = mysqli_connect("localhost", "root", "") or die("Could not connect to server!");
mysqli_select_db($connect, "php_forum") or die("Could not connect to database!");
您应该检查错误,就像手册中所述
一样$link = mysqli_connect("myhost","myuser","mypassw","mybd")
or die("Error " . mysqli_error($link));
所以在你的情况下:
$connect = mysqli_connect("localhost", "root", "","php_forum")
or die("Error " . mysqli_error($connect));
修改,我将action="register.php"
更改为action=""
,因为您在同一页面内使用了整个代码。
<!DOCTYPE HTML>
<html>
<head>
<title>Register</title>
</head>
<body>
<form action="" method="POST">
Username: <input type="text" name="username">
<br/>
Password: <input type="password" name="password">
<br/>
Confirm Password: <input type="password" name="confirmPassword">
<br/>
Email: <input type="text" name="email">
<br/>
<input type="submit" name="submit" value="Register"> or <a href="login.php">Log in</a>
</form>
</body>
</html>
<?php
require('connect.php');
$username = $_POST['username'];
$password = $_POST['password'];
$confirmPassword = $_POST['confirmPassword'];
$email = $_POST['email'];
if(isset($_POST["submit"])){
if($query = mysqli_query($connect,"INSERT INTO users (`id`, `username`, `password`, `email`) VALUES ('', '".$username."', '".$password."', '".$email."')")){
echo "Success";
}else{
echo "Failure" . mysqli_error($connect);
}
}
?>
答案 1 :(得分:0)
:它会回显;失败'所以执行这段代码
else{
echo "Failure" . mysql_error();
}
每当$ _POST [“submit”])未设置,并且无论何时打开您的页面都不会设置(即使您从谷歌搜索结果的书签导航到它),或者您在GET中提交FORM时模式