• 技术文章 >后端开发 >php教程

    关于is_resource()方法的问题问题

    2016-06-06 20:22:25原创898
    在将php5.3的程序向php7迁移过程中 出现这样的问题:
    1、我将mysql全换成mysqli
    2、在判断mysql结果集时正确,能够正常得到结果,但是换成mysqli后也能够得到结果
    现在问题原因是
    换成mysqli后,is_resource()方法判断mysqli结果集的结果为false

    上源代码 代码出自某商城程序

    static function sqlOfUpdate(&$rs, $data, $InsertIfNoResult = false,$insertData=null,$ignore=false){
            $db = kernel::database();
            var_dump($rs,is_resource($rs['rs']));exit;
            if(!is_resource($rs['rs'])){
                trigger_error('SqlOfUpdate: '.$rs['sql'].' error ',E_USER_ERROR);
            }
            @mysqli_data_seek($rs['rs'],0);
            $row = mysqli_fetch_assoc($rs['rs']);
            if($InsertIfNoResult && !$row){
                return self::getinsertsql($rs,$data);
            }

    输出的结果

    array(2) {//$rs
      ["rs"]=>
      object(mysqli_result)#74 (5) {
        ["current_field"]=>
        int(0)
        ["field_count"]=>
        int(4)
        ["lengths"]=>
        NULL
        ["num_rows"]=>
        int(0)
        ["type"]=>
        int(0)
      }
      ["sql"]=>
      string(115) "select * from `sdb_base_cache_expires` where 1 AND `type` = "DB" AND `app` = "base" AND `name` = "BASE_APP_CONTENT""
    }
    bool(false)//is_resource($rs['rs'])

    刚刚查了下php.net的说明发现resource类型中存在mysql结果类型而不存在mysqli结果类型

    回复内容:

    在将php5.3的程序向php7迁移过程中 出现这样的问题:
    1、我将mysql全换成mysqli
    2、在判断mysql结果集时正确,能够正常得到结果,但是换成mysqli后也能够得到结果
    现在问题原因是
    换成mysqli后,is_resource()方法判断mysqli结果集的结果为false

    上源代码 代码出自某商城程序

    static function sqlOfUpdate(&$rs, $data, $InsertIfNoResult = false,$insertData=null,$ignore=false){
            $db = kernel::database();
            var_dump($rs,is_resource($rs['rs']));exit;
            if(!is_resource($rs['rs'])){
                trigger_error('SqlOfUpdate: '.$rs['sql'].' error ',E_USER_ERROR);
            }
            @mysqli_data_seek($rs['rs'],0);
            $row = mysqli_fetch_assoc($rs['rs']);
            if($InsertIfNoResult && !$row){
                return self::getinsertsql($rs,$data);
            }

    输出的结果

    array(2) {//$rs
      ["rs"]=>
      object(mysqli_result)#74 (5) {
        ["current_field"]=>
        int(0)
        ["field_count"]=>
        int(4)
        ["lengths"]=>
        NULL
        ["num_rows"]=>
        int(0)
        ["type"]=>
        int(0)
      }
      ["sql"]=>
      string(115) "select * from `sdb_base_cache_expires` where 1 AND `type` = "DB" AND `app` = "base" AND `name` = "BASE_APP_CONTENT""
    }
    bool(false)//is_resource($rs['rs'])

    刚刚查了下php.net的说明发现resource类型中存在mysql结果类型而不存在mysqli结果类型

    mysqli的结果集是一个对象,使用is_resource函数当然是false,没什么好纠结的

    如果要判断结果集是否存在数据可以使用mysqli结果集对象里的num_rows属性:

    $mysqli_result = $mysqli->query($sql);
    var_dump($mysqli_result->num_rows);

    原因 @thou95 已经说了,替换方法可以这么写

    static function sqlOfUpdate(mysqli_result &$rs, $data, $InsertIfNoResult = false,$insertData=null,$ignore=false){
    ...

    在rs参数定义的时候加上mysqli_result类型就行了

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php php7迁移问题
    上一篇:javascript - html伸缩式侧边栏代码? 下一篇:json - 如何看待/纠正php的array_key_exists函数bug?
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 用PHP来统计在线人数的四个方法详解• 为什么小弟我新装zend9,导入后,原站的中文字体变小了 • [转载]php软件工程师要注意的 • 装配及配置eaccelerator-0.9.5加速PHP-5.2.1 • 新手有几个问题大家
    1/1

    PHP中文网