2016-01-10 7 views
5

इस पोस्ट में रूप है:पीएचपी पीडीओ bindParam प्रकार प्रबंधन

$funcname->name= htmlentities($_POST['name']); 
$funcname->insert(); 

इस वर्ग funcname पर समारोह डालने जो स्तंभ नामित नाम करने के लिए डेटा सम्मिलित होगा

$this->conn->beginTransaction(); 
$stmt = $this->conn->prepare("INSERT INTO nameTBL (name) values (:name)"; 
$stmt->bindParam(':name', $this->name, PDO::PARAM_INT); 
if ($stmt->execute()) { 
     $this->conn->commit(); //This will save your changes 
     $this->conn->exec('UNLOCK TABLES ' . self::$table_name); 
     header('Location: ../'); 
     exit(); 
} else { 
     $this->conn->rollBack(); //This will undo your changes 
     $this->conn->exec('UNLOCK TABLES ' . self::$table_name); 
     header('Location: ../'); 
     exit(); 
} 

अब सवाल यह है कि मैंने पीडीओ :: PARAM_INT सेट किया है जो वर्णों की अनुमति नहीं देनी चाहिए, बल्कि केवल पूर्णांक क्यों मैं डेटाबेस (तालिका) में पाठ पोस्ट करने में सक्षम हूं?

क्या कोई है कि मैं यहां बिंदपाराम पर डेटा प्रकार को अत्यधिक प्रतिबंधित कैसे कर सकता हूं।

अग्रिम धन्यवाद।

उत्तर

1

आपको अपने कोड में कई गलतियां हैं।

हालांकि, PDO::PARAM_INT, PDO::PARAM_STR और PDO::PARAM_NULL किस प्रकार के प्रकार MySQL को करने के लिए कह रहे हैं, इस पर जाएं।

उन मूल्यों पीडीओ कह रहे हैं कि कैसे के लिए इनपुट के इलाज के लिए, नहीं इनपुट नामंज़ूर। यदि आप टेक्स्ट भेजते हैं, लेकिन कॉलम int है तो MySQL डेटा को int में समन्वयित करने का प्रयास करेगा। यह आपको नहीं बताएगा "आपने एबीसीडी दर्ज की है लेकिन अपेक्षित मूल्य पूर्णांक था"। PDO पर डेटा पास करने से पहले आपको यह जांच स्वयं ही करनी होगी।

अब पर अन्य समस्याओं:

  • bindParam

    प्रयोग न करें। bindParamसंदर्भ द्वारा मान स्वीकार करता है। यह तब होता है जब आप संग्रहीत प्रक्रियाओं का उपयोग करते हैं और चर को प्रक्रिया के आउटपुट के आधार पर संशोधित किया जाना चाहिए। bindValue का उपयोग करें। आप bindParam साथ निम्नलिखित करने की कोशिश की, तो यह काम करेगा नहीं और आपको कोई त्रुटि मिलती हैं:

    $stmt->bindParam(':my_column', 1, PDO::PARAM_INT); // It fails and yields an error

  • टेबल ताला न करें। आप पहले से ही लेनदेन का उपयोग कर रहे हैं, तालिका को लॉक करने की कोई आवश्यकता नहीं है, MySQL आपके लिए समेकन और पहुंच को संभालता है।

निष्कर्ष - से पहले डालने के लिए PDO का उपयोग कर मान्यता प्रदर्शन करते हैं। PDO आपको कनेक्शन जानकारी (अन्य चीजों के साथ) के आधार पर इनपुट को साफ़ करने में मदद करता है। यह सत्यापन नहीं करेगा।

+0

प्रिय लेकिन बिंदपाराम के साथ मुझे कोई त्रुटि नहीं मिलती है, बस टेक्स्ट मान डेटाबेस में आता है, यहां तक ​​कि MySQL कॉलम पर टाइप भी टेक्स्ट है, इसे कथन निष्पादित नहीं करना चाहिए क्योंकि मैंने पीडीओ प्रकार को int में सेट किया है। तो क्या आपका मतलब है कि मैं bindValue का उपयोग करना चाहिए, कौन सा बेहतर और सुरक्षित है या दोनों समान हैं? – user3286490

+0

'बिंदवेलु' और 'बिंदपाराम' समान नहीं हैं। दोनों समान रूप से "सुरक्षित" हैं, और दोनों क्वेरी में सम्मिलन के लिए इनपुट को साफ़ कर देंगे। दोनों के समान कार्य हस्ताक्षर हैं। आपके मामले में, आप बस 'बिंदपारा'' को 'बाइंडवेल' के साथ स्विच कर सकते हैं। दो कार्य ** ** ** पैरामीटर का अलग-अलग व्यवहार करते हैं। यदि आप केवल मामूली प्रश्न कर रहे हैं (यदि आप कभी भी संग्रहित प्रक्रियाओं का आह्वान नहीं करते हैं) तो 'bindValue' का उपयोग करें।यदि कॉलम टेक्स्ट प्रकार का है, ** ** ** पीडीओ :: PARAM_INT' का उपयोग न करें। ऐसा नहीं है कि यह कैसे काम करता है और यह उस उद्देश्य के लिए नहीं है। यदि आप एक पूर्णांक चाहते हैं, तो php में मजबूती करें (उपयोग '(int) $ variable')। –

+0

$ stmt-> bindValue (': name', $ this-> नाम, पीडीओ :: PARAM_INT); ,,, जब मैं पाठ डालता हूं तो यह इसके बजाय (0) डालेगा ..? ठीक है? – user3286490

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