stmt statement sentencias query prepared preparadas bind_result bind_param php mysqli prepared-statement

statement - sentencias preparadas php mysqli



Exportar "consulta" de "mysqli-> preparar" (3)

¿Es posible exportar la consulta formateada por mysqli::prepare y ::bind_param ?

Ejemplo:

<?php $mysqli = new mysqli(''host'', ''user'', ''pass'', ''table''); if(mysqli_connect_errno()){ printf(''Connect failed: %s/n'', mysqli_connect_error()); exit; } $data=7290; if ($stmt = $mysqli->prepare(''SELECT `id`,`info` FROM `propertys` WHERE id>?'')){ $stmt->bind_param(''i'',$data); $stmt->execute(); $stmt->bind_result($id,$info); while($q=$stmt->fetch()){ echo $id,'': '',$info,''<br>''; } $stmt->close(); } $mysqli->close(); ?>

Me gustaría exportar las funciones de consulta realizadas por mysql::prepare y bind_param (este es un ejemplo imaginario):

if ($stmt = $mysqli->prepare(''SELECT `id`,`info` FROM `propertys` WHERE id>?'')){ $stmt->bind_param(''i'',$data); $stmt->execute(); echo $stmt->exportQuery();//Function does not exist, just for example

La función ::exportQuery se imprimiría así:

SELECT `id`,`info` FROM `propertys` WHERE id>7290

¿Hay alguna solución?

Gracias.


Las declaraciones preparadas no funcionan así, hay una razón por la que no puede ver la declaración, porque se supone que se puede pasar a la base de datos sin manipulación.

Entonces, la única solución para esto es simplemente adjuntar sus datos a su cadena, y repetir o guardar en variable.

EDITA para incluir la preocupación de seguridad que comentaste ..

//Assume you''re using $_GET to get the id $data = mysql_real_escape_string($_GET[''yourID'']); $yourStatement = ''SELECT `id`,`info` FROM `propertys` WHERE id>''; $savedStatement = $yourStatement.$data; echo $savedStatement; //Will return ''SELECT `id`,`info` FROM `propertys` WHERE id>4'' if ($stmt = $mysqli->prepare($yourStatement.''?'')){ $stmt->bind_param(''i'',$data); $stmt->execute(); }


Sé que esto sería útil para la depuración, pero no es la forma en que funcionan las declaraciones preparadas. Los parámetros no se combinan con una declaración preparada en el lado del cliente. PHP nunca debe tener acceso a la cadena de consulta combinada con sus parámetros.

La instrucción SQL se envía al servidor de la base de datos cuando se prepara (), y los parámetros se envían por separado cuando se ejecuta (). El registro de consultas generales de MySQL muestra el SQL final con valores interpolados después de ejecutar (). A continuación se muestra un extracto de mi registro general de consultas. Ejecuté las consultas desde la CLI de mysql, no desde PHP, pero el principio es el mismo.

081016 16:51:28 2 Query prepare s1 from ''select * from foo where i = ?'' 2 Prepare [2] select * from foo where i = ? 081016 16:51:39 2 Query set @a =1 081016 16:51:47 2 Query execute s1 using @a 2 Execute [2] select * from foo where i = 1

Re su comentario:

@Baily es correcto, MySQL no tiene una solución del lado del cliente para devolver la consulta completa con los parámetros interpolados. No es culpa de PHP.

Para habilitar el registro que mencioné anteriormente, use este comando, ya sea en el cliente MySQL o enviado desde PHP a través de una API:

SET GLOBAL general_log = ON;

Debe desactivar el registro cuando haya terminado de recopilar información, ya que cuesta algo de sobrecarga para registrar cada consulta.

SET GLOBAL general_log = OFF;

PD: Cambiar la configuración de registro de forma dinámica requiere MySQL 5.1 o posterior. En versiones anteriores, debe reiniciar mysqld cuando cambia el registro.


Simplemente podría reiterar la cadena de consulta en la línea de eco y colocar sus variables en la cadena de forma manual como esta:

if ($stmt = $mysqli->prepare(''SELECT `id`,`info` FROM `propertys` WHERE id>?'')){ $stmt->bind_param(''i'',$data); if($stmt->execute()){ echo ''SELECT `id`,`info` FROM `propertys` WHERE id>''.$data; }; }

Muchos de los comentarios que publicó indican que su pregunta fue en realidad:

¿Cómo mostrar las últimas consultas ejecutadas en MySQL?