Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एकाधिक चयन फ़ील्ड से डेटा को संभालना

सबसे पहले और सबसे महत्वपूर्ण:

यह पहले से कहीं अधिक महत्वपूर्ण हो गया है कि आप इस सलाह का पालन करें, ext/MySQL को अब बहिष्कृत कर दिया गया है और इसका उपयोग करने से E_DEPRECATED उत्सर्जित होगा PHP 5.5 से शुरू होने वाली त्रुटियां, इसे एक दिन मूल भाषा से पूरी तरह से हटा दिया जाएगा। ऐसा कहने के बाद, निम्नलिखित सभी डेटाबेस के लिए सभी ड्राइवरों पर लागू होता है।

इस शेष स्पष्टीकरण के लिए मैं मान लूंगा कि आप किसी कारण से MySQLi या PDO का उपयोग करने में असमर्थ हैं (ध्यान दें कि केवल यहां संतोषजनक कारण यह है कि वे उपलब्ध नहीं हैं, "मुझे नहीं पता कि उनका उपयोग कैसे करना है" कोई बहाना नहीं है) और आपको ext/MySQL का उपयोग करने के लिए मजबूर होना पड़ता है। यदि आप किसी भी नए ड्राइवर का उपयोग करने में सक्षम हैं, तो आप तैयार किए गए कथनों का उपयोग करने में सक्षम हैं, और इनमें से कोई भी लागू नहीं होता है। तो, इसे ध्यान में रखते हुए...

आगे आइए एक नजर डालते हैं कि पिछले उत्तर में क्या गलत है। यह उपयोगकर्ता इनपुट से बचने के आसपास केंद्रित है। यह mysql_real_escape_string() . का उपयोग करता है एक ऐसा तरीका है जिसका वास्तव में कोई मतलब नहीं है। इसका उपयोग एक स्ट्रिंग अक्षर से बचने के लिए किया जाना चाहिए, और बिल्कुल कुछ और नहीं। इसका उपयोग संख्याओं से प्रभावी ढंग से बचने के लिए नहीं किया जा सकता है, और इसका उपयोग SQL के उन हिस्सों से बचने के लिए नहीं किया जा सकता है जो न केवल मान हैं।

निम्नलिखित दो कोड स्निपेट ऐसा करने का सही तरीका दिखाते हैं, जो इस बात पर निर्भर करता है कि डेटा क्या है और, महत्वपूर्ण रूप से, इसका प्रकार।

यदि मान स्ट्रिंग्स हैं (आमतौर पर एक CHAR .) तो हम यहां क्या करेंगे या VARCHAR फ़ील्ड):

// First create an array of individually escaped values with quotes added
$deds = array();
foreach ($_POST['deductions'] as $ded) {
  $deds[] = "'".mysql_real_escape_string($ded)."'";
}

// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);

// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";

लेकिन अक्सर इस परिदृश्य में, मान केवल संख्याएँ होंगे, और इस मामले में हमें केवल यह सुनिश्चित करने की ज़रूरत है कि PHP सही डेटा प्रकार के साथ उनका प्रतिनिधित्व कर रहा है, क्योंकि वे स्वचालित रूप से सुरक्षित रहेंगे जब उन्हें वापस स्ट्रिंग में परिवर्तित किया जाएगा। क्वेरी में प्रयुक्त:

// First convert the array values to integers
$deds = array();
foreach ($_POST['deductions'] as $ded) {
  $deds[] = (int) $ded;
}

// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);

// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";

यह कोड स्पष्ट रूप से मानता है कि डेटा एक पूर्णांक प्रकार का है, फ्लोट को आसानी से (int) बदलकर नियंत्रित किया जा सकता है (float) . पर कास्ट करें ।

यह भी ध्यान देने योग्य है कि स्ट्रिंग दृष्टिकोण को संख्यात्मक मानों के लिए भी सुरक्षित और सफलतापूर्वक उपयोग किया जा सकता है, क्योंकि MySQL भी मानों को सही प्रकार में परिवर्तित कर देगा। लेकिन सामान्य तौर पर क्वेरी के भीतर सही प्रकार के प्रतिनिधित्व के साथ डेटा को पास करना बेहतर और अधिक कुशल होता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कौन से वर्ण वास्तव में MySQL में SQL इंजेक्शन उत्पन्न करने में सक्षम हैं?

  2. एक mysql डेटाबेस से दूसरे mysql डेटाबेस में टेबल कॉपी कैसे करें?

  3. MySQL की नई हीटवेव को समझना

  4. एक mysql तालिका में php से श्रेणी का नाम स्टोर करने का सबसे अच्छा तरीका

  5. सफल निष्पादन के बाद मेरी नोडज स्क्रिप्ट अपने आप बाहर नहीं निकल रही है