0

アプリケーションのすべてのデータベース操作を処理するクラスを作成しました。これまでのところ、ビュー内の foreach ステートメントでデータを収集して表示しました。私ができるようにしたいのは、データベース クラスの関数から個々の要素を取得および設定することです。

foreach内でデータを表示するための私のデータベース関数は次のとおりです。

   public function test($sql, $type, $param)
   {
       $variables = array();
       $results = array();

       // Mysqli
       if($stmt = $this->AC->Mysqli->prepare($sql))
       {
        $params = array_merge($type, $param);
           call_user_func_array(array($stmt, 'bind_param'), $this->make_values_referenced($params));
        $stmt->execute();  
        $stmt->store_result();          
        // Existance
        if($stmt->num_rows > 0)
        {

        $meta = $stmt->result_metadata();

        while($field = $meta->fetch_field()) 
        {  
            $parameters[] = &$row[$field->name];  
        }  

        call_user_func_array(array($stmt, 'bind_result'), $parameters);                     


        while($stmt->fetch()) 
        {  

            $elemet = array();  

            foreach($row as $key => $val) 
            {  
                $element[$key] = $val;  
            }  

            $results[] = $element;  

        } 

        return $results;            

        }
        else
        {
            $results = FALSE;
            return $results;
        }            
        }
        else
        {
        die("ERROR: We could not connect.");
        }
    }

以下の関数は私のモデルから呼び出されます:

    public function profile_information($account_name)
    {
    // Mysqli Variables
    $sql = "SELECT $this->account_details.bio 
            FROM account_details 
            WHERE $this->account_details.account_name = ? LIMIT 10";    

            $type = array("s");
            $param = array($account_name);

            $results = $this->AC->Database->prepared_select_loop($sql, $type, $param);

            $this->AC->Template->set_data('profile_information', $results, FALSE);
    }

モデル内で設定したら、コントローラー内で関数を呼び出し、データを表示するための foreach を使用してビュー内でアクセスします。

    $profile_information = $this->get_data('profile_information');
    foreach ($profile_information as $row) : 
        //Displaying data here
    endforeach;

上記は大量のデータを表示するのにうまく機能しますが、私がやりたいのは、個々のデータ要素を設定できるようにするデータベース関数を呼び出すことです。したがって、限られた量のデータ (つまり、名前、年齢、住所の 1 行) しか取得できない場合は、foreach を使用する必要はありません。

私がこの問題に取り組んだ非動的な方法は、データベースから 1 つの行のみを必要とする関数ごとにデータベースを作成することです。

    function name($variable)
    {
            $sql = 'statement here';
            $stmt = $this->AC->Mysqli->prepare($sql);
                $stmt->bind_param("i", $id);
                $stmt->execute();
                $stmt->store_result();
                $stmt->bind_result(bind results);
                $stmt->fetch();

            $this->AC->Template->set_data('id', $id);               
            $this->AC->Template->set_data('account_name', $account_name);
    }

したがって、基本的には、上記のステートメントをデータベース クラスにリファクタリングして、より動的にしたいと考えています。

この問題にどのように取り組むことができるかわかりません。Mysqli 内で解決策を見つけたいので、PDO を使用したくありません。どんな助けでも大歓迎です。

4

1 に答える 1

1

PDOに切り替えることをお勧めしますか?

絶対。

関数全体を3test()行に書き直すことができます($param に、準備されたステートメントのパラメーターを含む配列が含まれていると仮定します)。

public function test($sql, $param)
{
    $stmt = $this->AC->pdo->prepare($sql);
    $stmt->execute($param);  
    return $stmt->fetchAll();
}
于 2013-03-11T19:39:42.477 に答える