Bind_result बनाम get_result का उपयोग कैसे करें का उदाहरण


84

मैं इस बात का उदाहरण देखना चाहूंगा कि कैसे bind_resultबनाम का उपयोग करके कॉल get_resultकिया जा सकता है और एक के बाद एक का उपयोग करने का उद्देश्य क्या होगा।

इसके अलावा प्रत्येक का उपयोग करने के समर्थक और विपक्ष।

या तो उपयोग करने की सीमा क्या है और क्या कोई अंतर है।

जवाबों:


199

मेरे लिए निर्णायक कारक, यह है कि क्या मैं अपने क्वेरी कॉलम का उपयोग कर रहा हूं *

इसका उपयोग bind_result()करना बेहतर होगा:

// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';

इसका उपयोग get_result()करना बेहतर होगा:

// Use get_result() with fetch_assoc() 
$query2 = 'SELECT * FROM table WHERE id = ?';

उदाहरण 1 $query1उपयोग करने के लिएbind_result()

$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;

if($stmt = $mysqli->prepare($query)){
   /*
        Binds variables to prepared statement

        i    corresponding variable has type integer
        d    corresponding variable has type double
        s    corresponding variable has type string
        b    corresponding variable is a blob and will be sent in packets
   */
   $stmt->bind_param('i',$id);

   /* execute query */
   $stmt->execute();

   /* Store the result (to get properties) */
   $stmt->store_result();

   /* Get the number of rows */
   $num_of_rows = $stmt->num_rows;

   /* Bind the result to variables */
   $stmt->bind_result($id, $first_name, $last_name, $username);

   while ($stmt->fetch()) {
        echo 'ID: '.$id.'<br>';
        echo 'First Name: '.$first_name.'<br>';
        echo 'Last Name: '.$last_name.'<br>';
        echo 'Username: '.$username.'<br><br>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

उदाहरण 2 $query2उपयोग करने के लिएget_result()

$query2 = 'SELECT * FROM table WHERE id = ?'; 
$id = 5;

if($stmt = $mysqli->prepare($query)){
   /*
        Binds variables to prepared statement

        i    corresponding variable has type integer
        d    corresponding variable has type double
        s    corresponding variable has type string
        b    corresponding variable is a blob and will be sent in packets
   */
   $stmt->bind_param('i',$id);

   /* execute query */
   $stmt->execute();

   /* Get the result */
   $result = $stmt->get_result();

   /* Get the number of rows */
   $num_of_rows = $result->num_rows;



   while ($row = $result->fetch_assoc()) {
        echo 'ID: '.$row['id'].'<br>';
        echo 'First Name: '.$row['first_name'].'<br>';
        echo 'Last Name: '.$row['last_name'].'<br>';
        echo 'Username: '.$row['username'].'<br><br>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

जैसा कि आप देख सकते हैं आप के bind_resultसाथ उपयोग नहीं कर सकते *। हालाँकि, get_resultदोनों के लिए काम करता है, लेकिन bind_resultसरल है और कुछ गड़बड़ निकाल देता है $row['name']


bind_result ()

पेशेवरों:

  • सरल
  • साथ खिलवाड़ करने की जरूरत नहीं $row['name']
  • उपयोग fetch()

विपक्ष:

  • SQL क्वेरी का उपयोग करने के साथ काम नहीं करता है *

get_result ()

पेशेवरों:

  • सभी SQL स्टेटमेंट के साथ काम करता है
  • उपयोग fetch_assoc()

विपक्ष:

  • सरणी चर के साथ गड़बड़ करना चाहिए $row[]
  • उतना साफ-सुथरा नहीं
  • MySQL के मूल चालक की आवश्यकता है ( mysqlnd )

8
OMG, काश मुझे यह Q & A BEFORE मिल जाता, जिसके लिए मैं सब कुछ बाध्य करता $row[]। विस्तृत विवरण के लिए धन्यवाद! एक सावधानी; मैनुअल के अनुसार get_result
सेबलफोस्ट

2
@SableFoste सही! और इसका मतलब है कि ... आपको कॉन्फ़िगर के साथ गड़बड़ करना है ... इसलिए ... bind_result का उपयोग करें।
परीक्षण करें

1
उन सभी के लिए जहां get_result () विधि काम नहीं कर रही है: stackoverflow.com/questions/8321096/…
कार्ल एडलर

3
get_result () ने भी मेरे लिए दूसरे उदाहरण के लिए काम नहीं किया - गलत और गलत = 0 (कोई त्रुटि नहीं) लौटाता रहा। Store_result () कॉल को हटाकर इसे ठीक कर दिया गया।
जीता

1
@ वापस इसे क्वेरी के गुणों को संग्रहीत करता है ... जैसे पंक्तियों की संख्या वापस
लौटाता है

2

उदाहरण आप संबंधित मैनुअल पृष्ठों पर पा सकते हैं।

जबकि समर्थक और विपक्ष काफी सरल हैं:

  • get_result परिणामों को संभालने का एकमात्र एकमात्र तरीका है
  • अभी तक यह हमेशा उपलब्ध नहीं है और आपके कोड को बदसूरत bind_result का उपयोग करके एक कमबैक करना है।

वैसे भी, यदि आपका विचार आवेदन कोड में या तो फ़ंक्शन का उपयोग करना है - यह विचार गलत है। फिर भी जब तक आपने उन्हें क्वेरी से अपना डेटा वापस करने के लिए किसी विधि में एनकैप्सुलेट किया है, तब तक वास्तव में कोई फर्क नहीं पड़ता है, जिसे उपयोग करना है, इस तथ्य के लिए सहेजें कि आपको bind_result को लागू करने के लिए दस गुना अधिक कोड की आवश्यकता होगी।


1
<b> गंभीर त्रुटि </ b>: कॉल अपरिभाषित विधि mysqli_stmt को :: get_result () उपरोक्त कोड ऐसे त्रुटि दिखा सकते हैं
किस्सा मिया

1
क्षमा करें, लेकिन मुझे बदसूरत होने के लिए bind_result () नहीं मिला ... क्या आप कृपया बता सकते हैं कि कुरूपता कहाँ है?
शमूएल रमजान

1

मुख्य अंतर जो मैंने देखा है, bind_result()वह आपको त्रुटि देता है 2014, जब आप नेस्टेड $ stmt को अन्य $ stmt के अंदर कोड करने की कोशिश करते हैं , जो कि (बिना ) प्राप्त किया जा रहा है mysqli::store_result():

विफल तैयार: (2014) सिंक से बाहर निकलता है; अब आप यह कमांड नहीं चला सकते

उदाहरण:

  • मुख्य कोड में उपयोग किया जाता है।

    function GetUserName($id)
    {
        global $conn;
    
        $sql = "SELECT name FROM users WHERE id = ?";
    
        if ($stmt = $conn->prepare($sql)) {
    
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $stmt->bind_result($name);
    
            while ($stmt->fetch()) {
                return $name;
            }
            $stmt->close();
        } else {
            echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
        }
    }
    
  • मुख्य कोड।

    $sql = "SELECT from_id, to_id, content 
            FROM `direct_message` 
            WHERE `to_id` = ?";
    if ($stmt = $conn->prepare($sql)) {
    
        $stmt->bind_param('i', $myID);
    
        /* execute statement */
        $stmt->execute();
    
        /* bind result variables */
        $stmt->bind_result($from, $to, $text);
    
        /* fetch values */
        while ($stmt->fetch()) {
            echo "<li>";
                echo "<p>Message from: ".GetUserName($from)."</p>";
                echo "<p>Message content: ".$text."</p>";
            echo "</li>";
        }
    
        /* close statement */
        $stmt->close();
    } else {
        echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
    }
    

यह वास्तव में पूरी तरह से सच नहीं है ... आप bind_resultसही ढंग से उपयोग नहीं कर रहे हैं
एरियन फोरेटोश

1
यदि आप इसका उपयोग करते हैं तो $stmt->store_result()यह आपको $stmtदूसरे के अंदर नेस्टेड करने की अनुमति देगा$stmt
एरियन फोरेटोश

@ एरियनफॉरटोश, मैं क्या गलत कर रहा हूं? mysqli_stmt::bind_resultPHP.net के बारे में प्रलेखन मुझे अपनी गलती के बारे में कुछ नहीं बताता ... या क्या यह उपयोग करने के लिए एक अच्छा अभ्यास है $stmt->store_result()?
नॉर्मन एडेंस

@ArianFaurtosh, मैंने सोचा कि यदि mysql_store_result ()एक बड़ा परिणाम सेट भेजा जाता है, तो यह एक समस्या बन सकती है, या क्या मैं गलत हूं? हाँ, इस उदाहरण के लिए शायद यह इतना महत्वपूर्ण नहीं है, फिर भी ... वैसे भी, मुझे ठीक करने के लिए thnx :)
नॉर्मन एडवांस

1

get_result () अब केवल MySQL के मूल चालक (mysqlnd) को स्थापित करके PHP में उपलब्ध है। कुछ वातावरणों में, mysqlnd को स्थापित करना संभव या वांछनीय नहीं हो सकता है।

इसके बावजूद, आप अभी भी mysqli का उपयोग करने के लिए 'select *' क्वेरी कर सकते हैं, और फ़ील्ड नामों के साथ परिणाम प्राप्त कर सकते हैं - हालाँकि यह get_result () का उपयोग करने की तुलना में थोड़ा अधिक जटिल है, और इसमें php के call_user_unc_array () फ़ंक्शन का उपयोग करना शामिल है। उदाहरण देखें कि php में get_result () के बजाय bind_result () का उपयोग कैसे करें जो एक साधारण 'select *' क्वेरी करता है, और परिणाम (स्तंभ नामों के साथ) एक HTML तालिका में आउटपुट करता है।


0

मुझे लगता है कि उदाहरण 2 केवल इस तरह से काम करेगा, क्योंकि store_result और get_result दोनों को तालिका से जानकारी मिलती है।

तो हटाओ

/* Store the result (to get properties) */
$stmt->store_result();

और ऑर्डर को थोड़ा बदलें। यह अंतिम परिणाम है:

$query2 = 'SELECT * FROM table WHERE id = ?'; 
$id = 5;

if($stmt = $mysqli->prepare($query)){
 /*
    Binds variables to prepared statement

    i    corresponding variable has type integer
    d    corresponding variable has type double
    s    corresponding variable has type string
    b    corresponding variable is a blob and will be sent in packets
 */
$stmt->bind_param('i',$id);

/* execute query */
$stmt->execute();

/* Get the result */
$result = $stmt->get_result();

/* Get the number of rows */
$num_of_rows = $result->num_rows;

while ($row = $result->fetch_assoc()) {
    echo 'ID: '.$row['id'].'<br>';
    echo 'First Name: '.$row['first_name'].'<br>';
    echo 'Last Name: '.$row['last_name'].'<br>';
    echo 'Username: '.$row['username'].'<br><br>';
}

/* free results */
$stmt->free_result();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.