Php mysql函数中未定义pdo变量

Php mysql函数中未定义pdo变量,php,mysql,variables,pdo,visibility,Php,Mysql,Variables,Pdo,Visibility,我有一个index.php,类似于: require_once("../resources/config.php"); require_once(LIBRARY_PATH . "/mysql.php"); ... if(checkIfMailExists($email)) { $error = true; $errormsg = "This e-mail is already in use!"; } php是: try { $pdo = new PDO('mysql:h

我有一个index.php,类似于:

require_once("../resources/config.php");
require_once(LIBRARY_PATH . "/mysql.php");
...
if(checkIfMailExists($email)) {
    $error = true;
    $errormsg = "This e-mail is already in use!";
}
php是:

try {
    $pdo = new PDO('mysql:host=' . $config['db']['db1']['host'] . ';dbname=' . $config['db']['db1']['dbname'], $config['db']['db1']['username'], $config['db']['db1']['password']);
}catch(PDOException $e){
    echo "Cant connect to mysql DB!";
}

function checkIfMailExists($email)  {
    $query = "SELECT * FROM users WHERE email = '".$email."'";
    $num = $pdo->query($query);
    if($num->rowCount() > 0){
        return true;
    }else{
        return false;
    }
}
看起来,函数中的$pdo是未定义的。即使我取下,也要试着接住。
我修复它的唯一方法是将$pdo作为参数发送到函数,但它似乎是错误的。有什么建议吗?

PHP允许您在函数中创建局部变量,而无需进行任何声明。只要开始使用一个变量,就假定它是一个局部变量

这意味着如果要访问函数中的全局变量,必须显式声明它:

function checkIfMailExists($email)  {
    global $pdo;
    . . .

将PDO连接作为参数发送实际上是唯一明智的方法。知道您可以使用
global
关键字确实是件好事,但是编写可以维护的代码的最佳方法是明确地声明依赖项,并且


阅读更多关于PDO和准备好的声明。请注意,我是如何利用命名参数来确保此代码不允许sql注入的。

。或者更好的做法是,不要使用全局参数,而是将其作为参数传递给函数。@Qirel,是的,我同意这一点。我只是想回答OP的问题。了解变量作用域在PHP中的工作原理是值得的。
function mailExists (PDO $pdo, $email)  {
    $sql = 'SELECT * FROM users WHERE email = :email';
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':email', $email, PDO::PARAM_STR);
    $stmt->execute();
    return $stmt->rowCount() > 0;
}
if (mailExists($pdo, $email) {}