2012-07-20 7 views
9

Ive ने तैयार कथन में चयन का उपयोग करने के संबंध में विभिन्न उदाहरणों का एक समूह का पालन किया, लेकिन कुछ भी वापस नहीं किया गया है। संपादित मैं इस तरह देखने के लिए मेरी कोड थोड़ी बदल गई हैं:तैयार कथन में एक SELECT क्वेरी निष्पादित करने में समस्या होने पर

$date1 = 2012-01-01; 
$date2 = 2012-01-31; 
$sql_con = new mysqli('db', 'username', 'password', 'database'); 

if($stmt = $sql_con->prepare("SELECT eventLogID FROM Country WHERE countryCode=? AND date BETWEEN ? AND ?")){ 

    $stmt->bind_param("sss", $country_code, $date1,$date2); 

    $stmt->execute(); 

    $i=0; 
    while ($stmt->fetch()){ 
    $stmt->bind_result($row[$i]); 
    $i++; 
    } 

    $stmt->close(); 
$sql_con->close(); 

अब सभी वांछित प्रविष्टियों, पहले के अलावा, $ के लिए जोड़ रहे पंक्ति []। पहली प्रविष्टि क्यों नहीं जोड़ा जा रहा है? अग्रिम धन्यवाद!

+0

आप अपनी क्वेरी में * का उपयोग , लेकिन आपके bind_result ($ पंक्ति) में $ पंक्ति। bind_result में मुझे लगता है कॉलम होना चाहिए। यहां और पढ़ें: http://nl3.php.net/manual/en/mysqli-stmt.bind-result.php तो आपकी $ पंक्ति परिवर्तक में जो कुछ भी है उसका पहला कॉलम है। (अपने सभी प्रश्नों में से बचें *, लेकिन यह एक अलग मामला है।) –

उत्तर

17

संपादित 07/2015 (प्रश्न मूल जवाब के बाद से संपादित किया गया है लेकिन अंतर्निहित सिद्धांतों ही कर रहे हैं)

कभीSELECT * उत्पादन परिवेश में, यह केवल वापस आ जाएगा अजीब, अप्रत्याशित में आप काट और प्रतीत होता है असंबंधित तरीकों से। आपके इच्छित कॉलम निर्दिष्ट करके, आप यह सुनिश्चित करेंगे कि कॉलम ऑर्डरिंग, डेटा-टाइप, बाधा और अन्य तत्वों के सभी प्रकार आपको लंबे समय तक समस्याएं नहीं पहुंचाएंगे।

यह उत्तर अभी भी अधिकतर मान्य है इसलिए मैं इसे यहां छोड़ दूंगा, लेकिन मुख्य टेक-दूर है: पीडीओ का उपयोग करें, यह 98% चीजें हैं जिन्हें आपको कभी भी अधिक क्लीनर और अधिक आवश्यकता होगी एक ही पीठ के अंत में संक्षिप्त एपीआई। यदि आपको अधिक जटिल आरडीबीएमएस-विशिष्ट एपीआई की आवश्यकता है तो आप पहले से ही अपनी समस्याओं को समझ लेंगे और आपको इसके बजाय mysqli आदि क्यों चाहिए।


SELECT * MySQLi तैयार कथन के साथ बहुत अच्छी तरह से काम नहीं करता है। यह उन प्रमुख कारणों में से एक है जिन्हें मैं PDO की बजाय अनुशंसा करता हूं - और हास्यास्पद आवश्यकता पैरामीटर के मानों के बजाय परिवर्तनीय संदर्भों को बांधने के लिए।

$stmt->bind_result($row); 

यह एक चर के लिए बाध्यकारी नहीं है परिणाम पंक्ति, यह सिर्फ एक एकल स्तंभ बाध्यकारी होगा। और क्योंकि आपने SELECT * का उपयोग किया है, यह वह नहीं करता जो आप चाहते हैं।

आप पीडीओ से अधिक MySQLi उपयोग करने के लिए (जो, जैसा कि मैंने कहा, मैं सिफारिश करेंगे) वहाँ कैसे SELECT *this onebind_result() मैनुअल पृष्ठ पर कैसा टिप्पणी में से कुछ अच्छे उदाहरण हैं चाहते हैं, तो।

या आप केवल कॉलम आप प्राप्त करना चाहते हैं निर्दिष्ट कर सकते हैं:

$sql_con = new mysqli('db', 'username', 'password', 'database'); 

if($stmt = $sql_con->prepare("SELECT name, countryCode FROM Country WHERE countryCode = ?")) { 

    $stmt->bind_param("s", $country_code); 
    $stmt->execute(); 
    $stmt->bind_result($name, $countryCode); 

    while ($stmt->fetch()) { 
    // Because $name and $countryCode are passed by reference, their value 
    // changes on every iteration to reflect the current row 
    echo "<pre>"; 
    echo "name: $name\n"; 
    echo "countryCode: $countryCode\n"; 
    echo "</pre>"; 
    } 

    $stmt->close(); 

संपादित अपने नए कोड के आधार पर, तो आप इस करना चाहिए:

// $date1 will be int(2010), $date2 will be int(1980) because you didn't 
// quote the strings! 
//$date1 = 2012-01-01; 
//$date2 = 2012-01-31; 

// Connect to DB 
$sql_con = new mysqli('db', 'username', 'password', 'database'); 

// Check for connection errors here! 

// The query we want to execute 
$sql = " 
    SELECT eventLogID 
    FROM Country 
    WHERE countryCode = ? 
    AND date BETWEEN ? AND ? 
"; 

// Attempt to prepare the query 
if ($stmt = $sql_con->prepare($sql)) { 

    // Pass the parameters 
    $date1 = '2012-01-01'; 
    $date2 = '2012-01-31'; 
    $stmt->bind_param("sss", $country_code, $date1, $date2); 

    // Execute the query 
    $stmt->execute(); 
    if (!$stmt->errno) { 
    // Handle error here 
    } 

    // Pass a variable to hold the result 
    // Remember you are binding a *column*, not a row 
    $stmt->bind_result($eventLogID); 

    // Loop the results and fetch into an array 
    $logIds = array(); 
    while ($stmt->fetch()) { 
    $logIds[] = $eventLogID; 
    } 

    // Tidy up 
    $stmt->close(); 
    $sql_con->close(); 

    // Do something with the results 
    print_r($logIds); 

} else { 
    // Handle error here 
} 
+0

आपके उत्तर के लिए धन्यवाद। मैंने थोड़ा सा रास्ता बनाया, लेकिन बाद के मुद्दे के लिए मेरा संपादन जांचें। – Glenncito

+0

@Glenncito – DaveRandom

+0

से ऊपर संपादित करें मैं इसके साथ भी संघर्ष कर रहा हूं, एक चुनिंदा तैयार कथन कर रहा हूं, बस काम नहीं करेगा, अंत में आप वास्तव में क्या कर रहे थे? –

3

मुझे लगता है कि आपको bind_results() जैसे

/* prepare statement */ 
if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country ORDER BY Name LIMIT 5")) { 
$stmt->execute(); 

/* bind variables to prepared statement */ 
$stmt->bind_result($col1, $col2); 

/* fetch values */ 
while ($stmt->fetch()) { 
    printf("%s %s\n", $col1, $col2); 
} 
में कॉलम से जुड़ना होगा

यहाँ col1 डॉलर और $ देश तालिका संहिता का col2 बांधता है और नाम कॉलम

(* के बजाय चयन के कॉलम नाम का उपयोग करें)

आगे संदर्भ: http://php.net/manual/en/mysqli-stmt.bind-result.php

+0

आपके उत्तर के लिए धन्यवाद। मैंने थोड़ा सा रास्ता बनाया, लेकिन बाद के मुद्दे के लिए मेरा संपादन जांचें। – Glenncito

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