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 catchsql_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 に答える