代码之家  ›  专栏  ›  技术社区  ›  AbcAeffchen

关闭语句后的mysqli+xdebug断点会导致许多警告

  •  28
  • AbcAeffchen  · 技术社区  · 10 年前

    我有这样一段代码:

    $conn = new mysqli($host, $username, $passwd, $dbname);
    
    ...
    
    $stmt = $conn->prepare('SELECT ...');
    $stmt->bind_param(...);
    $stmt->execute();
    $stmt->bind_result(...);
    while($stmt->fetch())
    {
        // do something here
    }
    $stmt->close();
    
    ...
    
    // do something more here that has absolutely nothing to do with $stmt
    

    这工作得很好。我得到了我预期的结果,没有错误或任何不应该发生的事情。

    但如果我将断点(Xdebug 2.2.5/2.2.6/2.2.8/2.3.2和PHP 5.5.3/5.5.15/5.6.0/5.6.6/5.6.10)设置为一行 之后 $stmt->close(); ,我收到很多警告,比如

    尚不允许访问属性

    无法获取mysqli_stmt

    我以为我错过了关闭另一个mysqli语句,但我得到了所有结果。我的代码似乎没有问题。。。

    有没有办法消除这种错误的警告?

    使现代化 :此问题在PHP 7.0.1/Xdebug 2.4.0 RC3中仍然存在。

    6 回复  |  直到 7 年前
        1
  •  24
  •   Community CDub    4 年前

    报告了一些类似的问题
    http://bugs.xdebug.org/view.php?id=900
    https://bugs.php.net/bug.php?id=60778

    消除此消息的一种方法是添加

    unset($stmt);
    

    在关闭语句之后和断点之前。如果这没有帮助,您还应该添加

    unset($connection);
    

    在关闭@Martin在评论中提到的连接后。

    这并不能解决问题本身,而是让你继续你的工作,直到某个时间可以解决。

    编辑 :现在还有一个 reported issue :)

    编辑 :据报道,这似乎是MySQLi驱动程序中的错误 here .

    编辑 :如果您使用PDO,似乎不会出现此错误。因此,这可能是改用PDO的另一个原因。

        2
  •  4
  •   Derick    5 年前
        3
  •  1
  •   Alan Reddan    8 年前
    /* PHP 7.0.5 - MYSQLi (mysqlnd 5.0.12-dev)  - XDEBUG 2.4 */
    /* This one will allow breakpoints before / after / step through */
    
    if (function_exists('xdebug_disable'))
                  {
                   $errorlevel=error_reporting();
                   $displayerrors=ini_get('display_errors');
                   ini_set('display_errors',0);
                    error_reporting(0);
                    xdebug_disable();
                  }
    
                    mysqli_close($DATA_DBH);
                   unset($DATA_DBH);
          if (function_exists('xdebug_enable'))
                  {
                    xdebug_enable();
                    error_reporting($errorlevel);
                   ini_set('display_errors',$displayerrors);
                  }
    
        4
  •  1
  •   pati    7 年前

    在没有IDE的情况下,我尝试在控制台中测量测试覆盖率时,PHP 7.1.1/Xdebug2.5.1也出现了类似的错误:

    mysqli_init(): Property access is not allowed yet in /home/www/wp-includes/wp-db.php on line 1515
    

    解决方案是在 php.ini 。在我的案例中,它们似乎是从早期版本复制粘贴的,并导致了问题。没有这些设置,一切都开始完美地工作。

    P.S.:删除前我在配置中看到的是:

    xdebug.auto_trace = 1
    xdebug.collect_includes = 1
    xdebug.collect_params = 1
    xdebug.collect_return = 1
    xdebug.default_enable = "On"
    xdebug.extended_info = 1
    xdebug.idekey = "xdebug"
    xdebug.max_nesting_level = 100
    xdebug.remote_enable = 1
    xdebug.remote_autostart=1
    xdebug.remote_handler = "dbgp"
    xdebug.remote_host = "127.0.0.1"
    xdebug.remote_port = 9000
    xdebug.show_local_vars = 9
    xdebug.var_display_max_children = 128
    
        5
  •  0
  •   stev-e    8 年前

    Alan想说明的是,您可以按以下方式使用这些片段:

    $stmt = $conn->prepare('SELECT ...');
    $stmt->bind_param(...);
    $stmt->execute();
    $stmt->bind_result(...);
    while($stmt->fetch())
    {
        // do something here
    }
    
    // Disable the buggy interconnection between xDebug and PHP/MySQLi for a certain period
    if (function_exists('xdebug_disable'))
                  {
                   $errorlevel=error_reporting();
                   $displayerrors=ini_get('display_errors');
                   ini_set('display_errors',0);
                    error_reporting(0);
                    xdebug_disable();
                  }
    
    $stmt->close();
    unset($stmt);
    unset($conn);
    
    // finalle bring back the functionality
    if (function_exists('xdebug_enable'))
                  {
                    xdebug_enable();
                    error_reporting($errorlevel);
                   ini_set('display_errors',$displayerrors);
                  }
    

    对我来说,这也适用于PHP5.6,我将其用作 https://github.com/joshcam/PHP-MySQLi-Database-Class

    类似于MSQLiDB.php中的情况->_dynamicBindResults():

    /* BUG http://stackoverflow.com/questions/25377030/mysqli-xdebug-breakpoint-after-closing-statment-result-in-many-warnings 
               temporarily disable the buggy module interconnection         */
            if (function_exists('xdebug_disable'))
                  {
                   $errorlevel=error_reporting();
                   $displayerrors=ini_get('display_errors');
                   ini_set('display_errors',0);
                    error_reporting(0);
                    xdebug_disable();
                  }
            /* Returning to normal xDebugging is only possible after $this->_mysqli->close
            if (function_exists('xdebug_enable'))
                  {
                    xdebug_enable();
                    error_reporting($errorlevel);
                   ini_set('display_errors',$displayerrors);
                  }
             * 
             */
            $stmt->close();
    

    请注意,我实际上无法立即重新启用xDebugging,因为这个库很晚才销毁MySQLi对象。但这似乎不是调试器停止显示调试信息的原因:->我还没来得及弄清楚原因。

        6
  •  0
  •   adejones    5 年前

    使用PHP 7.2.19和Xdebug 2.7.2,VSCode为我提供了大量异常和警告。这个 unset() 这种方法对我不起作用,但我设法用一个伪“noop”语句作为执行代码的最后一行来阻止它们,例如。,

    function do_mysqli_stuff() {
    
       ...
    
       while(false); // noop
    }
    

    或者你可以使用 assert(true); 如果这冒犯了你的感情。

    无论如何,我希望这对某人有所帮助,因为警告很烦人;-)