У меня есть такой код:
$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.
Есть некоторые аналогичные проблемы, о которых сообщалось
http://bugs.xdebug.org/view.php?id=900
https://bugs.php.net/bug.php?id=60778
Один из способов избавиться от этих сообщений – это добавить
unset($stmt);
после закрытия заявления и до точки останова. Если это не помогает, вы также должны добавить
unset($connection);
после закрытия соединения, как указано в комментарии @Martin.
Это не решает проблему, но позволяет продолжить работу, пока это не будет исправлено некоторое время.
EDIT : теперь есть также проблема:
EDIT : Кажется, это ошибка в драйвере MySQLi, как описано здесь .
EDIT : Похоже, эта ошибка не появляется, если вы используете PDO. Так что это, возможно, другая причина переключиться на PDO.
/* 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); }
с/* 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); }
Алан хочет заявить, что вы можете использовать эти фрагменты следующим образом:
$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); }
в$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); }
с$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); }
с$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); }
Для меня это также работало в PHP 5.6 И я использую его в качестве обходного пути в https://github.com/joshcam/PHP-MySQL-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. Но для отладчика, похоже, нет причин прекращать показывать отладочную информацию: -> У меня не было времени, чтобы понять, почему.
Я получаю аналогичную ошибку с PHP 7.1.1 / Xdebug 2.5.1, пытаясь измерить охват тестирования в консоли, без IDE:
mysqli_init(): Property access is not allowed yet in /home/www/wp-includes/wp-db.php on line 1515
Решение заключалось в том, чтобы прокомментировать все связанные с xdebug настройки в php.ini
. Кажется, в моем случае они были скопированы с более ранней версии и вызвали проблемы. Без этих настроек все начали работать безупречно.
PS: Что я имел в конфигурации перед удалением:
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