用于获取和设置数据的动态数据库功能

时间:2013-03-11 14:22:22

标签: php mysqli

我创建了一个类来处理我的应用程序的所有数据库操作。到目前为止,我已经在我的视图中收集并显示了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;

以上工作可以很好地显示大量数据,但我想要做的是调用一个允许我设置单个数据元素的数据库函数。因此,如果我只获得有限数量的数据(即一行名称,年龄,地址),则不必使用foreach

我解决这个问题的一种非动态方式是为每个只需要数据库中一行的函数编写数据库:

    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);
    }

所以基本上我想让上面的语句重构到我的数据库类中,从而使它更具动态性。

我不知道如何解决这个问题,我不想使用PDO,因为我希望在Mysqli中找到解决方案。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

您是否建议只切换到PDO?

当然。

整个您的函数test()可以重写为三个行(假设$ param包含一个包含预准备语句参数的数组):

public function test($sql, $param)
{
    $stmt = $this->AC->pdo->prepare($sql);
    $stmt->execute($param);  
    return $stmt->fetchAll();
}