2009-09-08 17 views
90

मैं इस कोड का उपयोग कर रहा है और मैं निराशा से परे हूँ:मैं पीडीओ का उपयोग करके नल मूल्य कैसे डालूं?

try { 
    $dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'"); 
} 
catch(PDOException $e) 
{ 
    ... 
} 
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)'); 
$stmt->bindParam(':v1', PDO::PARAM_NULL); // --> Here's the problem 

PDO::PARAM_NULL, null, '', उन सभी को असफल और इस त्रुटि फेंक:

Fatal error: Cannot pass parameter 2 by reference in /opt/...

उत्तर

116

मैं सिर्फ पीडीओ सीख रहा हूँ, लेकिन मुझे लगता है आप bindValue, नहीं bindParam

bindParam एक चर लेता है उपयोग करने के लिए, संदर्भित करने के लिए की जरूरत है, और bindParam बुला के समय में एक मूल्य में खींच नहीं करता है। मैंने इसे php दस्तावेज़ों पर एक टिप्पणी में पाया:

bindValue(':param', null, PDO::PARAM_INT); 

संपादित करें: पीएस आप इस bindValue(':param', null, PDO::PARAM_NULL); करने के लिए परीक्षा जा सकता है, लेकिन यह हर किसी के लिए काम नहीं किया (धन्यवाद आप रिपोर्टिंग के लिए शेवर जाएगा।)

+0

मुझे यकीन नहीं है कि उन दोनों के बीच का अंतर है, लेकिन मैं कुछ की जांच करूंगा। धन्यवाद, आपका जवाब भी बहुत अच्छा था। – Nacho

+3

मुझे लगता है कि यह मेरा से बेहतर जवाब हो सकता है (यदि यह वास्तव में काम करता है) –

+0

PHP 5.3.8 + MySQL पर मेरे परीक्षण दिखाते हैं कि दोनों के बीच उत्पन्न क्वेरी में कोई अंतर नहीं है। महत्वपूर्ण हिस्सा यह प्रतीत होता है कि उत्तीर्ण मूल्य पूर्ण है और नहीं '' या '0' – Odin

42

जब bindParam() का उपयोग कर आप एक चर में पारित करना होगा, नहीं निरंतर। ताकि लाइन इससे पहले कि आप अगर आप की कोशिश की एक चर बना सकते हैं और सेट करने के लिए यह null

$myNull = null; 
$stmt->bindParam(':v1', $myNull, PDO::PARAM_NULL); 

आप एक ही त्रुटि संदेश मिलता है की जरूरत है:

$stmt->bindParam(':v1', 5, PDO::PARAM_NULL); 
+0

आपको यह अधिकार मिला, मुझे लगा कि मैंने इसे अपने कोड में पहले किया था, $ null = PDO :: PARAM_NULL; धन्यवाद। – Nacho

+1

यदि आप प्लेसहोल्डर्स को वैसे भी बनाने जा रहे हैं, तो इस मामले में bindValue() का उपयोग करना बेहतर है। bindParam() मूल रूप से एक क्वेरी निष्पादित करने के लिए है, और उसके बाद वेरिएबल्स को फिर से निष्पादित करें और पैरामीटर को बाध्य किए बिना फिर से निष्पादित करें। bindValue() तुरंत बांधता है, bindParam() केवल निष्पादन पर। –

+0

मैंने पाया कि $ myNull = null line में शून्य कम होना चाहिए। $ myNull = NULL काम नहीं किया। – raphael75

24

जब INTEGER स्तंभों का उपयोग MySQL में (कि NULL हो सकता है), पीडीओ कुछ (मेरे लिए) अप्रत्याशित व्यवहार है ।

आप $stmt->execute(Array) का उपयोग करते हैं, तो आप शाब्दिक NULL निर्दिष्ट करने के लिए है और चर संदर्भ द्वारा NULL नहीं दे सकता। तो यह काम करेगा नहीं:

// $val is sometimes null, but sometimes an integer 
$stmt->execute(array(
    ':param' => $val 
)); 
// will cause the error 'incorrect integer value' when $val == null 

लेकिन यह काम करेगा:

