Php 如何使用准备好的语句创建适当的mysqli扩展类?

Php 如何使用准备好的语句创建适当的mysqli扩展类?,php,sql,mysql,class,mysqli,Php,Sql,Mysql,Class,Mysqli,我在网上搜寻了一个很好的例子,但什么也找不到 我正在尝试扩展mysqli类,以生成一个helper类,该类将抽象掉一些复杂性。我想完成的主要事情之一就是利用准备好的语句 我真的不知道从哪里开始,也不知道如何在一个类中正确处理输入和输出。另一个问题是,在使用准备好的语句时,无法将数据作为数组输出 我真的可以用一个简单的例子来为我指明正确的方向 谢谢 查看Zend Framework,它是一个绝对模块化的类,尤其是适配器。查看的实现,尤其是。事实上,您可能只是选择使用它,而不是开发自己的。示例:

我在网上搜寻了一个很好的例子,但什么也找不到

我正在尝试扩展mysqli类,以生成一个helper类,该类将抽象掉一些复杂性。我想完成的主要事情之一就是利用准备好的语句

我真的不知道从哪里开始,也不知道如何在一个类中正确处理输入和输出。另一个问题是,在使用准备好的语句时,无法将数据作为数组输出

我真的可以用一个简单的例子来为我指明正确的方向


谢谢

查看Zend Framework,它是一个绝对模块化的类,尤其是适配器。

查看的实现,尤其是。事实上,您可能只是选择使用它,而不是开发自己的。示例:

 //connect to a database using the mysqli adapter
 //for list of other supported adapters see
 //http://framework.zend.com/manual/en/zend.db.html#zend.db.adapter.adapter-notes
$parameters = array(
                    'host'     => 'xx.xxx.xxx.xxx',
                    'username' => 'test',
                    'password' => 'test',
                    'dbname'   => 'test'
                   );
try {
    $db = Zend_Db::factory('mysqli', $parameters);
    $db->getConnection();
} catch (Zend_Db_Adapter_Exception $e) {
    echo $e->getMessage();
    die('Could not connect to database.');
} catch (Zend_Exception $e) {
    echo $e->getMessage();
    die('Could not connect to database.');
}

//a prepared statement
$sql = 'SELECT * FROM blah WHERE id = ?';
$result = $db->fetchAll($sql, 2);

//example using Zend_Db_Select
$select = $db->select()
             ->from('blah')
             ->where('id = ?',5);
print_r($select->__toString());
$result = $db->fetchAll($select);

//inserting a record
$row = array('name' => 'foo',
             'created' => time()
            );
$db->insert('blah',$row);
$lastInsertId = $db->lastInsertId();

//updating a row
$data = array(
    'name'      => 'bar',
    'updated'   => time()
);

$rowsAffected = $db->update('blah', $data, 'id = 2');    

还请检查Kohana数据库库。。它几乎满足了您的需求:

假设您确实想要编写自己的版本(而不是使用其他答案建议的现有库之一,这些也是很好的选择)

这里有几个函数,您可能会发现检查它们很有用。第一个允许您将查询结果绑定到关联数组,第二个允许您传入两个数组,一个是键的有序数组,另一个是这些键的关联数据数组,并将该数据绑定到准备好的语句中:

function stmt_bind_assoc (&$stmt, &$out) {
    $data = mysqli_stmt_result_metadata($stmt);
    $fields = array();
    $out = array();

    $fields[0] = $stmt;
    $count = 1;

    while($field = mysqli_fetch_field($data)) {
        $fields[$count] = &$out[$field->name];
        $count++;
    }
    call_user_func_array(mysqli_stmt_bind_result, $fields);
}

function stmt_bind_params($stmt, $fields, $data) {
    // Dynamically build up the arguments for bind_param
    $paramstr = '';
    $params = array();
    foreach($fields as $key)
    {
        if(is_float($data[$key]))
            $paramstr .= 'd';
        elseif(is_int($data[$key]))
            $paramstr .= 'i';
        else
            $paramstr .= 's';
        $params[] = $data[$key];
    }
    array_unshift($params, $stmt, $paramstr);
    // and then call bind_param with the proper arguments
    call_user_func_array('mysqli_stmt_bind_param', $params);
}

为此,我编写了一个包装器类——它为使用MySQLi或PDO的参数化查询提供了相同的接口。该接口允许您在一行代码中执行参数化SQL,这大大简化了您自己的代码


我希望自己做一个,但我不确定。执行
$db->fetchAll($sql,2)表现得像mysql\u fetch\u数组?还有,为什么每个脚本中都必须存在如此多的冗余代码?我可以创建另一个类来处理try,catch语句结尾的所有内容吗?或者这被认为是错误的做法吗?@Jon-fetchAll将默认返回一个关联数组(可以更改,还有fetchRow、fetchCol、fetchOne等等)。长时间的try..catch在引导程序(或include等)中理想情况下只在应用程序中出现一次,所以这不是一个真正的问题。谢谢你的帮助!