Maison >base de données >tutoriel mysql >Pourquoi ma déclaration « INSERT INTO » préparée par PDO ne fonctionne-t-elle pas ?

Pourquoi ma déclaration « INSERT INTO » préparée par PDO ne fonctionne-t-elle pas ?

DDD
DDDoriginal
2025-01-13 07:01:42855parcourir

Why Doesn't My PDO Prepared `INSERT INTO` Statement Work?

Dépannage des instructions préparées PDO pour INSERT INTO dans MySQL

L'utilisation d'instructions préparées par PDO pour les opérations MySQL INSERT INTO peut parfois conduire à des résultats inattendus, comme l'absence de données insérées. Examinons une cause commune et sa solution.

Considérez ce code :

<code class="language-php">$statement = $link->prepare("INSERT INTO testtable(name, lastname, age)
        VALUES('Bob','Desaunois','18')");

$statement->execute();</code>

Ce code tente d'insérer une nouvelle ligne dans testtable, mais ne parvient souvent pas à remplir la base de données.

Le chaînon manquant : liaison de paramètres

Le problème réside dans l’absence de liaison de paramètres. Bien que les instructions préparées améliorent la sécurité contre l'injection SQL, elles nécessitent que vous utilisiez des espaces réservés pour les valeurs au lieu de les intégrer directement dans la requête. Cela permet une exécution plus sûre et plus efficace, en particulier lors de l'exécution de la même requête avec plusieurs ensembles de données.

Solutions : paramètres nommés et positionnels

Voici deux façons d'implémenter correctement la liaison de paramètres :

1. Paramètres nommés :

<code class="language-php">$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
    VALUES (:fname, :sname, :age)');

$statement->execute([
    ':fname' => 'Bob',
    ':sname' => 'Desaunois',
    ':age' => '18',
]);</code>

Cela utilise des espaces réservés nommés (:fname, :sname, :age) qui sont mappés aux valeurs dans le tableau de la méthode execute().

2. Paramètres de position :

<code class="language-php">$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
    VALUES (?, ?, ?)');

$statement->execute(['Bob', 'Desaunois', '18']);</code>

Cela utilise des points d'interrogation (?) comme espaces réservés, avec les valeurs correspondantes fournies dans le tableau de la méthode execute(). L'ordre est crucial ici.

Les deux approches lient efficacement les paramètres, empêchant l'injection SQL et garantissant une insertion de données fiable. Choisissez la méthode qui convient le mieux à votre style de codage et aux exigences de votre projet. N'oubliez pas de toujours nettoyer les entrées utilisateur avant de les utiliser dans vos requêtes, même avec des instructions préparées, pour maintenir une sécurité optimale.

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