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