gpt4 book ai didi

php/pdo/mysql - 访问被拒绝

转载 作者:可可西里 更新时间:2023-11-01 06:49:02 25 4
gpt4 key购买 nike

有一个小 pdo 问题,我已经研究了一段时间了。因为我不知道这里出了什么问题,所以我想把它放到这个列表中。也许你们中的一些人知道更多...

我有一个带有登录名的网站,用于根据 mysql 驱动的数据库检查用户和密码。当在同一个文件中建立 pdo 连接时,一切正常,可以登录,没有任何问题。就像它应该工作的那样......

然而,当将数据库连接部分移动到一个单独的函数时,我从另一个文件中包含它,pdo 对我失败,并给我:

SQLSTATE[28000] [1045] Access denied for user '...'@'...' (using password: NO) Fatal error: Call to a member function prepare() on a non-object in /.../.../... on line 41

为了清楚起见,这里是代码:

版本 1:

这个有效:

<?php
require "./vars_and_functions.php";

/* open database connection */
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);

/* query */
$query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?";
$q = $pdo->prepare($query);
$q->execute(array($u_name, $p_word_md5));
$result = $q->rowCount();

if($result == 1) { /* we have a match */
/* close the database connection */
$pdo = null;

/* and redirect */
header("...");

} /* if */
else { /* wrong credentials */
/* close the database connection */
$pdo = null;

/* and go back to the login page */
header("...");
} /* else */
} /* try */
catch(PDOException $e) {
echo $e->getMessage();
} /* catch */
?>

这是版本 2

这不起作用:

<?php
require "./vars_and_functions.php";

/* open database connection */
$pdo = database_connection();



/* query */
$query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?";
$q = $pdo->prepare($query);
$q->execute(array($u_name, $p_word_md5));
$result = $q->rowCount();

if($result == 1) { /* we have a match */
/* close the database connection */
$pdo = null;

/* and redirect */
header("...");

} /* if */
else { /* wrong credentials */
/* close the database connection */
$pdo = null;

/* and go back to the login page */
header("...");
} /* else */
} /* try */
catch(PDOException $e) {
echo $e->getMessage();
} /* catch */
?>

我的包含文件 vars_and_functions.php 如下所示:

$db_host = "...";       
$db_name = "...";
$db_user = "...";
$db_pass = "...";

function database_connection() {
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
}
catch(PDOException $e) {
echo $e->getMessage();
}

return $pdo;
}

在我看来唯一真正的区别是,这里的 pdo 连接是通过函数调用建立的,而该函数位于包含文件 vars_and_functions.php 中。

这里有什么问题吗?

最佳答案

您的函数 database_connection() 没有在正确的范围内接收连接变量,因此在尝试连接时没有设置它们,因此作为 NULL 传递, PDO 默认连接主机为 localhost

将它们作为参数传递给函数:

// Defined at global scope...
$db_host = "...";
$db_name = "...";
$db_user = "...";
$db_pass = "...";

// Pass the 4 variables as parameters to the function, since they were defined at global
// scope.
function database_connection($db_host, $db_name, $db_user, $db_pass) {
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
}

// Called as:
$pdo = database_connection($db_host, $db_name, $db_user, $db_pass);

如果您在连接函数中使用这些变量并且在其他地方不需要它们,请考虑在函数范围内定义它们,这样可以避免将它们作为参数传递。

function database_connection() {
// Only needed here, so define in function scope
$db_host = "...";
$db_name = "...";
$db_user = "...";
$db_pass = "...";

try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
}

最后也是最不理想的选择是像您所做的那样在全局范围内定义变量,但通过 $GLOBALS[](或 global 关键字访问它们) 在函数中:

function database_connection() {
try {
$pdo = new PDO("mysql:host={$GLOBALS['db_host']};dbname={$GLOBALS['db_name']}", $GLOBALS['db_user'], $GLOBALS['db_pass']);
}

请注意,如果您在开发时打开了 error_reporting 并按原样打开了 display_errors,您会看到有关 undefined variable 的通知。

error_reporting(E_ALL);
ini_set('display_errors', 1);

关于php/pdo/mysql - 访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13256237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com