sql >> Databasteknik >  >> RDS >> Mysql

PHP/SQL-infogningsfel vid användning av namngivna platshållare

Din $userData måste ha exakt samma platshållare bundna av ditt uttalande, varken fler eller färre. Se PDOStatement::execute dokumentation , delen som säger "Du kan inte binda fler värden än vad som anges".

Du måste förbereda ditt argument för att execute() för att matcha dina bindningar exakt. Detta är enkelt med array_intersect_key() om du ordnar dina arrayer rätt. Jag brukar slå in det här i en funktion som också tar hand om prefix, som nedan:

// Lägger till ett prefix till ett namn för ett namngivet bind platshållarfunktion prefix($name) { return ':'.$name;}// som 'prefix()', men för array keysfunction prefix_keys($ assoc) { // prefix STRING-nycklar // Numeriska nycklar ingår inte $newassoc =array(); foreach ($assoc som $k=>$v) { if (is_string($k)) { $newassoc[prefix($k)] =$v; } } returnerar $newassoc;}// med en karta över datakeyname=>kolumnnamn och ett tabellnamn, returnerar en// sql insert-sträng med namngivna bind platshållare parametrar.function makeInsertStmt($tablename, $namemap) { $binds =array_map ('prefix', array_keys($namemap)); returnera 'INSERT INTO '.$tabellnamn.' ('.implode(',',$namemap).') VÄRDEN (' .implode(',',$binds).')';}// returnerar en array formaterad för en `execute()`funktion makeBindData( $data, $namemap) { // $data assoc array, $namemap name->column mapping return prefix_keys(array_intersect_key($data, $namemap));}// exempel för att visa hur dessa bitar passar ihopfunktion RunTestInsert(PDO $pdo , $userData) { $tablename ='Användardetaljer'; // map "key in $userData" => "kolumnnamn" // inkludera inte prefixet ':' i $userData $namemap =array( 'firstName' => "FirstName", 'lastName' => "Efternamn", 'address' => "Adress", 'city' => "Stad", 'county' => "County", 'postCode' => "Postnummer", 'phone' => "Telefon", 'mobil' => "Mobil", 'sex' => "Sex", 'DOB' => "DOB", 'fundraisingAim' => "FundraisingAim", 'weeksAim' => "WeeksAim", 'lengthsAim' => "LengthsAim", ' hearAbout' => "HearAboutID", 'motivation' => "Motivations-ID", 'welcomePackPref' => "WelcomePackID", 'contactPref' => "ContactPrefID", 'title' => "Titel-ID", ); $sql =makeInsertStmt($tabellnamn, $namnkarta); $binddata =makeBindData($userData, $namemap); $pstmt =$pdo->prepare($sql); $pstmt->execute($binddata);}

Fördelen med en abstraktion som denna är att du inte behöver oroa dig för själva bindningsparametrarna.



  1. 2 sätt att returnera ASCII-koden för en given karaktär i MariaDB

  2. SQLException:Före start av resultatuppsättning

  3. Välj N:te raden från en tabell i Oracle

  4. Ett prestationsfuskblad för PostgreSQL