我试图在我的网站上创建一个允许用户登录的用户管理部分。
到目前为止,我有以下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程序员,所以如果这看起来模糊,请道歉,任何帮助将不胜感激
答案 0 :(得分:0)
这可能是一个问题 $ user_id = user_id_from_username($ db,$ username); 由于我们不知道该函数(user_id_from_username)正在做什么,因此可能是 return $ user_id; 只是返回NULL或空字符串。
答案 1 :(得分:0)
首先,您必须实例化要启动的连接的类。请在包含后放置。
$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;
}
}
然后你必须实际用数据库对象user调用该函数并传递:
login($connection, 'USERNAME STRING', 'PASSWORD STRING');
$ connection是先前声明的对象变量,所有大写字符串应该是用户和pass的实际字符串。我不能在环境中测试这段代码,所以我不能保证这个开箱即用,但它至少会让你指向正确的方向。此外,在处理表单提交的数据和SQL查询时,您需要采取一些预防措施。取一些precautions to avoid SQL injection。