sql >> Databáze >  >> RDS >> Mysql

Problém s PDO bindParam

PDO váží data hodnot, nikoli názvy tabulek a sloupců.

Špatně chápete použití vázání. Názvy tabulek a sloupců nelze svázat s PDO. Svážete data, která chcete vložit DO těchto sloupců. Musíte vytvořit SQL tak, aby zahrnoval názvy tabulek a sloupce pomocí řetězcových operací.

Formátujte data

Přejmenoval jsem váš $column a $value na $column_array, $value_array, aby bylo jasné, co to je, a předpokládal jsem, že každé je jednoduché pole:$column_array = array('column1', 'column2', ...) etc.

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

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

$placeholders nyní vypadá takto:

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

$bindvalues ​​nyní vypadá takto:

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

Stavět, připravit, spustit

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

Tím získáte připravený výpis formuláře:

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

Poté můžete provést připravený příkaz a předat $values ​​jako argument.

$sql->execute($bindValues);

Poznámka:

  • Jedno upozornění, které je třeba zmínit. Ujistěte se, že vaše původní data byla dezinfikována proti SQL Injection. O to se u vázaných hodnot postarají PDO, ale pokud sloupce vytváříte například z dat $_POST, je to zranitelné a je třeba je dezinfikovat.


  1. Jak lze vytvořit index v části data pole DATETIME v MySql

  2. Je možné použít MySql uživatelem definovanou proměnnou v .NET MySqlCommand?

  3. Minimalizace dopadu rozšíření sloupce IDENTITY – část 4

  4. Spouštění migrací s Rails v kontejneru Docker s více instancemi kontejneru