Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP登录页面错误,共11个错误_Php_Mariadb_Wamp - Fatal编程技术网

PHP登录页面错误,共11个错误

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,结果发现11个错误

PHP代码

<?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您正在使用的代码是什么?如果您复制/粘贴了带有密码验证的部件,而没有将数据库中的密码替换为哈希版本,那么它当然不会工作。