別の非推奨の問題を回避するために、クラスを使用してデータベースに接続し、そのクラスがデータベース ハンドルを返すようにして、使いやすくしたいと考えています。
もう少し具体的に言うと、次の目的でクラスが必要です。
- すぐにデータベースに接続します。
- 状況に応じて、管理者または読み取り専用アクセスとして接続します。
- このクラスを使用して $db を $dbh にする
- したがって、$db はオープン PDO 接続 (データベース ハンドル) になり、$db->query などを実行できるようになります。したがって、'return $this->dbh;'
私はこのアプローチを試みましたが、何かがうまくいきません:
<?php
class database {
private $dbh;
public function __construct($type=null) {
switch ($type) {
case 0:
self::ro();
break;
case 1:
self::admin();
break;
default:
self::ro();
break;
}
return $this->dbh;
}
private function ro() {
try {
# MySQL with PDO_MYSQL (Read-only access)
$dbhost = 'localhost';
$dbname = 'dbname';
$dbuser = 'dbuser';
$dbpass = 'dbpass';
$this->dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
private function admin() {
try {
# MySQL with PDO_MYSQL
$dbhost = 'localhost ';
$dbname = 'dbname';
$dbuser = 'dbadminuser';
$dbpass = 'dbadminpass';
$this->dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
}
$db = new database();
//test connection
$attributes = array(
"AUTOCOMMIT", "ERRMODE", "CASE", "CLIENT_VERSION", "CONNECTION_STATUS",
"ORACLE_NULLS", "PERSISTENT", "PREFETCH", "SERVER_INFO", "SERVER_VERSION",
"TIMEOUT"
);
foreach ($attributes as $val) {
echo "PDO::ATTR_$val: ";
echo $db->getAttribute(constant("PDO::ATTR_$val")) . "<br>\n";
}
次のエラーが表示されます。
致命的なエラー: 未定義のメソッド database::getAttribute() への呼び出し...