PHP登录页面错误,共11个错误
我尝试使用登录PHP,结果发现11个错误 PHP代码PHP登录页面错误,共11个错误,php,mariadb,wamp,Php,Mariadb,Wamp,我尝试使用登录PHP,结果发现11个错误 PHP代码 <?php $link = mysqli_connect("localhost", "root", "", "login"); $username = isset($_POST['username']) ? $_POST['username'] : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; // To prevent mysql inje
<?php
$link = mysqli_connect("localhost", "root", "", "login");
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
// To prevent mysql injection
$username = mysqli_real_escape_string($con, $username);
$password = mysqli_real_escape_string($con, $password);
// Query the database for user
$sql = "select * from users where username = ? and password = ?";
mysqli_stmt_bind_param($stmt, 'ss', $username, $password);
$result = mysqli_query($con,$sql) or die('Failed to query
database'.mysqli_error($con));
$row = mysqli_fetch_array($result);
if ( $row['username'] == $username && $row['password'] == $password ){
echo "login success! Welcome".$row['username'];
} else {
echo "Failed to login!";
您正在混合和匹配大量范例,并且还有未定义的变量。
如果要使用准备好的语句(是的,您应该这样做),则需要使用以这种方式查询数据库所需的方法
首先,在您的屏幕截图中,我看到MariaDB正在端口3307上运行,但您没有在脚本中指定。鉴于MariaDB的默认端口是3306,它理应失败。将其更改为以下内容:
$link = mysqli_connect("127.0.0.1:3307", "root", "", "login");
if ( !$link )
throw new Exception( "Failed to connect; error: ${mysqli_connect_error()}");
不用说,您不应该使用没有密码的根帐户
在此之后,您应该确保您实际传入了正确的变量。因此,您使用的不是$con,而是$link
现在,您不需要转义用户名和密码,因为在准备/执行过程中已经进行了转义。因此,摆脱以下两行:
$username = mysqli_real_escape_string($link, $username);
$password = mysqli_real_escape_string($link, $password);
相反,您应该做的是,在创建用户时,您应该使用password\u hash
对密码进行散列,在登录时,使用password\u verify
比较输入的密码和散列的DB记录
无论如何,现在您需要准备语句、绑定参数、执行语句并获得结果:
// check if the query is valid and prepare it
$sql = "select username, password from users where username = ? and password = ?";
$stmt = mysqli_prepare( $link, $sql );
if ( !$stmt )
throw new Exception( 'Failed to prepare statement: ' . mysqli_error($link) );
mysqli_stmt_bind_param($stmt, 'ss', $username, $password);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result( $stmt );
最后,获取数据:
if ( !( $row = mysqli_fetch_array( $result, MYSQLI_ASSOC ) ) )
// tell the user that the input data is invalid
die( 'Failed to login' );
// query was successful
echo "Login success! Welcome ".$row['username'];
正如我所说,实际上,您将在数据库中存储哈希密码,在WHERE子句中查询数据库中仅包含用户名、电子邮件或任何内容的列,然后将数据库中的密码与用户提供的密码进行比较。类似于此:
$sql = "select username, password from users where username = ?";
...
mysqli_stmt_bind_param($stmt, 's', $username);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result( $stmt );
if ( !( $row = mysqli_fetch_array( $result ) ) )
// username doesn't exist
if ( !password_verify( $password, $row['password'] ) )
die( 'Failed to login' );
// query was successful
echo "Login success! Welcome ".$row['username'];
最后一点注意:你真的应该切换到PDO,因为它比mysqli更现代、更健壮,语法也更清晰。我提供了我能找到的信息。你创建数据库登录
?是的,我确实让dbI添加了一张我制作的db的图片。我尝试了你说的,现在我没有收到任何错误,只是登录失败了,我正在使用我在数据库中设置的un和pw您正在使用的代码是什么?如果您复制/粘贴了带有密码验证的部件,而没有将数据库中的密码替换为哈希版本,那么它当然不会工作。