mysql 函数中未定义 pdo 变量

pdo variable is undefined in mysql function

我有一个 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!";
}

mysql.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 未定义。即使我删除了 try-catch。 我修复它的唯一方法 - 我将 $pdo 作为参数发送给函数,但这似乎是错误的。大家有什么建议吗?

PHP 允许您在函数内创建局部变量而无需声明它们。刚开始使用一个变量,假设是局部变量

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

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

发送 PDO 连接作为参数实际上是唯一明智的方法。知道可以使用 global 关键字确实很好,但是编写可维护代码的最佳方式是明确说明依赖关系,并且 type-hinting 它们

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) {}

阅读 here 关于 PDO 和准备好的语句的更多信息。请注意我是如何利用命名参数来确保无法从该代码进行 sql 注入的。