2012-07-16 4 views
5

Ist es möglich, die durch mysqli::prepare und ::bind_param formatierte Abfrage zu exportieren?"Abfrage" von "mysqli-> prepare" exportieren

Beispiel:

<?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(); 
?> 

Ich mag die QUERY Funktionen von mysql::prepare und bind_param so durchgeführt, exportieren (dies ist ein imaginäres Beispiel):

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 

Die Funktion ::exportQuery wie dieser Druck würde :

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

Gibt es eine Lösung?

Danke.

Antwort

6

Ich weiß, dass dies für das Debuggen nützlich wäre, aber es ist nicht die Art, wie vorbereitete Anweisungen funktionieren. Parameter werden nicht mit einer vorbereiteten Anweisung auf der Clientseite kombiniert. PHP sollte niemals Zugriff auf die Abfragezeichenfolge in Kombination mit seinen Parametern haben.

Die SQL-Anweisung wird an den Datenbankserver gesendet, wenn Sie prepare() vorbereiten, und die Parameter werden separat gesendet, wenn Sie execute() ausführen. Das allgemeine Abfrageprotokoll von MySQL zeigt das endgültige SQL mit Werten, die nach dem Ausführen von interpoliert wurden(). Im Folgenden finden Sie einen Auszug aus meinem allgemeinen Abfrageprotokoll. Ich habe die Abfragen von der mysql CLI ausgeführt, nicht von PHP, aber das Prinzip ist das gleiche.

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 Ihr Kommentar:

@Baily ist richtig, MySQL hat keine clientseitige Lösung die vollständige Abfrage mit Parametern interpoliert zurückzukehren. Es ist nicht die Schuld von PHP.

die Protokollierung aktivieren, die ich oben erwähnt, verwenden Sie diesen Befehl, entweder in der MySQL-Client oder von PHP über eine API vorgelegt:

SET GLOBAL general_log = ON; 

Sie sollten das Protokoll deaktivieren, wenn Sie das Sammeln von Informationen fertig sind , weil es einen gewissen Overhead kostet, jede Abfrage zu protokollieren.

SET GLOBAL general_log = OFF; 

PS: Das dynamische Ändern der Protokollierungseinstellungen erfordert MySQL 5.1 oder höher. In früheren Versionen müssen Sie mysqld neu starten, wenn Sie die Protokollierung ändern.

+0

Eigentlich vielleicht auf der Seite des „mysql“ etwas kommentieren enthalten ist die Lösung (nicht genau Ihre Antwort), aber immer noch nicht wissen, wie man mach diesen praktischen Weg. –

+0

Ich glaube nicht, dass MySQL so etwas eingebaut hat. Sie können immer Ihre eigene prepare() -Funktion erstellen, um genau dies zu tun. – Anonymous

-1

Sie könnten nur die Query-String auf der Echo-Zeile wiederholen und platzieren Sie Ihre Variablen in den String manuell wie solche:

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; 
    }; 
} 

Ein Großteil der Kommentare, die Sie Ihre Frage gestellt angeben war eigentlich:

How to show the last queries executed on MySQL?

+0

Dies ist keine Lösung. Es funktioniert nicht mit "Escape". Teil der Idee, "bind_param" zu verwenden, ist Sicherheit. Bitte editiere deine Antwort. –

+1

Um fair zu sein, zeigt Ihre Frage an, dass Sie die Abfrage ausdrucken möchten, Sie erwähnen nicht, was Sie sonst noch für den Export tun möchten. _ "Ein Teil der Idee," bind_param "zu verwenden, dient der Sicherheit." _ Sie haben gefragt, dass die Abfrage aus der vorbereiteten Anweisung exportiert werden soll, und ich habe Ihnen eine geeignete Alternative zum Exportieren des Ausdrucks Ihrer Abfrage bereitgestellt. Wenn Ihr Projekt erfordert, dass Sie etwas anderes als das tun, sollte Ihre Frage das widerspiegeln, damit Sie die entsprechenden Antworten erhalten können. Keines der weniger, ich habe meine Lösung bearbeitet und eine ähnliche Frage hinzugefügt, die Sie gelesen haben sollten. – varubi

+1

Danke für den Versuch zu helfen. Lies @ BillKarwins Antwort: http://stackoverflow.com/questions/11508752/export-query-from-mysqli-prepare/17098261#17098261 kann dir helfen, den Vorschlag der Frage zu verstehen. –

0

Vorbereitete Anweisungen funktionieren nicht so, es gibt einen Grund, warum Sie die Anweisung nicht sehen können, da sie in der Lage sein soll, ohne Manipulation an die Datenbank übergeben zu werden.

So die einzige Lösung für dieses Problem ist, nur Ihre Daten an Ihre Zeichenfolge anhängen und Echo oder Speichern in Variable.

EDIT die Sicherheit betreffen Sie auf ..

//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(); 
    } 
+0

Dies ist keine Lösung. Es funktioniert nicht mit "Escape". Teil der Idee, "bind_param" zu verwenden, ist Sicherheit. Bitte editiere deine Antwort. –

+0

Werfen Sie einfach in mysql_real_escape_string .... wie oben – KyleK

+1

Sie sollten besser sagen: "ist am besten nicht bind_param zu verwenden, verwenden Sie mysqli_query + mysql_real_escape_string". Sind Sie einverstanden? Danke trotzdem, dass du geholfen hast. –