2012-07-16 21 views
5

से "क्वेरी" निर्यात करें mysqli::prepare और ::bind_param द्वारा स्वरूपित क्वेरी को निर्यात करना संभव है?"mysqli-> तैयार करें"

उदाहरण:

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

मैं mysql::prepare और bind_param द्वारा किया जाता QUERY कार्यों निर्यात करना चाहते हैं तो (यह एक काल्पनिक उदाहरण है):

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 

समारोह ::exportQuery इस तरह मुद्रित होगा :

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

कोई समाधान है?

धन्यवाद।

उत्तर

6

मुझे पता है कि यह डिबगिंग के लिए उपयोगी होगा, लेकिन यह तैयार कथन का काम नहीं है। पैरामीटर क्लाइंट-साइड पर तैयार कथन के साथ संयुक्त नहीं होते हैं। PHP को अपने पैरामीटर के साथ संयुक्त क्वेरी स्ट्रिंग तक कभी भी पहुंच नहीं होनी चाहिए।

SQL कथन डेटाबेस सर्वर पर भेजा जाता है जब आप तैयार करते हैं(), और जब आप execute() निष्पादित करते हैं तो पैरामीटर अलग से भेजे जाते हैं। MySQL का सामान्य क्वेरी लॉग अंतिम SQL को निष्पादित करने के बाद इंटरपोल किए गए मानों के साथ दिखाता है()। नीचे मेरे सामान्य क्वेरी लॉग से एक अंश है। मैंने PHP से नहीं, MySQL CLI से प्रश्नों को चलाया, लेकिन सिद्धांत समान है।

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 

अपनी टिप्पणी पुन:

@Baily सही है, MySQL अंतर्वेशित मानकों के साथ पूर्ण क्वेरी लौटने की कोई क्लाइंट साइड समाधान है। यह PHP की गलती नहीं है।

या तो MySQL ग्राहक में या एक एपीआई के माध्यम से PHP से प्रस्तुत लॉगिंग कि मैं ऊपर उल्लेख सक्षम करने के लिए इस आदेश का उपयोग करें,:

SET GLOBAL general_log = ON; 

आप लॉग बंद कर देना चाहिए जब आप जानकारी एकत्रित कर काम हो गया , क्योंकि प्रत्येक क्वेरी को लॉग इन करने के लिए कुछ ओवरहेड खर्च होता है।

SET GLOBAL general_log = OFF; 

पुनश्च: लॉगिंग सेटिंग बदलने से गतिशील रूप से MySQL 5.1 या बाद की आवश्यकता है। पिछले संस्करणों में, जब आप लॉगिंग बदलते हैं तो आपको mysqld को पुनरारंभ करना होगा।

+0

वास्तव में हो सकता है "mysql" के पक्ष में कुछ समाधान (वास्तव में नहीं अपने जवाब) है, लेकिन अभी भी कैसे करने के लिए पता नहीं है यह व्यावहारिक तरीका करो। –

+0

मुझे विश्वास नहीं है कि MySQL में इस अंतर्निहित कुछ भी है। आप इसे करने के लिए हमेशा अपना खुद का तैयार() फ़ंक्शन बना सकते हैं। – Anonymous

-1

तुम सिर्फ इस तरह के तरह मैन्युअल रूप से गूंज लाइन पर क्वेरी स्ट्रिंग दोहराना सकता है और स्ट्रिंग में अपने चर जगह:

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

टिप्पणी आप पोस्ट के बहुत से संकेत मिलता है अपने प्रश्न वास्तव में था:

How to show the last queries executed on MySQL?

+0

यह एक समाधान नहीं है। यह "भागने" के साथ काम नहीं करता है। "Bind_param" का उपयोग करने के विचार का हिस्सा सुरक्षा के लिए है। कृपया अपना उत्तर संपादित करें। –

+1

निष्पक्ष होने के लिए आपका प्रश्न प्रदर्शित करता है कि आप क्वेरी को प्रिंट करना चाहते हैं, आप इस बात का कोई जिक्र नहीं करते कि आप निर्यात को और क्या करना चाहते हैं। _ "Bind_param" का उपयोग करने के विचार का हिस्सा सुरक्षा के लिए है। "_ आपने क्वेरी को तैयार कथन से निर्यात करने के लिए कहा है और इसे मुद्रित करने के लिए कहा है, मैंने आपको अपनी क्वेरी मुद्रित करने के लिए उपयुक्त विकल्प प्रदान किया है। यदि आपकी परियोजना के लिए आपको इसके अलावा कुछ और करने की आवश्यकता है, तो आपके प्रश्न को प्रतिबिंबित करना चाहिए, ताकि आप उचित प्रतिक्रिया प्राप्त कर सकें। कोई भी नहीं, कम मैंने अपना समाधान संपादित किया और एक समान प्रश्न जोड़ा जो आपको पढ़ना चाहिए था। – varubi

+1

मदद करने की कोशिश करने के लिए धन्यवाद। @ बिलकार्विन के उत्तर को पढ़ें: http://stackoverflow.com/questions/11508752/export-query-from-mysqli-prepare/17098261#17098261 प्रश्न के प्रस्ताव को समझने में आपकी सहायता कर सकता है। –

0

तैयार कथन इस तरह काम नहीं करते हैं, एक कारण है कि आप कथन को देखने में सक्षम नहीं हैं, क्योंकि इसे बिना किसी मैनिपुलेशन के डेटाबेस में पास किया जा सकता है।

तो इसका एकमात्र समाधान केवल आपके डेटा को अपनी स्ट्रिंग से संलग्न करना है, और प्रतिध्वनि को प्रतिध्वनि या सहेजना है।

संपादित सुरक्षा चिंता का विषय है जिस पर आपने टिप्पणी शामिल करने के लिए ..

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

यह एक समाधान नहीं है। यह "भागने" के साथ काम नहीं करता है। "Bind_param" का उपयोग करने के विचार का हिस्सा सुरक्षा के लिए है। कृपया अपना उत्तर संपादित करें। –

+0

बस mysql_real_escape_string में फेंक दें .... ऊपर – KyleK

+1

जैसा कि आप बेहतर कहेंगे: "bind_param का उपयोग न करने के लिए सबसे अच्छा है, mysqli_query + mysql_real_escape_string का उपयोग करें"। क्या आप सहमत हैं? मदद के लिए वैसे भी धन्यवाद। –

संबंधित मुद्दे