更新: 非推奨のメソッドの代わりに PDO を使用して、コードを現在動作するクラス コードに変更しました
元の質問が回答され、問題が解決されました。Phil は従来の SQL の代わりにPDOを使用して育ったため、このクラスが初期段階にあることを見て、移行プロセスを開始することにしました。
class db
{
private static $connection;
const __DB__HOST__ = __DB__HOST__;
const __DB_USERNAME__ = __DB_USERNAME__;
const __DB_PASSWORD__ = __DB_PASSWORD__;
const __DB_NAME__ = __DB_NAME__;
private static function getConnection() {
if (self::$connection === null) {
$dsn = sprintf("mysql:dbname=".__DB_NAME__.";host=".__DB_HOST__, __DB_USERNAME__, __DB_PASSWORD__,"charset=utf8" );
self::$connection = new PDO($dsn, self::__DB_USERNAME__, self::__DB_PASSWORD__, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
));
}
return self::$connection;
}
//Make the query
private static function dbQuery($sql_string) {
$conn = self::getConnection();
$sth = $conn->prepare($sql_string);
$sth->execute();
return $sth;
}
//Return all results from sqlquery in array
public static function dbDataArray($sql_string){
$data = self::dbQuery($sql_string)->fetchAll();
return $data;
}
public static function Value($sql_string){
$data = self::dbQuery($sql_string)->fetchColumn();
return $data;
}
}
これは、これまでのクラスの進捗状況であり、うまく機能しているようです。すべてのサポートについて Phil に感謝します。
その他の推奨事項は大歓迎です。
再度、感謝します。
元の質問
基本的に、次の構文で使用できるdbアクセスクラスを構築しようとしています
$test = db::dbDataArray("SELECT * FROM fw_settings");
接続が存在しない場合、クラスは接続を作成するため、新しいインスタンスを作成する必要なく、いつでもクラスからメソッドを呼び出すことができます。
これは、単一の関数を持つ構造についてこれまでに得たものです。1 つのクエリ アイテムで動作するステータス クラスを取得できたら、他のすべての関数を追加します。
class db
{
public $connection;
const __DB__HOST__ = __DB__HOST__;
const __DB_USERNAME__ = __DB_USERNAME__;
const __DB_PASSWORD__ = __DB_PASSWORD__;
const __DB_NAME__ = __DB_NAME__;
function __construct() {
if (self::$connection == null){
self::$connection = mysql_connect(__DB_HOST__,__DB_USERNAME__,__DB_PASSWORD__)
or die('Unable to Connect to SQL Host'.__DB_HOST__);
@mysql_select_db(__DB_NAME__)
or die('Unable to Select DB: '.__DB_NAME__);
}
}
//Regular SQL query such as delete, update, etc.
public static function dbQuery($sql_string) {
//Handle the rest of the SQL query here
if (!$sqlResult = mysql_query($sql_string, self::$connection) ){
//Let's output the MySQL error if we have one
die('
<div style="border:1px solid red;color:red;background:yellow;">
<p>'.$sql_string.'</p>
SQL Error:'. mysql_error(self::$connection).'
</div>'
);
}
else {
//Return the sql result
if (strpos($sql_string, "DELETE")){
if (mysql_affected_rows($sqlResult) > 0){
return $sqlResult;
}
else{
return false;
}
}
else{
return $sqlResult;
}
}
}
//Return all results from sqlquery in array
public static function dbDataArray($sql_string){
$data = array();
$dataQuery = self::dbQuery($sql_string);
$i = 1;
while(($row = mysql_fetch_assoc($dataQuery)) !== false){
foreach($row AS $key=>$val){
$data[$i][$key] = $val;
}
$i++;
}
return $data;
}
}
定数は、クラスの前にロードされる別のファイルで定義されるため、存在します。
現在発生しているエラーは次のとおりです。
致命的なエラー:宣言されていない静的プロパティへのアクセス: db::$connection
うまく接続できているようです。dbQuery 関数を使用して接続にアクセスできません。dbQuery 関数は、他のすべての関数で使用されます。
これはクラスの始まりに過ぎず、私が既に使用していた関数のグループに基づいています。
それが機能する最終的な目標は、データベース名をクラスに渡し、その特定のインスタンスでそのデータベースにアクセスできるようにすることです。これにより、これを使用する予定のプロジェクトで複数のデータベースを使用できます。