// $val again is sometimes null, but sometimes an integer 
$stmt->execute(array(
    ':param' => isset($val) ? $val : null 
)); 
// no errors, inserts NULL when $val == null, inserts the integer otherwise 

MySQL 5.5.15 पर इस कोशिश की पीएचपी 5.4.1

+0

$ stmt-> निष्पादित करें (सरणी ( ': param' =>! खाली ($ val)? $ Val: शून्य ); खाली उपयोग करें क्योंकि खाली स्ट्रिंग के लिए आप डेटाबेस –

+0

@ शहेज़ादनिज़ामनी में भी शून्य सेट करना चाहते हैं, केवल कॉलम प्रकार पूर्णांक है, जैसे कि उसके उदाहरण में, हाँ। लेकिन अन्यथा 'जारी()' 'NULL' से बेहतर है। एक खाली स्ट्रिंग भी एक मान है। – StanE

5

साथ जो लोग अभी भी समस्या है के लिए (संदर्भ द्वारा पैरामीटर 2 पारित नहीं कर सकते हैं), शून्य मान के साथ एक चर को परिभाषित, बस पीडीओ को अशक्त पारित नहीं:

bindValue(':param', $n = null, PDO::PARAM_INT); 

उम्मीद है कि यह मदद करता है।

3

आप NULL डालने केवल जब valueempty या '' है, लेकिन value डालने जब यह उपलब्ध है चाहते हैं।

ए) POST विधि का उपयोग कर फॉर्म डेटा प्राप्त करता है, और उन मानों के साथ फ़ंक्शन सम्मिलित करता है।

insert($_POST['productId'], // Will be set to NULL if empty  
     $_POST['productName']); // Will be to NULL if empty         

बी) का मूल्यांकन करता है, तो एक क्षेत्र उपयोगकर्ता द्वारा भरा नहीं था, और NULL सम्मिलित करता है यदि ऐसा है।

public function insert($productId, $productName) 
{ 
    $sql = "INSERT INTO products ( productId, productName) 
       VALUES (:productId, :productName)"; 

    //IMPORTANT: Repace $db with your PDO instance 
    $query = $db->prepare($sql); 

    //Works with INT, FLOAT, ETC. 
    $query->bindValue(':productId', !empty($productId) ? $productId : NULL, PDO::PARAM_INT); 

    //Works with strings. 
    $query->bindValue(':productName',!empty($productName) ? $productName : NULL, PDO::PARAM_STR); 

    $query->execute();  
} 

उदाहरण के लिए, उपयोगकर्ता प्रपत्र के productName मैदान पर नहीं इनपुट कुछ भी है, तो $productNameSET लेकिन EMPTY हो जाएगा। इसलिए, आपको यह जांचना होगा कि यह empty() है, और यदि ऐसा है, तो NULL डालें।

पीएचपी 5.5.17

गुड लक पर परीक्षण किया गया,

+1

या, आप क्वेरी स्ट्रिंग में MySQL के 'IFNULL()' फ़ंक्शन का उपयोग कर सकते हैं। इस तरह: '$ sql =" उत्पादों (उत्पाद आईडी, उत्पाद नाम) में प्रवेश करें, मूल्य (IFNULL (: उत्पाद आईडी, न्यूल), IFNULL (: productName, NULL)) ";' – starleaf1

+0

मुझे आपके समाधान की सफाई पसंद है। मैंने अभी इसका परीक्षण किया है, लेकिन दुर्भाग्यवश यह शून्य पर बदले खाली स्ट्रिंग डालता है जब उपयोगकर्ता इनपुट पर कुछ भी नहीं लिखता है। यह सिर्फ वरीयता का मामला है, लेकिन मेरे पास खाली तारों के बजाय न्यूल हैं। –

6

मैं एक ही समस्या थी और मैं इस समाधान bindParam के साथ काम कर पाया:

bindParam(':param', $myvar = NULL, PDO::PARAM_INT); 
-1

यह कोशिश करो।

$stmt->bindValue(':v1', null, PDO::PARAM_NULL); // --> insert null 
+0

ऐसे पुराने प्रश्न का उत्तर देने का प्रयास करने से पहले, आपको पहले अन्य उत्तरों पढ़ना चाहिए। हो सकता है कि इसका उत्तर पहले ही दिया जा चुका है। –

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