stmt query mysqli_stmt_fetch mysqli_stmt get_result fetch_assoc example bind_result array php mysqli segmentation-fault

query - PHP extrañas Seg-fallas en mysqli_stmt_bind_result



stmt fetch() php (1)

Al migrar un script PHP de PHP 5.2 a PHP 5.3, me encontré con el siguiente problema: El propósito general del script es la extracción de datos. Tengo un procedimiento interno que agrega datos al servidor MySQL. Como es muy repetitivo, lo reescribí (hace un tiempo) para usar MySQLi, en particular sentencias preparadas, ya que hay un total de 3 posibles consultas para realizar. De todos modos, ahora, en el servidor de PHP 5.3, la secuencia de comandos se bloquea en la siguiente línea:

mysqli_stmt_bind_result($prepCheck, $id1);

Donde $prepCheck se crea con $prepCheck = mysqli_prepare($con, $checkQuery) or die("Error"); . La consulta funciona bien en el servidor MySQL ($ checkQuery, eso es) y el código PHP también funcionaba en el servidor anterior.

Ejecutar el script con strace no reveló nada, ya que lo último en esto es la llamada al sistema para echo "Execute"; , que es 29936 19:44:18 write(1, "Execute/n", 8) = 8 .

El objeto de conexión no es FALSE , e incluso si lo fuera, debería fallar con otro error, ¿no?

Aquí viene la parte más extraña: este procedimiento no falla cuando ejecuto el script, lo que limita el número de páginas visitadas y el script se completa con éxito. Sin embargo, cuando establezco un límite superior, falla, siempre en la primera llamada a este procedimiento, y precisamente en esta línea.

Si alguien tiene alguna sugerencia de lo que podría estar causando esto, sería profundamente apreciado.

Puedo pegar código si alguien necesita ver una imagen más grande, pero el procedimiento es muy largo y aburrido hasta la muerte (puede ser por eso que el guión está fallando :).

Así es como comienza el script: error_reporting(E_ALL); ini_set(''display_errors'', ''1''); error_reporting(E_ALL); ini_set(''display_errors'', ''1''); . No se informa ningún error además de la Segmentation fault ''mágica''. No estoy usando APC.

No estoy seguro de si es relevante, pero estoy usando CLI para ejecutar el script, no una interfaz web.

La versión de PHP es 5.3.8, la versión de MySQL es 5.1.56. El límite de memoria está configurado en 64 MB.

EDITAR: El procedimiento que falla + parte del otro código se carga aquí: http://codepad.org/KkZTxttQ . El archivo completo es enorme y feo, y creo que es irrelevante, así que no lo publico por ahora. La línea que falla es 113.


Una respuesta a mi propia pregunta, ya que he resuelto el problema, y ​​no hay otras respuestas ...

El crédito va a @ jap1968 por señalarme la función mysqli_stmt_error (que asumí que no necesitaría, ya que tengo error_reporting(E_ALL) ).

El problema era que MySQL tenía una configuración predeterminada muy extraña: particularmente

connect_timeout = 10 wait_timeout = 30

Esto causó que el servidor MySQL cerrara la conexión después de solo 30 segundos (el predeterminado es más de media hora, según el sitio web de MySQL). Esto a su vez, provocó que la función mysqli_stmt_bind_result fallara con una falla de segmentación.