2

PHP配列の$_POSTコンテンツをPDOを使用してテーブルに挿入しています。私は次のコード行を見ていましたが、「これを行うにはもっと良い方法が必要だ」という瞬間がありました。キー名がテーブルの列名と一致する場合、すべてを挿入するより簡単な方法はありますか?

例のコード:

$statement = $db->prepare("INSERT INTO `applications`(`username`, `email`, `password`, `name`) VALUES (?,?,?,?)");

$statement->execute(array($_POST['username'], $_POST['email'],$_POST['password'],$_POST['name']));

このコードは機能しますが、少しやり過ぎのようです(特に、列が追加されるにつれて)。

4

1 に答える 1

13

私はそれをこのようにします:

最初に列を宣言します。これらを使用して、列として使用する$_POSTのサブセットを抽出します。そうしないと、ユーザーがテーブルのどの列とも一致しない偽のリクエストパラメータを渡す可能性があり、SQLが破損する可能性があります。

$columns = array('username','email','password','name');
$column_list = join(',', $columns);

名前付きパラメーターのプレースホルダーを作成します:username

$param_list = join(',', array_map(function($col) { return ":$col"; }, $columns));

SQLを個別に作成します。これは、SQLが独自の変数に含まれていると、読み取りとデバッグが容易になるためです。

$sql = "INSERT INTO `applications` ($column_list) VALUES ($param_list)";

prepare()およびから返されたエラーステータスを常にexecute()確認してください。

$statement = $db->prepare($sql);
if ($statement === false) {
  die(print_r($db->errorInfo(), true));
}

ここでは、挿入する列に一致する$_POSTのフィールドのみを取得します。

$param_values = array_intersect_key($_POST, array_flip($columns));

そして、その配列をに渡しexecute()ます。再度、エラーの戻りステータスを確認します。

$status = $statement->execute($param_values);
if ($status === false) {
  die(print_r($statement->errorInfo(), true));
}
于 2012-11-24T20:37:41.210 に答える