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

Indsæt store mængder variabler i tabellen ved hjælp af PDO

Dynamisk forberedte forespørgsler

Du kan bygge din forespørgsel dynamisk fra $_POST array:

Men stol ALDRIG på brugerinput, hvilket betyder, at du ikke kan stole på, at data i $_POST vil indeholde gyldige kolonnenavne.

1. Rengør postdataene

Du kan definere et array af hvidlistede kolonnenavne $whitelist = array('field1', 'field2', ...) , og brug derefter:

$data = array_intersect_key($_POST, array_flip($whitelist));

for at finde skæringspunktet mellem de hvidlistede kolonner og dit $_POST-array. (Tak @BillKarwin)

2. Byg forespørgslen

private function buildInsertSql($data, $table) {
    $columns = "";  
    $holders = "";  
    foreach ($data as $column => $value) {  
       $columns .= ($columns == "") ? "" : ", ";  
       $columns .= $column;  
       $holders .= ($holders == "") ? "" : ", ";  
       $holders .= ":$column";  
    }  
    $sql = "INSERT INTO $table ($columns) VALUES ($holders)";  
    return $sql; 
}

Dette vil give dig en SQL-sætning af formen:

$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)

og forbered erklæringen:

$stmt = $dbh->prepare($sql);

3. Bind parametre

Du kan derefter dynamisk binde parametre til pladsholderne:

foreach ($data as $placeholder => $value) {
    $stmt->bindValue(":$placeholder", $value);
 }

og udfør det:

$stmt->execute();

Lidt mere avanceret...



  1. Avanceret SQL:CROSS APPLY og OUTER APPLY

  2. REPLACE() Funktion i Oracle

  3. SQL Call Stored Procedure for hver række uden brug af en markør

  4. mysql Tæl flere forekomster af multipleksede poster