sql >> Database teknologi >  >> RDS >> Mysql

PHP/SQL-indsættelsesfejl ved brug af navngivne pladsholdere

Din $userData skal have nøjagtig de samme pladsholdere bundet af dit udsagn, hverken flere eller færre. Se PDOStatement::execute dokumentation , den del, der siger "Du kan ikke binde flere værdier end specificeret".

Du skal forberede dit argument til at execute() at matche dine binds nøjagtigt. Dette er nemt med array_intersect_key() hvis du arrangerer dine arrays korrekt. Jeg pakker dette normalt ind i en funktion, som også tager sig af præfiks, som nedenfor:

// 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); }

Fordelen ved en abstraktion som denne er, at du ikke behøver at bekymre dig om selve bindeparametrene.



  1. Oprettelse af valgfrie afhængigheder

  2. Afkort alle tabeller i MySQL-databasen, der matcher et navnemønster

  3. uinitialiseret konstant MysqlCompat::MysqlRes (ved hjælp af mms2r gem)

  4. Sådan filtreres poster med aggregatfunktion AVG