2012-07-16 11 views
5

Czy można wyeksportować zapytanie sformatowane przez mysqli::prepare i ::bind_param?Eksportuj "zapytanie" z "mysqli-> przygotować"

przykład:

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

ja jak na eksport QUERY funkcje wykonywane przez mysql::prepare i bind_param tak (to wyimaginowana przykład):

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 

Funkcja ::exportQuery wypisywałby takiego :

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

Czy istnieje jakieś rozwiązanie?

Dzięki.

Odpowiedz

6

Wiem, że przydałoby się to do debugowania, ale nie tak działają przygotowane instrukcje. Parametry nie są łączone z przygotowaną instrukcją po stronie klienta. PHP nigdy nie powinno mieć dostępu do ciągu zapytania połączonego z jego parametrami.

Instrukcja SQL jest wysyłana do serwera bazy danych po przygotowaniu(), a parametry są wysyłane oddzielnie po wykonaniu polecenia execute(). Ogólny dziennik zapytań MySQL pokazuje ostateczny SQL z wartościami interpolowanymi po wykonaniu execute(). Poniżej znajduje się fragment mojego ogólnego dziennika zapytań. Uruchomiłem zapytania z mysql CLI, nie z PHP, ale zasada jest taka sama.

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 swój komentarz:

@Baily jest poprawna, MySQL nie ma rozwiązania po stronie klienta do zwrotu pełnej kwerendy z parametrami interpolowana. To nie wina PHP.

Aby włączyć rejestrowanie, że wspominając powyżej, należy użyć tego polecenia, zarówno w kliencie MySQL z PHP lub składane za pośrednictwem API:

SET GLOBAL general_log = ON; 

należy wyłączyć dziennik kiedy skończysz zbieranie informacji , ponieważ wyłapanie każdego zapytania kosztowało trochę narzutów.

SET GLOBAL general_log = OFF; 

PS: Zmiana ustawień rejestrowania dynamicznie wymaga MySQL w wersji 5.1 lub nowszej. We wcześniejszych wersjach należy zrestartować mysqld podczas zmiany logowania.

+0

Faktycznie może coś na boku „mysql” jest rozwiązaniem (nie dokładnie odpowiedź), ale nadal nie wiem jak Zrób to w praktyczny sposób. –

+0

Nie wierzę, że MySQL ma coś takiego wbudowanego. Zawsze możesz zrobić własną funkcję prepare(), aby to zrobić. – Anonymous

-1

Można tylko powtórzyć ciąg kwerendy na echa linii i umieścić swoje zmienne w ciągu ręcznie jak takie:

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

Znaczna część komentarzach zamieszczonych wskazują Twoje pytanie było faktycznie:

How to show the last queries executed on MySQL?

+0

To nie jest rozwiązanie. Nie działa z "ucieczką". Częścią pomysłu użycia "bind_param" jest bezpieczeństwo. Edytuj swoją odpowiedź. –

+1

Aby być uczciwym, twoje pytanie wyświetla komunikat, że chcesz wydrukować zapytanie, nie wspominasz o tym, co jeszcze chcesz zrobić w eksporcie. _ "Częścią pomysłu użycia" bind_param "jest bezpieczeństwo." Pytasz, czy zapytanie zostanie wyeksportowane z przygotowanej instrukcji i wydrukować je, a ja dostarczyłem ci odpowiedni alternatywa do eksportu, który wydrukował twoje zapytanie. Jeśli twój projekt wymaga zrobienia czegoś innego, twoje pytanie powinno to odzwierciedlać, abyś mógł otrzymać odpowiednie odpowiedzi. Żadne, ja nie zredagowałem swojego rozwiązania i dodałem podobne pytanie, które powinieneś przeczytać. – varubi

+1

Dzięki za pomoc. Przeczytaj odpowiedź @ BillKarwin: http://stackoverflow.com/questions/11508752/export-query-from-mysqli-prepare/17098261#17098261 może pomóc w zrozumieniu propozycji pytania. –

0

Przygotowane instrukcje nie działają w taki sposób, istnieje powód, dla którego nie można wyświetlić oświadczenia, ponieważ jego przypuszczalnie można przekazać do bazy danych bez manipulacji.

Jedynym rozwiązaniem jest po prostu dołączenie danych do łańcucha znaków, a także echo lub zapis do zmiennej.

EDIT włączenie troski o bezpieczeństwo skomentowany ..

//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

To nie jest rozwiązanie. Nie działa z "ucieczką". Częścią pomysłu użycia "bind_param" jest bezpieczeństwo. Edytuj swoją odpowiedź. –

+0

Wystarczy wrzucić mysql_real_escape_string .... jak wyżej – KyleK

+1

Powiesz lepiej: "najlepiej nie używać bind_param, użyj mysqli_query + mysql_real_escape_string". Czy sie zgadzasz? Dziękuję ci za pomoc. –

Powiązane problemy