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
Libérer: 2024-12-26 07:06:13
original
946 Les gens l'ont consulté

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);
Copier après la connexion

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));
}
Copier après la connexion
prepared_insert($db, 'tasks',[
    'task_name' => $taskName,
    'start_date' => $startDate,
    'completed_date' => $completedDate,
]);
Copier après la connexion

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'];
}
Copier après la connexion
$data = [
    'email' => '[email protected]',
    'password' => 123,
    'name' => 'Fooster',
];

$userGateway = new UserGateway($pdo);

$id = $userGateway->create($data);
echo "Create: $id", PHP_EOL;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal