我知道之前已经讨论过,但我正在寻找一种稍微简单的方法。我有一个非常简单的文件,我在其中创建一个数据库连接(PDO)。它看起来像这样:
$databaseDSN = 'mysql:host='.databaseHost.';dbname='.databaseData.';charset='.databaseChar.'';
$databaseOpt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_PERSISTENT => true,
];
$PDO = new PDO($databaseDSN, databaseUser, databasePass, $databaseOpt);
这是我的网络应用程序中唯一的连接,因此,我希望能够使用我创建的对象作为它的标识符。它给了我一些问题。例如,我有一个用户类,我有login,logout和auth等方法(验证是否已登录)。我需要在这些方法中非常简单地访问我的$ PDO var,但似乎没有任何效果。我可以在不将变量传递给我的班级的情况下简化事情吗?正如我所提到的那样,var / connection永远不会改变,我发现每次连接都没有必要将它作为参数传递。这是我班级的一部分:
class User {
public static function login() {
$query = $PDO->prepare("SELECT * FROM users WHERE username=?");
$query->execute([$_POST['username']]);
$result = $query->fetch();
if($result && password_verify($_POST['password'], $result['password'])) {
$_SESSION['username'] = $_POST['username'];
$_SESSION['language'] = $result['language'];
$_SESSION['template'] = $result['template'];
$_SESSION['loggedin'] = true;
$_SESSION['uniqueid'] = md5(uniqid(uniqidPrefix), true);
$query = $PDO->prepare("INSERT INTO sessions (username, uniqueid, authtime, ipaddress) VALUES (?, ?, ?, ?)");
$query->execute([$_POST['username'], $_SESSION['uniqueid'], date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR']]);
Log::write('info', 'User '.$_SESSION['username'].': succesful login!');
header('Location: index.php');
} else {
Log::write('error', 'Invalid credentials: '.$_SESSION['username']);
header('Location: index.php?logout');
}
}
有什么方法可以让我的班级中的$ PDO变量在临时基础上运行?我试过这个,但它没有用:
class User {
private $PDO;
public function __construct() {
global $PDO;
$this->PDO = $PDO;
}
有什么想法吗?
谢谢!