ホームページ > データベース > mysql チュートリアル > PHP SQL プリペアドステートメントを使用するときにコードの繰り返しを回避するにはどうすればよいですか?

PHP SQL プリペアドステートメントを使用するときにコードの繰り返しを回避するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-29 03:22:10
オリジナル
406 人が閲覧しました

How to Avoid Code Repetition When Using PHP SQL Prepared Statements?

PHP SQL プリペアド ステートメントでコードの繰り返しを回避する方法

プリペアド ステートメントは、SQL インジェクション攻撃を防ぐために非常に重要です。ただし、特に多数の列がある場合には、過剰なコードの冗長性が生じる可能性があります。この問題に対処するには、繰り返しを最小限に抑えるためのいくつかのアプローチがあります。

1. Raw PHP

このアプローチでは、位置プレースホルダーを利用し、クエリ内のフィールド名句を省略し、欠落しているフィールドのデフォルト値に依存します。例:

$data = [$taskName, $startDate, $completedDate];
$sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)';
$db->prepare($sql)->execute($data);
ログイン後にコピー

2.ヘルパー関数

テーブル名と、フィールド名をキーとして、値を値として持つデータ配列を受け入れるヘルパー関数を作成できます。この関数は、SQL インジェクション防止のためにフィールド名を適切にエスケープするためにヘルパー関数を利用する必要があります:

function prepared_insert($conn, $table, $data) {
    $keys = array_map('escape_mysql_identifier', array_keys($data));
    $fields = implode(",", $keys);
    $table = escape_mysql_identifier($table);
    $placeholders = str_repeat('?,', count($keys) - 1) . '?';
    $sql = "INSERT INTO $table ($fields) VALUES ($placeholders)";
    $conn->prepare($sql)->execute(array_values($data));
}

// Usage:
prepared_insert($db, 'tasks', [
    'task_name' => $taskName,
    'start_date' => $startDate,
    'completed_date' => $completedDate,
]);
ログイン後にコピー

3. Baby ORM

このアプローチでは、オブジェクト指向プログラミングを使用して、繰り返しをさらに減らします。すべてのテーブルに共通のメソッドを使用してプロトタイプ クラスが作成され、テーブル名と列のリストを使用して特定のテーブル クラスが定義されます。挿入コードは次のようになります:

$data = [
    'email' => 'email',
    'password' => 123,
    'name' => 'Fooster',
];

$userGateway = new UserGateway($pdo);

$id = $userGateway->create($data);
echo "Create: $id\n";
ログイン後にコピー

プロトタイプ クラス:

class BasicTableGateway {
    public function create($data): int
    {
        $fields = $this->makeFieldList($data);
        $placeholders = str_repeat('?,', count($data) - 1) . '?';

        $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)";
        $this->sql($sql,array_values($data));

        return $this->db->lastInsertId();
    }
}
ログイン後にコピー

特定のテーブル クラス:

class UserGateway extends BasicTableGateway {
    protected $table = 'gw_users';
    protected $fields = ['email', 'password', 'name', 'birthday'];
}
ログイン後にコピー

以上がPHP SQL プリペアドステートメントを使用するときにコードの繰り返しを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート