Если каждый тип столбца имеет значение PDO::PARAM_STR
, тогда довольно просто привязать ваши параметры к неименованным маркерам параметров, используя PDOStatement :: execute .Однако, если типы столбцов различаются, вам необходимо указать тип столбца для каждого столбца при привязке к нему с помощью PDOStatement :: bindParam .
Принятие имен таблиц и столбцов из отображаемогобыть пользовательским вводом, не очень хорошая идея.Запрос не будет выполнен, если имена таблиц или столбцов неверны, но вы должны быть очень осторожны, чтобы обеспечить безопасное использование имен таблиц и столбцов.В следующем примере проверяются имена таблиц и столбцов по белому списку перед выполнением любого SQL:
function insert($postValues, $table) {
$dbh = $this->connect();
// Create a simple whitelist of table and column names.
$whitelist = array('my_table' => array('col1', 'col2', 'col3'));
// Check if the table name exists in the whitelist.
if(!array_key_exists($table, $whitelist)) {
exit("$table is not a valid table name.\n");
}
// Count the number of columns that are found in the whitelist.
$cols = count(
array_intersect(
$whitelist[$table],
array_keys($postValues)));
if($cols !== count($postValues)) {
exit("One or more invalid column names have been supplied.\n");
}
// Create a comma separated list of column names.
$columns = implode(', ', array_keys($postValues));
// Create a comma separated list of unnamed placeholders.
$params = implode(', ', array_fill(0, count($postValues), '?'));
// Create a SQL statement.
$sql = "INSERT INTO $table ($columns) VALUES ($params)";
// Prepare the SQL statement.
$stmt = $dbh->prepare($sql);
// Bind the values to the statement, and execute it.
return $stmt->execute(array_values($postValues));
}
echo insert(
array(
'col1' => 'value1',
'col2' => 'value2',
'col3' => 'value3'),
'my_table');
// 1
echo insert(
array(
'col1' => 'value1',
'col2' => 'value2',
'col3' => 'value3'),
'unsafe_table');
// unsafe_table is not a valid table name.
echo insert(
array(
'col1' => 'value1',
'col2' => 'value2',
'unsafe_col' => 'value3'),
'my_table');
// One or more invalid column names have been supplied.