दिलचस्प पोस्ट
ब्राउज़र में उपयोगकर्ता के लोकेल को निर्धारित करने का सर्वोत्तम तरीका मैं कैसे जांच सकता हूं कि Google Maps पूरी तरह भरी हुई है या नहीं? एंड्रॉइड स्टेटस बार को स्थायी रूप से छिपाना IN मूल्य सूची से आदेश नियॉन: कैसे jdk9 पर चलने के लिए? सरणी से ArrayList बनाएँ .NET में NameValueCollection में किसी क्वेरी स्ट्रिंग को कैसे विश्लेषित करें सर्वश्रेष्ठ सी / सी + + नेटवर्क लाइब्रेरी ब्राउज़रों में मूसीव्हील की गति को सामान्य करना JQuery में एक <UL> / <OL> आदेश का सबसे आसान तरीका क्या है? सीएसएस का उपयोग कर चेकबॉक्स को कैसे स्टाइल करना है? संघ के साथ आदेश कैसे करें एंड्रॉइड एप्लिकेशन में बाहरी फोंट कैसे जोड़ें एप्लिकेशन द्वारा एंड्रॉइड लॉकैट फ़िल्टर कैसे करें? App.config से कनेक्शन स्ट्रिंग प्राप्त करें

Mysqli get_result वैकल्पिक

मैंने अपने सभी एसक्यूएल प्रश्नों को सिर्फ mysqli का उपयोग करते हुए तैयार बयानों के लिए बदल दिया है। इस प्रक्रिया को गति देने के लिए मैंने एक फ़ंक्शन बनाया (called performQuery ) जो mysql_query को बदल देता है यह क्वेरी, बाइंडिंग (जैसे "एसडीएसएस") और पास करने के लिए चर लेता है, यह तब सभी भरोसेमंद बयान सामग्री करता है। इसका मतलब यह था कि मेरे सभी पुराने कोड को बदलना आसान था। मेरा फ़ंक्शन mysqli_result ऑब्जेक्ट mysqli get_result() का उपयोग mysqli_result देता है

इसका मतलब था कि मैं अपने पुराने कोड को इससे बदल सकता हूं:

 $query = "SELECT x FROM y WHERE z = $var"; $result = mysql_query($query); while ($row = mysql_fetch_assoc($result)){ echo $row['x']; } 

सेवा मेरे

 $query = "SELECT x FROM y WHERE z = ?"; $result = performQuery($query,"s",$var); while ($row = mysql_fetch_assoc($result)){ echo $row['x']; } 

यह स्थानीयहोस्ट पर ठीक काम करता है, लेकिन मेरे वेब होस्टिंग सर्वर में mysqlnd उपलब्ध नहीं है, इसलिए get_result get_result() काम नहीं करता है। स्थापित करना mysqlnd एक विकल्प नहीं है

यहां से जाने का सबसे अच्छा तरीका क्या है? क्या मैं एक ऐसा फ़ंक्शन बना सकता हूं जो get_result() को बदलता है, और कैसे?

वेब के समाधान से एकत्रित समाधान "Mysqli get_result वैकल्पिक"

यहां एक ही सिद्धांत के आधार पर एक नीपर समाधान है:

 function get_result( $Statement ) { $RESULT = array(); $Statement->store_result(); for ( $i = 0; $i < $Statement->num_rows; $i++ ) { $Metadata = $Statement->result_metadata(); $PARAMS = array(); while ( $Field = $Metadata->fetch_field() ) { $PARAMS[] = &$RESULT[ $i ][ $Field->name ]; } call_user_func_array( array( $Statement, 'bind_result' ), $PARAMS ); $Statement->fetch(); } return $RESULT; } 

