1

更新: 非推奨のメソッドの代わりに 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 関数は、他のすべての関数で使用されます。

これはクラスの始まりに過ぎず、私が既に使用していた関数のグループに基づいています。

それが機能する最終的な目標は、データベース名をクラスに渡し、その特定のインスタンスでそのデータベースにアクセスできるようにすることです。これにより、これを使用する予定のプロジェクトで複数のデータベースを使用できます。

4

1 に答える 1