2012-09-10 10 views
20

में एकाधिक मान बाध्यकारी क्या पीडीओ में कई मूल्यों को बाध्य करने का कोई आसान तरीका है? निम्न कोड पर एक नज़र डालें:पीडीओ

$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)"); 

$result_set->bindValue(':username', '~user'); 
$result_set->bindValue(':password', '~pass'); 
$result_set->bindValue(':first_name', '~John'); 
$result_set->bindValue(':last_name', '~Doe'); 

$result_set->execute(); 

यहां, मैंने मानों को दोहराया गया है जो 4 बार है। तो पीडीओ में कई मूल्यों को बाध्य करने का एक आसान तरीका है?

उत्तर

29

तुम हमेशा मूल्यों execute() के तर्कों के भीतर जब तक आप मूल्यों के रूप में PDO::PARAM_STR (स्ट्रिंग) इलाज किया जा रहा के साथ ठीक कर रहे हैं बाध्य कर सकते हैं।

$user = "Nile"; 
$pdo->execute(array(":user" => $user)); 
+0

यह मान्य कैसे है? 'Execute' विधि कोई पैरामीटर नहीं लेती है? – Brett

+1

@ ब्रेट ने आपने चश्मे की जांच की है? यह ... क्वेरी के पैरामीटर को पास करने के लिए आप या तो [PDOStatement :: bindParam() का उपयोग कर सकते हैं या इसे 'execute() 'method] (http://php.net/manual/en/) के माध्यम से पैरामीटर के रूप में पास कर सकते हैं pdostatement.execute.php)। – jeremy

+0

मेरा बुरा, मैं सोच रहा था कि आप [इस] (http://php.net/manual/en/mysqli-stmt.execute.php) के बारे में बात कर रहे थे। – Brett

5

यदि आप प्रकार (स्ट्रिंग, int, आदि) के आधार पर बाध्य करना चाहते हैं, तो नहीं। आप एक स्ट्रिंग के रूप में सब कुछ बंधन के साथ ठीक कर रहे हैं:

$stmt = $db->prepare("..."); 
$stmt->execute(array(
    'foo' => 'bar', 
    'something' => 'else', 
    'third' => 'thing', 
)); 
+1

विल चर के साथ इस काम अगर मैं 'bar'' $ bar' करने के लिए बदल जिसमें 'बार' की एक स्ट्रिंग असाइन की जाती है? –

+1

हाँ, यह ... – jeremy

2

सही मायने में दो बार कुछ भी लिखने कभी नहीं करने के लिए, आप डेटा की आपूर्ति करने एक सरणी का उपयोग कर सकते हैं, और है कि एक ही सरणी पर एक समारोह का उपयोग करें:

$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)"); 
$result_set->execute(array(
    ':username' => '~user', 
    ':password' => '~pass', 
    ':first_name' => '~John', 
    ':last_name' => '~Doe' 
)); 

आप सरणी का उपयोग कर सकते तो बस किसी भी सरणी की तरह पारित कर दिया MySQL क्वेरी के बाध्यकारी भाग को आउटपुट करने के लिए। उदाहरण के लिए:

function bindFields($fields){ 
    end($fields); $lastField = key($fields); 
    $bindString = ' '; 
    foreach($fields as $field => $data){ 
     $bindString .= $field . '=:' . $field; 
     $bindString .= ($field === $lastField ? ' ' : ','); 
    } 
    return $bindString; 
} 

डेटा और स्तंभ नाम एक भी साहचर्य सरणी ($data) से आते हैं। फिर, bindFields($data) का उपयोग column = :column जोड़े की एक स्ट्रिंग उत्पन्न करने के लिए MySQL क्वेरी में जोड़ रहे हैं:

$data = array(
    'a_column_name' => 'column data string', 
    'another_column_name' => 'another column data string' 
); 

$query = "INSERT INTO tablename SET" . bindFields($data); 

$result = $PDO->prepare($query); 
$result->execute($data); 

bindFields($data) उत्पादन:

a_column_name=:a_column_name,another_column_name=:another_column_name 
+0

मैंने मूल रूप से इसे एक अलग प्रश्न/उत्तर ([यहां] (http://stackoverflow.com/questions/23282160/is-there-a-shortcut-for-binding-named-pdo-params-for-mysql के रूप में पोस्ट किया था -इन्सर्ट/23282161)) इस सवाल को खोजने से पहले, लेकिन अब इसे डुप्लिकेट के रूप में चिह्नित किया है। – equazcion