检查PHP MySQL的用户凭据

检查PHP MySQL的用户凭据,php,mysql,pdo,Php,Mysql,Pdo,我试图在我的网站上创建一个允许用户登录的用户管理部分 到目前为止,我有以下PDO Conenction类 <?php class connection{ private $host = 'localhost'; private $dbname = 'dbname'; private $username = 'liam@'; private $password ='Password'; public $con = ''; function __construct(){

我试图在我的网站上创建一个允许用户登录的用户管理部分

到目前为止,我有以下PDO Conenction类

    <?php 

class connection{

private $host = 'localhost';
private $dbname = 'dbname';
private $username = 'liam@';
private $password ='Password';  

public $con = '';

function __construct(){

    $this->connect();   

}

function connect(){

    try{

        $this->con = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username, $this->password);
        $this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);


    }catch(PDOException $e){

        echo 'We\'re sorry but there was an error while trying to connect to the database';
        file_put_contents('connection.errors.txt', $e->getMessage().PHP_EOL,FILE_APPEND);

    }
}   
}

?>

我的check-login.php看起来像

<?php

include 'assets/connection.class.php';


$username=$_POST['username']; 
$password=$_POST['password'];


function login(PDO $db, $username, $password) {
$user_id = user_id_from_username($db, $username);
$password = md5($password);
$stmt = $db->prepare('SELECT COUNT(`user_id`) FROM `users` WHERE `username` = ? AND `password` = ?');
$stmt->bindParam(1, $username);
$stmt->bindParam(2, $password);
$stmt->execute();
if($stmt->fetchColumn() > 0) {
    return $user_id;
} else {
    return false;
    echo 'failed';
}
}
?>


我的问题是我没有从check-login.php得到任何结果?我不是一个php程序员,因此,如果这看起来含糊不清,我深表歉意,任何帮助都将不胜感激。这可能是一个问题 $user\u id=user\u id\u from\u username($db,$username); 由于我们不知道该函数(user\u id\u from\u username)在做什么,可能是 返回$user\u id;
正在返回NULL或空字符串

首先,您必须实例化类以启动连接。把这个放在你的包裹后面

$connection = new connection();
一旦将连接对象设置为变量,就没有理由在函数调用中重新实例化该对象。以下是重构后的代码:

function login($db, $username, $password) {
    $user_id = user_id_from_username($db, $username);
    $password = md5($password);
    $stmt = $db->prepare('SELECT COUNT(`user_id`) FROM `users` WHERE `username` = ? AND `password` = ?');
    $stmt->bindParam(1, $username);
    $stmt->bindParam(2, $password);
    $stmt->execute();
    if($stmt->fetchColumn() > 0) {
        return $user_id;
    } else {
        echo 'failed';
        return false;
    }
}
然后,您必须实际使用数据库对象、用户和pass调用函数:

login($connection, 'USERNAME STRING', 'PASSWORD STRING');

$connection是前面声明的对象变量,all caps字符串应该是用户和pass的实际字符串。我不能在环境中测试这段代码,所以我不能保证这是开箱即用的,但它至少会让你找到正确的方向。此外,在处理表单提交的数据和SQL查询时,您还需要采取一些预防措施。拿一些。

直接在数据库中运行查询,看看它返回了什么。如果不看更多的代码,很难说,可能会有很多漏洞。例如,我看不到您实际在哪里调用登录函数,也看不到您传递给它的参数是在哪里定义的。请检查错误日志中是否存在任何问题,并在execute语句后添加“print_r($stmt->errorInfo());”以获取任何与查询相关的错误。另一个建议是,在if语句中使用$stmt->rowCount(),而不是$stmt->fetchColumn()。