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