我是php和sql以及所有其他东西的新手,我在youtube上观看了有关php论坛的教程,想知道为什么在提交表单时此代码不回显“成功”。我还想知道为什么在我提交表单之前,它会回显失败。我已成功连接到数据库。
<!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!"); ?>
这里有些错误。
您正在使用错误的 标识符 作为列中的 标识符 (并用引号引起来):
('id', 'username', 'password', 'email')
删除它们
(id, username, password, email)
或使用反引号
(`id`, `username`, `password`, `email`)
mysql_error() 应该向您抛出一个错误,但这不是因为:
mysql_error()
mysqli_
mysql_
这两个不同的API不会相互混合。
mysqli_专门使用并将您当前的查询更改为:
if($query = mysqli_query($connect, "INSERT...
并更改mysql_error()为mysqli_error($connect)
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注入 。使用 mysqli 预处理语句,或 与准备语句PDO , 他们更安全 。
mysqli
我注意到您可能以纯文本形式存储密码。如果是这种情况,强烈建议不要这样做。
我建议您使用 CRYPT_BLOWFISH 或PHP 5.5的password_hash()函数。对于PHP <5.5,使用password_hash() compatibility pack。
password_hash()
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=""因为您正在同一页面中使用整个代码。
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); } } ?>