尝试使用一个函数来创建简单的CRUD“Select”,它带有多个参数,可以用于任何表。我想我已经完成了最难的部分,但是现在无法获取数据。可能我做错了什么,我无法弄清楚。
我的预准备语句函数:
function prepared_query($mysqli, $sql, $params, $types = ""){
$types = $types ?: str_repeat("s", count($params));
if($stmt = $mysqli->prepare($sql)) {
$stmt->bind_param($types, ...$params);
$stmt->execute();
return $stmt;
} else {
$error = $mysqli->errno . ' ' . $mysqli->error;
error_log($error);
}
}
查询创建者:
function create_select_query($table, $condition = "", $sort = "", $order = " ASC ", $clause = ""){
$table = escape_mysql_identifier($table);
$query = "SELECT * FROM ".$table;
if(!empty($condition)){
$query .= create_select_query_where($condition,$clause);
}
if(!empty($sort)){
$query .= " ORDER BY ".$sort." $order";
}
return $query;
}
用于创建WHERE子句的helper函数:
function create_select_query_where($condition,$clause){
$query = " WHERE ";
if(is_array($condition)){
$pair = array();
$size = count($condition);
$i = 0;
if($size > 1){
foreach($condition as $field => $val){
$i++;
if($size-1 == $i){
$query .= $val." = ? ".$clause. " ";
}else{
$query .= $val." = ? ";
}
}
}else{
foreach($condition as $field => $val){
$query .= $val." = ? ";
}
}
}else if(is_string($condition)){
$query .= $condition;
}else{
$query = "";
}
return $query;
}
select函数本身:
function crud_select($conn, $table, $args, $sort, $order, $clause){
$sql = create_select_query($table, array_keys($args),$sort, $order, $clause);
print_r($sql);
if($stmt = prepared_query($conn, $sql, array_values($args))){
return $stmt;
}else{
$errors [] = "Something weird happened...";
}
}
当我创建查询时,它看起来很好,但不能获取数据。如果我创建一个只有一个参数的数组,查询将转换为:
SELECT * FROM `teste_table` WHERE id = ?
如果使用多个参数创建,则会变成如下所示:
SELECT * FROM `teste_table` WHERE id = ? AND username = ?
那么,我怎样才能正确地从select中获取数据呢?这应该有多种用途,所以我可以得到不止一个结果,所以我想最好的方法是以数组的形式获取数据。
我想我快找到了,但是我想不出来。谢谢
1条答案
按热度按时间rta7y2nd1#
在PHP〉= 8.2中,有一个函数execute_query()可以让你一次性执行一个SELECT查询(以及任何其他类型的查询):
对于旧版本,您将需要一个帮助函数,如下所示:
只要坚持下去,它就会对你很有好处。
然而,对于一个真实的的CRUD,你可以使用一种叫做表网关模式的方法。为此,你可以创建一个类,它将实现表上所有基本操作的方法:
然后,您将为使用的每个表 * 扩展 * 该类。
然后,您将拥有一个简洁、* 可读 * 和 * 安全*的CRUD解决方案。
这是我为这个场合写的sample Table Gateway
通过简单地扩展基本类,您可以在一段简单得多的代码中获得所需的一切:
你看-这真的很简单,但安全和明确。
请记住,对于更复杂的查询,您必须使用纯SQL或向UserGateway类添加新方法,例如
说到你目前的方法,它就是无法使用。我告诉过你把你的select函数限制在一个简单的主键查找。现在你打开了一罐蠕虫。结果你得到了纠缠的实现代码和不可读的应用程序代码。
$table, $args, $sort, $order, $clause
所有这些变量都是干什么用的?你将如何调用这个函数--一个随机排列的乱码SQL存根列表,而不是简单明了的SQL字符串?以及如何指定要选择的列列表?如何使用JOINS?SQL函数?别名?**为什么你不能马上只写一个SQL语句?**你已经有了一个用于选择的函数,虽然没有这个野蛮的错误报告代码,你添加到它: