当前位置: 首页 > 知识库问答 >
问题:

动态mysqli prepared语句失败

松鸣
2023-03-14

我正试图为我的mysqli连接编写一个非常小的抽象层,但遇到了一个问题。由于我维护的是较旧的代码,我需要从我的查询中获得一个关联数组,因为这是代码设置的方式,因此一旦这样做了,我的工作就少了...这个函数可以处理各种查询(不仅仅是选择)...

我写的函数是这样的:

function connectDB($query,$v=array()) {
    $mysqli = new mysqli(HOST,USER,PW,DATABASE);

    if($res=$mysqli->prepare($query)) {
            //dynamically bind all $v
            if($v) {
            $values=array($v[0]);
            for($i=1; $i<count($v); $i++) {
                ${'bind'.$i}=$v[$i];
                $values[]=&${'bind'.$i};
            }
            call_user_func_array(array($res,'bind_param'),$values);
        }
        $res->execute();

        //bind all table rows to result
        if(strtolower(substr($query,0,6))=="select") {
            $fields=array();
            $meta=$res->result_metadata();
            while($field=$meta->fetch_field()) { 
                ${$field->name}=null;
                $fields[$field->name]=&${$field->name};
            }
            call_user_func_array(array($res,"bind_result"),$fields);

            //return associative array
            $results = array();
            $i=0;
            while($res->fetch()) {
                $results[$i]=array();
                foreach($fields as $k => $v) $results[$i][$k] = $v;
                $i++;
            }
        }
        else {
            $results=$mysqli->affected_rows;
            if($mysqli->affected_rows<1) $results=$mysqli->info;
        }

        $res->close();
    }
    $mysqli->close();

    return $results;
}
$MySqlres=connectDB("select * from `modx_events` events  limit 1");
var_dump($MySqlres);
$MySqlres=connectDB("select *, events.`id` as `ID`,venues.`name` as `venueName`,
venues.`suburb` as `venueSuburb`,venues.`advertiser` as `venueAdvertiser`
from `modx_events` events left join `modx_venues` venues on events.`venue`=venues.`id`
where events.`id`!='e' order by events.`start_date` asc, venues.`name` limit 1");

添加的问题

  • 仅仅为了保留关联数组返回,这样的开销是不是太大了?是否应该改用$res->fetch_object()

共有1个答案

史钊
2023-03-14

Mysqli在动态准备好的语句方面非常糟糕,这使得创建小型抽象层成为一场噩梦。
我强烈建议您切换到PDO或摆脱准备好的语句,并基于手动处理的占位符创建一个常规查询(首选)。

作为一个治标补丁,您可以尝试使用get_result()函数,该函数将返回一个常规结果变量,您可以使用fetch_assoc()
以通常的方式遍历该变量,但它仅适用于mysqlnd构建。

还要注意,为每个查询创建mysqli对象是一个很大的禁忌。
只创建一次,然后使用global$mysqli;在查询函数中分配它

我不明白你说的是什么开销

 类似资料:
  • 问题内容: 我有一个包含多个搜索条件的搜索页面 员工姓名 员工ID 入职日期 部门 等等 用户可以提供一个或多个搜索条件。我需要查询数据库以获取搜索结果。 使用纯JDBC,有两种方法可以实现此目的。 通过附加用户提供的搜索条件来准备SQL查询。 例如: 使用 例如: 此答案说明,像上面的ex 1一样,可以修改ex2,如下所示 然后仔细地(牢记参数索引)将输入设置为准备好的语句。听起来这不是一个非常

  • 我试图联合所有大约20个表合并成一个单一的视图。我不断得到一个错误,该错误声明: 如果我将该列注释掉,可以很好地工作。 我尝试将所有列强制转换为相同的数据类型,但没有成功。 我试着注释掉有问题的专栏,这很有效,但我需要那个专栏。 我只尝试了几个表的联合,这取决于文档类型,有时有效,有时无效。

  • 如果我有3个字符串变量string1 string2和string3,并且根据用户输入,其中一些变量可能是空的,我该怎么做?我想将这些变量与我已经设置的另外3个变量进行比较,除非相应的字符串(string1/string2/string3)输入为空 这个想法是这样的: 如果没有一个是空的,那么: 如果s1是唯一一个空的,那么我们只比较其他2个: 因此,如果输入的字符串为空,程序将不会检查该变量是否

  • 问题内容: 我正在尝试执行这样的mysql查询 它显示这样的错误 我该如何实现? 问题答案: 在查询中动态表名的使用最好与 Prepared Staments一起使用 ,在mysql中也可以使用串联功能 您也可以针对删除查询执行此操作

  • 本文向大家介绍Mybatis中的动态SQL语句解析,包括了Mybatis中的动态SQL语句解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下   Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,一种是利用注解进行配置。   Myb

  • 本文向大家介绍MyBatis 执行动态 SQL语句详解,包括了MyBatis 执行动态 SQL语句详解的使用技巧和注意事项,需要的朋友参考一下 大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: 你可以如下调用: 或者你可以在 XXMapper.java 接口中定义如下方法: 然后使用接口调用方法: 上面这些内容可能都会,下面在此