Mysqlnd के साथ आप सामान्य रूप से करते हैं:

 $Statement = $Database->prepare( 'SELECT x FROM y WHERE z = ?' ); $Statement->bind_param( 's', $z ); $Statement->execute(); $Result = $Statement->get_result(); while ( $DATA = $Result->fetch_array() ) { // Do stuff with the data } 

और बिना mysqlnd:

 $Statement = $Database->prepare( 'SELECT x FROM y WHERE z = ?' ); $Statement->bind_param( 's', $z ); $Statement->execute(); $RESULT = get_result( $Statement ); while ( $DATA = array_shift( $RESULT ) ) { // Do stuff with the data } 

तो उपयोग और वाक्यविन्यास लगभग समान हैं। मुख्य अंतर यह है कि प्रतिस्थापन फ़ंक्शन किसी परिणाम ऑब्जेक्ट की बजाय परिणाम सरणी देता है।

मुझे एक ही समस्या का सामना करना पड़ा और mysqli :: get_result के साथ क्या गलत है इसका उत्तर दिए गए कोड का उपयोग करके इसे हल किया गया ?

मेरा कार्य इस तरह दिखता है (त्रुटि संभालना स्पष्टता के लिए छीन लिया गया है):

  function db_bind_array($stmt, &$row) { $md = $stmt->result_metadata(); $params = array(); while($field = $md->fetch_field()) { $params[] = &$row[$field->name]; } return call_user_func_array(array($stmt, 'bind_result'), $params); } function db_query($db, $query, $types, $params) { $ret = FALSE; $stmt = $db->prepare($query); call_user_func_array(array($stmt,'bind_param'), array_merge(array($types), $params)); $stmt->execute(); $result = array(); if (db_bind_array($stmt, $result) !== FALSE) { $ret = array($stmt, $result); } $stmt->close(); return $ret; } 

इस तरह से उपयोग:

  $userId = $_GET['uid']; $sql = 'SELECT name, mail FROM users WHERE user_id = ?'; if (($qryRes = db_query($db, $sql, 'd', array(&$userId))) !== FALSE) { $stmt = $qryRes[0]; $row = $qryRes[1]; while ($stmt->fetch()) { echo '<p>Name: '.$row['name'].'<br>' .'Mail: '.$row['mail'].'</p>'; } $stmt->close(); } 

मुझे mysqli_stmt :: get_result के लिए एपीआई दस्तावेज़ीकरण पृष्ठ पर नोट के रूप में तैनात गुमनाम सलाह मिलती है (मैं किसी चालक की तुलना में बेहतर तरीके से नहीं सोच सकता), क्योंकि हम अक्सर हमारे परिणाम पर fetch_array () चाहते हैं हालांकि, क्योंकि मैं एक जेनेरिक डाटाबेस ऑब्जेक्ट को पूरा करना चाहता था, मुझे यह एक समस्या मिली जो कोड को संख्यात्मक सरणी मानता था, सभी कॉलइट्स के लिए ठीक था, और मुझे सभी कॉल करने वालों को केवल एशोक सरणियों का उपयोग करने की आवश्यकता थी मैं इस के साथ आया था:

 class IImysqli_result { public $stmt, $ncols; } class DBObject { function iimysqli_get_result($stmt) { $metadata = $stmt->result_metadata(); $ret = new IImysqli_result; if (!$ret || !$metadata) return NULL; //the latter because this gets called whether we are adding/updating as well as returning $ret->ncols = $metadata->field_count; $ret->stmt = $stmt; $metadata->free_result(); return $ret; } //this mimics mysqli_fetch_array by returning a new row each time until exhausted function iimysqli_result_fetch_array(&$result) { $stmt = $result->stmt; $stmt->store_result(); $resultkeys = array(); $thisName = ""; for ( $i = 0; $i < $stmt->num_rows; $i++ ) { $metadata = $stmt->result_metadata(); while ( $field = $metadata->fetch_field() ) { $thisName = $field->name; $resultkeys[] = $thisName; } } $ret = array(); $code = "return mysqli_stmt_bind_result(\$result->stmt "; for ($i=0; $i<$result->ncols; $i++) { $ret[$i] = NULL; $theValue = $resultkeys[$i]; $code .= ", \$ret['$theValue']"; } $code .= ");"; if (!eval($code)) { return NULL; } // This should advance the "$stmt" cursor. if (!mysqli_stmt_fetch($result->stmt)) { return NULL; } // Return the array we built. return $ret; } }