mac - xdebug phpstorm
mysqli+xdebug breakpoint despuĆ©s del cierre de la declaraciĆ³n genera muchas advertencias (4)
Hay algunos problemas similares reportados
http://bugs.xdebug.org/view.php?id=900
https://bugs.php.net/bug.php?id=60778
Una forma de deshacerse de estos mensajes es agregar
unset($stmt);
Después de cerrar la declaración y antes del punto de interrupción. Si esto no ayuda, también debe agregar
unset($connection);
Después de cerrar la conexión como lo menciona @Martin en los comentarios.
Esto no resuelve el problema en sí mismo, pero le permite continuar con su trabajo hasta que esto pueda solucionarse en algún momento.
EDITAR : Ahora también hay un problema informado :)
EDIT : esto parece ser un error en el controlador MySQLi como se informa here .
EDITAR : Parece que este error no aparece si utiliza DOP. Así que esta es quizás otra razón para cambiar a DOP.
Tengo un trozo de código como este:
$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
Esto funciona perfectamente bien. Obtengo los resultados que esperaba, no hay errores ni nada que se supone que no debe suceder.
Pero si establezco un punto de interrupción (Xdebug 2.2.5 / 2.2.6 / 2.2.8 / 2.3.2 y PHP 5.5.3 / 5.5.15 / 5.6.0 / 5.6.6 / 5.6.10) en una línea después de $stmt->close();
, Recibo muchas advertencias como
Acceso a la propiedad no está permitido todavía
o
No se pudo obtener mysqli_stmt
Pensé que no pude cerrar otra declaración mysqli, pero obtuve todos los resultados. Parece que no hay problema en mi código ...
¿Hay alguna manera de deshacerse de estas advertencias equivocadas?
Actualización : este problema todavía existe en PHP 7.0.1 / Xdebug 2.4.0 RC3.
He estado recibiendo un error similar con PHP 7.1.1 / Xdebug 2.5.1 al intentar medir la cobertura de prueba en la consola, sin un IDE:
mysqli_init(): Property access is not allowed yet in /home/www/wp-includes/wp-db.php on line 1515
La solución fue comentar todas las configuraciones relacionadas con xdebug en php.ini
. Parece que en mi caso fueron copiados y pegados de una versión anterior y causaron problemas. Sin esos ajustes todos empezaron a funcionar perfectamente.
PS: Lo que tenía en la configuración antes de la eliminación es:
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
Lo que Alan quiere decir es que puedes usar estos fragmentos de la siguiente manera:
$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);
}
Para mí, esto también funcionó en PHP 5.6 y lo uso como solución alternativa en https://github.com/joshcam/PHP-MySQLi-Database-Class
Me gusta en MSQLiDB.php -> _dynamicBindResults ():
/* BUG http://.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();
Tenga en cuenta que en realidad no puedo volver a habilitar xDebugging inmediatamente porque esta biblioteca destruye el objeto MySQLi muy tarde. Pero eso parece no ser una razón para que el depurador deje de mostrar información de depuración: -> Todavía no tenía tiempo para averiguar por qué.
/* 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);
}