pdo 变量在 mysql 函数中未定义

Posted

技术标签:

【中文标题】pdo 变量在 mysql 函数中未定义【英文标题】:pdo variable is undefined in mysql function 【发布时间】:2017-08-21 22:23:31 【问题描述】:

我有一个 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 作为参数发送给函数,但这似乎是错误的。有什么建议吗?

【问题讨论】:

Scope scope scope. 【参考方案1】:

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

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

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

【讨论】:

或者更好的是,不要使用全局,而是将其作为参数传递给函数。 @Qirel,是的,我同意这一点。我只是想回答OP的问题。了解变量作用域在 PHP 中的工作原理是值得的。【参考方案2】:

将 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 注入的。

【讨论】:

以上是关于pdo 变量在 mysql 函数中未定义的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:未捕获的错误:调用 C:\xampp\htdocs\ 中未定义的函数 mysql_connect()

致命错误:未捕获的错误:调用 /homepages/ 中未定义的函数 mysql_pconnect() [重复]

MATLAB R2015a 中未定义的函数或变量“fplot3”

错误:未定义的类常量'MYSQL_ATTR_USE_BUFFERED_QUERY'

未定义函数或变量 'O'。怎么解决

为什么在构造函数中初始化的成员变量会在离子角的ngInit中未定义?