Я хочу использовать подготовленные инструкции PDO, но я нахожу, что это действительно занимает много времени. было бы очень полезно, если бы была функция, просто передающая следующий ассоциативный массив:
array( "title"=>$title "userid"=>$userid "post"=>$body )
Помня о том, что ключи в массиве всегда соответствуют строкам таблицы SQL. повторяя все, это должно отключить попытку ввести :foo
и снова ввести их в функцию выполнения.
Я специально говорю о запросе INSERT.
Как это сделать?
function pdo_insert($table, $arr=array()) { if (!is_array($arr) || !count($arr)) return false; // your pdo connection $dbh = '...'; $bind = ':'.implode(',:', array_keys($arr)); $sql = 'insert into '.$table.'('.implode(',', array_keys($arr)).') '. 'values ('.$bind.')'; $stmt = $dbh->prepare($sql); $stmt->execute(array_combine(explode(',',$bind), array_values($arr))); if ($stmt->rowCount() > 0) { return true; } return false; } pdo_insert($table, array('title'=>$title, 'userid'=>$user_id, 'post'=>$body));
Усовершенствованная функция PDO Insert, которая также учитывает безопасность, предотвращая атаки SQL Injection:
// Insert an array with key-value pairs into a specified database table (MySQL). function pdo_insert($dbh,$table,$keyvals) { $sql = sprintf("INSERT INTO %s ( `%s` ) %sVALUES ( :%s );", $table, implode("`, `", array_keys($keyvals)), PHP_EOL, implode(", :", array_keys($keyvals)) ); $stmt = $dbh->prepare($sql); foreach ($keyvals as $field => $value) { $stmt->bindValue(":$field", $value, PDO::PARAM_STR); } $stmt->execute(); return $dbh->lastInsertId(); } // Convert special characters to HTML safe entities. function h($str) { return trim(stripslashes(htmlspecialchars($str, ENT_QUOTES, 'utf-8'))); }
Пример:
$dbh = new PDO($dsn); $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $keyvals = [ 'id' => isset($_POST['id']) ? h( $_POST['id'] ) : null, 'title' => isset($_POST['title']) ? h( $_POST['title'] ) : null, 'description' => isset($_POST['description']) ? h( $_POST['description'] ) : null, 'created_at' => time(), 'created_by' => 1, ]; $last_ids[] = pdo_insert($dbh,'products',$keyvals);