Maison >base de données >tutoriel mysql >Comment puis-je réduire la répétition du code dans les instructions préparées PHP SQL ?

Comment puis-je réduire la répétition du code dans les instructions préparées PHP SQL ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-26 07:06:13947parcourir

How Can I Reduce Code Repetition in PHP SQL Prepared Statements?

Surmonter les répétitions de code dans les instructions préparées PHP SQL

Dans les instructions préparées PHP SQL typiques, les noms de champs sont mentionnés plusieurs fois, ce qui entraîne une redondance. Pour résoudre ce problème, envisagez les solutions suivantes :

Techniques PHP brutes

  • Omettez la clause des champs dans la requête et ajoutez des valeurs par défaut dans la clause des valeurs pour les champs manquants.
  • Utilisez des espaces réservés positionnels, fournissant une valeur pour toutes les colonnes, y compris les valeurs nulles ou les valeurs par défaut définies dans le tableau définition.
$data = [$taskName, $startDate, $completedDate];
$sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)';
$db->prepare($sql)->execute($data);

Approche de la fonction d'assistance

Créez une fonction d'assistance pour les insertions qui accepte le nom de la table et un tableau de données, en gérant les problèmes d'injection SQL :

function escape_mysql_identifier($field){
    return "`".str_replace("`", "``", $field)."`";
}

function prepared_insert($conn, $table, $data) {
    $keys = array_keys($data);
    $keys = array_map('escape_mysql_identifier', $keys);
    $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));
}
prepared_insert($db, 'tasks',[
    'task_name' => $taskName,
    'start_date' => $startDate,
    'completed_date' => $completedDate,
]);

Programmation orientée objet

Implémenter un bébé ORM en utilisant la programmation orientée objet, en définissant un classe prototype avec des méthodes communes et création de classes spécifiques pour les tables avec le nom de la table et la liste des colonnes.

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'];
}
$data = [
    'email' => '[email protected]',
    'password' => 123,
    'name' => 'Fooster',
];

$userGateway = new UserGateway($pdo);

$id = $userGateway->create($data);
echo "Create: $id", PHP_EOL;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn