आपका $userData
बिल्कुल वही प्लेसहोल्डर होना चाहिए जो आपके कथन से बंधे हों, न अधिक और न कम। देखें PDOStatement::execute
दस्तावेज़ीकरण
, वह भाग जो कहता है "आप निर्दिष्ट से अधिक मानों को बाध्य नहीं कर सकते"।
आपको execute()
. के लिए अपना तर्क तैयार करना होगा अपने बाइंड्स से बिल्कुल मेल खाने के लिए। यह array_intersect_key()
. के साथ आसान है यदि आप अपने सरणियों को सही ढंग से व्यवस्थित करते हैं। मैं आमतौर पर इसे एक फ़ंक्शन में लपेटता हूं जो नीचे की तरह उपसर्ग का भी ध्यान रखेगा:
// Adds a prefix to a name for a named bind placeholder
function prefix($name) {
return ':'.$name;
}
// like 'prefix()', but for array keys
function prefix_keys($assoc) {
// prefix STRING keys
// Numeric keys not included
$newassoc = array();
foreach ($assoc as $k=>$v) {
if (is_string($k)) {
$newassoc[prefix($k)] = $v;
}
}
return $newassoc;
}
// given a map of datakeyname=>columnname, and a table name, returns an
// sql insert string with named bind placeholder parameters.
function makeInsertStmt($tablename, $namemap) {
$binds = array_map('prefix', array_keys($namemap));
return 'INSERT INTO '.$tablename.' ('.implode(',',$namemap).') VALUES ('
.implode(',',$binds).')';
}
// returns an array formatted for an `execute()`
function makeBindData($data, $namemap) {
// $data assoc array, $namemap name->column mapping
return prefix_keys(array_intersect_key($data, $namemap));
}
// example to demonstrate how these pieces fit together
function RunTestInsert(PDO $pdo, $userData) {
$tablename = 'UserDetails';
// map "key in $userData" => "column name"
// do not include ':' prefix in $userData
$namemap = array(
'firstName' => "FirstName",
'lastName' => "LastName",
'address' => "Address",
'city' => "City",
'county' => "County",
'postCode' => "PostCode",
'phone' => "Phone",
'mobile' => "Mobile",
'sex' => "Sex",
'DOB' => "DOB",
'fundraisingAim' => "FundraisingAim",
'weeksAim' => "WeeksAim",
'lengthsAim' => "LengthsAim",
'hearAbout' => "HearAboutID",
'motivation' => "MotivationID",
'welcomePackPref' => "WelcomePackID",
'contactPref' => "ContactPrefID",
'title' => "TitleID",
);
$sql = makeInsertStmt($tablename, $namemap);
$binddata = makeBindData($userData, $namemap);
$pstmt = $pdo->prepare($sql);
$pstmt->execute($binddata);
}
इस तरह के एब्स्ट्रैक्शन का लाभ यह है कि आपको स्वयं बाइंड पैरामीटर के बारे में चिंता करने की आवश्यकता नहीं है।