私がしばらく取り組んできた小さなpdoの問題があります。ここで何が問題なのかわからないので、このリストに入れることを考えました。詳しい方もいらっしゃるかも…
ユーザーとパスワードをmysql駆動のデータベースと照合するログインを備えたWebサイトがあります。pdo 接続が同じファイルで行われると、すべて正常に動作し、問題なくログインできます。それが機能するはずのように...
ただし、データベース接続部分を別のファイルから含める別の関数に移動すると、pdo が失敗し、次のようになります。
SQLSTATE[28000] [1045] ユーザー '...'@'...' のアクセスが拒否されました (パスワードを使用: NO) 致命的なエラー: /.../ の非オブジェクトに対するメンバー関数 prepare() の呼び出し.../... 41 行目
わかりやすくするために、コードを次に示します。
バージョン 1:
これは機能します:
<?php
require "./vars_and_functions.php";
/* open database connection */
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
/* query */
$query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?";
$q = $pdo->prepare($query);
$q->execute(array($u_name, $p_word_md5));
$result = $q->rowCount();
if($result == 1) { /* we have a match */
/* close the database connection */
$pdo = null;
/* and redirect */
header("...");
} /* if */
else { /* wrong credentials */
/* close the database connection */
$pdo = null;
/* and go back to the login page */
header("...");
} /* else */
} /* try */
catch(PDOException $e) {
echo $e->getMessage();
} /* catch */
?>
バージョン2はこちら
これは動作しません:
<?php
require "./vars_and_functions.php";
/* open database connection */
$pdo = database_connection();
/* query */
$query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?";
$q = $pdo->prepare($query);
$q->execute(array($u_name, $p_word_md5));
$result = $q->rowCount();
if($result == 1) { /* we have a match */
/* close the database connection */
$pdo = null;
/* and redirect */
header("...");
} /* if */
else { /* wrong credentials */
/* close the database connection */
$pdo = null;
/* and go back to the login page */
header("...");
} /* else */
} /* try */
catch(PDOException $e) {
echo $e->getMessage();
} /* catch */
?>
私のインクルードファイル vars_and_functions.php は次のようになります:
$db_host = "...";
$db_name = "...";
$db_user = "...";
$db_pass = "...";
function database_connection() {
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
}
catch(PDOException $e) {
echo $e->getMessage();
}
return $pdo;
}
私が思う唯一の違いは、ここでは pdo 接続が関数呼び出しによって行われているのに対し、関数はインクルード ファイル vars_and_functions.php にあるということです。
ここで何が問題なのですか?