2010-08-24 14 views
5

मैं mysqli की क्वेरी() और तैयार() के बीच अंतर को समझने की कोशिश कर रहा हूं। मेरे पास नीचे कोड है, और मैं दोनों से एक ही परिणाम प्राप्त करना चाहता हूं। हालांकि तैयार() अपेक्षा के अनुसार काम नहीं करता है। क्यूं कर?तैयार() बनाम क्वेरी() mysqli

ओएस

विस्टा 64 बिट/पीएचपी संस्करण 5.2.9

mysqli

mysqli समर्थन सक्षम:

// this works 

    if ($query = $this->db->query("SELECT html FROM static_pages WHERE page = 'cities'")) { 

    $result = $query->fetch_row(); 
    echo $result[0]; 

    $query->close(); 

    } 

    //this does not work 
    //result is empty 

    $cities = 'cities'; 

    $stmt = $this->db->prepare("SELECT html FROM static_pages WHERE page = ?"); 
    $stmt -> bind_param("s", $cities); 
    $stmt->execute(); 
    $stmt->bind_result($result); 
    $stmt->fetch(); 
    echo $result; 
    $stmt->close(); 

    $this->db->close(); 

इन अपने सर्वर कॉन्फ़िगरेशन के रूप में अनुरोध कर रहे हैं

क्लाइंट API लाइब्रेरी संस्करण 5.0.51a

क्लाइंट API हैडर संस्करण 5.0.51a

MYSQLI_SOCKET /tmp/mysql.sock

निर्देशक स्थानीय मूल्य मास्टर मूल्य

mysqli। default_host कोई मान नहीं मान

mysqli.default_port 3306 3306

mysqli.default_pw कोई मूल्य नहीं कोई मूल्य नहीं

mysqli.default_socket कोई मूल्य नहीं कोई मूल्य नहीं

mysqli.default_user कोई मूल्य नहीं कोई मूल्य नहीं

mysqli.max_links असीमित असीमित

mysqli.reconnect बंद

बंद
+0

आपको क्या गलत हो रहा है यह देखने के लिए $ stmt-> त्रुटि() प्रिंट करना होगा। –

+0

आह, क्षमा करें, यह एक चर है, विधि नहीं है। $ stmt-> त्रुटि –

+0

उस स्थिति में $ stmt-> त्रुटि का कोई मूल्य नहीं है। मैंने इसे सभी लाइनों पर करने की कोशिश की। – Mike

उत्तर

2

क्या आप $stmt->store_result();$stmt->execute(); और $stmt->bind_result($result); के बीच कोशिश कर सकते हैं?

+0

यह चाल करता है। अब अध्ययन करने के लिए, store_results()। बहुत बहुत धन्यवाद। मैं mysqli के लिए नया हूँ, इसके चारों ओर अपने सिर लपेटने की कोशिश कर रहा हूँ। – Mike

+0

अधिक जानकारी के लिए जांचें: http://us3.php.net/manual/en/mysqli-stmt.store-result.php .Btw, अगर यह मदद करता है, तो मुझे '+' – a1ex07

+0

एक तरफ मिलकर खुशी होगी ध्यान दें, यह आपको आश्चर्यचकित करता है कि क्यों bind_result पर्याप्त नहीं था। – Mike

0

होना चाहिए echo $result; नहीं echo $results;

+०१२३५१६४१०
+0

ओह, यह एक त्रुटि है, लेकिन इसका कारण यह नहीं है कि यह क्यों काम नहीं करता है। मैंने बस इसे लाइव कोड में तय किया है और यह अभी भी खाली आता है। – Mike

+0

@ माइक के कारण आपको अपने कार्यक्रम से पूछना है, न कि उन लोगों को जिन्हें पता नहीं चल रहा है कि क्या हो रहा है। मेरे कोड को चलाने और परिणाम देखने के लिए मेरे सिर में PHP दुभाषिया नहीं है। आपको इसे स्वयं करना है। कोई अपराध नहीं - यह सिर्फ एकमात्र तरीका है। –

+0

अच्छी तरह से तथ्य यह है कि क्वेरी() काम करता है और तैयार करता है() इस तथ्य के बावजूद कि उनके पास एक ही सटीक डेटा आपको कुछ नहीं बताएगा। क्या मेरे ऊपर दिए गए कोड के अर्थ में, उन दो फ़ंक्शंस अंतर-परिवर्तनीय नहीं हैं। – Mike

2

mysqli_ * कार्यों में से कोई भी विफल हो सकता है। इस मामले में वापसी मान false है और mysqli या mysqli_stmt ऑब्जेक्ट की त्रुटि/त्रुटि गुणों में त्रुटि के बारे में अधिक जानकारी है। स्क्रिप्ट प्रत्येक वापसी मूल्य का परीक्षण करना है और त्रुटि स्थिति पर उचित प्रतिक्रिया दें (उदाहरण के लिए कनेक्शन विफल होने पर कथन तैयार करने के लिए यह समझ में नहीं आता है)।

<?php 
$foo = new Foo; 
$foo->init(); 
$foo->bar(); 
class Foo { 
    public function bar() { 
    $cities = 'cities'; 
    $stmt = $this->db->prepare("SELECT html FROM soTest WHERE page = ?"); 
    if (!$stmt) { 
     echo "prepare failed\n"; 
     echo "error: ", $this->db->error, "\n"; 
     return; 
    } 

    $rc = $stmt->bind_param("s", $cities); 
    if (!$rc) { 
     echo "bind_param failed\n"; 
     echo "error: ", $stmt->error, "\n"; 
     return; 
    } 

    $rc=$stmt->execute(); 
    if (!$rc) { 
     echo "execute failed\n"; 
     echo "error: ", $stmt->error, "\n"; 
     return; 
    } 

    $rc = $stmt->bind_result($result); 
    if (!$rc) { 
     echo "bind_result failed\n"; 
     echo "error: ", $stmt->error, "\n"; 
     return; 
    } 

    $rc = $stmt->fetch(); 
    if (!$rc) { 
     echo "no such record\n"; 
    } 
    else { 
     echo 'result: ', $result, "\n"; 
    } 
    $stmt->close(); 
    } 

    public function init() { 
    $this->db = new mysqli('localhost', 'localonly', 'localonly', 'test'); 
    if ($this->db->connect_error) { 
     die('connection failed: ' . $this->db->connect_error); 
    } 
    $rc = $this->db->query('CREATE TEMPORARY TABLE 
     soTest (id int auto_increment, html varchar(16), page varchar(16),primary key(id))' 
    ); 
    if (!$rc) { die('error: '.$this->db->error); } 
    $rc = $this->db->query("INSERT INTO soTest (html,page) VALUES ('htmlFoo','foo'),('htmlCities','cities')"); 
    if (!$rc) { die('error: '.$this->db->error); } 
    } 
} 

मन में CWE-209: Information Exposure Through an Error Message रखें। मेरी उदाहरण स्क्रिप्ट में वास्तविक त्रुटि संदेश को प्रिंट करना केवल परीक्षण के लिए है। और आप die() की तुलना में थोड़ा अधिक परिष्कृत त्रुटि प्रबंधन का उपयोग कर सकते हैं।

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