sql >> Databasteknik >  >> RDS >> Mysql

Problem med PDO bindParam

PDO:er binder värdedata, inte tabell- och kolumnnamn.

Du missförstår användningen av bindningar. Du kan inte binda tabell- och kolumnnamn med PDO. Du binder data för att infoga I dessa kolumner. Du måste konstruera SQL så att den inkluderar tabellnamn och kolumner med hjälp av strängoperationer.

Formatera data

Jag har bytt namn på din $column och $value till $column_array, $value_array för att göra det tydligt vad de är, och antagit att var och en är en enkel array:$column_array = array('column1', 'column2', ...) etc.

$placeholders = array_map(function($col) { return ":$col"; }, $column_array);

$bindvalues = array_combine($placeholders , $value_array);

$placeholders ser nu ut så här:

$placeholders = array(
        ':column1',
        ':column2',
         ...
    );

$bindvalues ​​ser nu ut så här:

$bindvalues = array(
        ':column1'=>'value1',
        ':column2'=>'value2',
         ...
    );

Bygg, förbered, utför

$sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")";

Detta kommer att ge dig en förberedd redogörelse för formuläret:

$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)

Du kan sedan köra den förberedda satsen och skicka $värdena som ett argument.

$sql->execute($bindValues);

Obs!

  • En varning som måste nämnas. Se till att dina ursprungliga data har sanerats mot SQL Injection. PDO:er tar hand om det för de bundna värdena, men om du konstruerar kolumnerna från till exempel $_POST-data är detta sårbart och måste saneras.


  1. MySQL motsvarighet till ORACLES rank()

  2. Hur implementerar man SQLite-databas för att lagra bitmappsbild och text?

  3. MySQL - Hur ökar man varchar-storleken på en befintlig kolumn i en databas utan att bryta befintliga data?

  4. MySQL-index för MIN och MAX