0

我有一个 db.php 文件,其中包含以下内容:

// db.php file
// creates connection to database

// DATABASE CONNECTION FUNCTION
function sql_con(){
    try{
        $dbh = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS,
            array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    } catch (PDOException $e) {
        // log error to file and display friendly error to user
        ExceptionErrorHandler($e);
        exit;
    }
}

我有一个注册页面,我想检查用户名是否已经存在,所以我sql_con();事先调用我的函数来连接到数据库,然后执行以下查询

    // connect to database
    sql_con();

    $stmt = $dbh->prepare("SELECT `user_login` FROM `users` WHERE `user_login` = ? LIMIT 1");
    $stmt->execute(array($username));

    if ( $stmt->rowCount() > 0 ) {
        $error[] = 'Username already taken';
    }

我对 PDO 很陌生,上面我收到以下错误:

注意:未定义变量:第 64 行 C:\wamp\www\signup.php 中的 dbh

致命错误:在第 64 行调用 C:\wamp\www\signup.php 中非对象的成员函数 prepare()

可能是非常愚蠢的事情,当我处于初学者阶段时,我似乎将自己与 PDO 混淆了。谁能告诉我我做错了什么?另外我不确定这是否是正确的方法,因为我是 PDO 的新手,所以如果有更有效的方法来进行用户名查询检查,请告诉我。

4

3 回答 3

3

这是因为由于范围,$dbh对象被限制在try catch块和你的sql_con()函数内部。

正确的解决方案是删除try catch,并在函数末尾返回$dbhsql_con()变量。

然后:

try {
    $dbh = sql_con();

    $stmt = $dbh->prepare("SELECT `user_login` FROM `users` WHERE `user_login` = ? LIMIT 1");
    $stmt->execute(array($username));

    if ( $stmt->rowCount() > 0 ) {
        $error[] = 'Username already taken';
    }
}
catch (PDOException $e) {

    //Do stuff with $e

}
于 2012-04-13T21:29:15.803 回答
2

$dbh一旦函数执行完毕,变量就会被销毁。

您可以尝试返回句柄:

function sql_con() {

    // your connection code

    return $dbh;

}

然后在您的注册页面中:

$dbh = sql_con();

根据您的需要,更好的选择是使用DI容器。

于 2012-04-13T21:28:22.313 回答
0

您正在函数中定义 pdo ,但它不可见。

function sql_con(){
    try{
        $dbh = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS,
            array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


        return $dbh; //this 

    } catch (PDOException $e) {
        // log error to file and display friendly error to user
        ExceptionErrorHandler($e);
        exit;
    }
}


 $dbh = sql_con();

如果您为 pdo 抽象创建一个类会更好。

$dbh = DB::getInstance();
于 2012-04-13T21:32:16.147 回答