Intereting Posts
Удалите первые 4 символа строки с помощью PHP От раунда до тысячи, сотни и т. Д. В PHP Facebook require_login не работает Неопределенная переменная – У операторов switch есть область действия в PHP Как отправить недопустимый параметр выбора в WebTestCase с помощью symfony 2.3 Массив Cookie для недавно просмотренных – необходимо извлечь данные из массива и кепки cookie в 5 идентификаторов Получить титул веб-сайта по ссылке Добавление отдельной цитаты в результаты mysql иногда, но не всегда Запуск PHPUnit в ошибках командной строки PHP заменяет строку после использования file_get_contents Как настроить пользовательские заголовки в PHP Запуск Codeigniter через CLI выводит корневой сайт веб-сайта вместо ожидаемого результата Ошибка при попытке запустить HipHop в «режиме 2 (компиляция HipHop во временном каталоге и запуск скомпилированной программы из командной строки») PHP Показывает процент прогона ftp_get? Невозможно загрузить библиотеки при использовании CI 3 с HMVC

mysqli + xdebug точка останова после закрытия оператора приводит к многочисленным предупреждениям

У меня есть такой код:

$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