Corrigez la syntaxe de requête paramétrée MySQLi à partir de http://php.net/manual/en/mysqli.quickstart.prepared-statements.php :
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"); $stmt->bind_param("i", $id);
Mais ne fais jamais ça :
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (:id_value)"); $stmt->bind_param("i", "id_value", $id);
À mon avis, 命名参数
替换是在API级别实现的合理功能。令我惊讶的是,MySQLi 在库中只实现了 未命名参数
.
Y a-t-il une raison valable ? Vu comment PDO, DQL, ORM prennent tous des paramètres nommés dans les requêtes, cela n'a aucun sens pour moi.
J'espère que les développeurs MySQLi ne se retrouveront pas dans la situation "nous sommes paresseux et ne voulons pas". Je crois qu'il doit y avoir une bonne raison, et je cherche cette raison, ou un moyen de trouver cette raison. La raison pour laquelle les paramètres nommés ne sont pas implémentés dans la bibliothèque d'extension MySQLi.
Traditionnellement, MySQLi est l'API MySQL. Il n'ajoute rien en soi, et il y a une raison à cela : l'ajout de fonctionnalités telles que des espaces réservés nommés nécessiterait (si vous y réfléchissez) tout un monstre d'analyse des requêtes SQL. Bien entendu, ce n’est pas le travail de l’API de base de données. Comme indiqué dans d'autres réponses, l'API n'est pas DAL ou DBAL, elles servent à des fins différentes.
Le PDO est un grand exploit que l’on voit rarement dans une langue, et Wes Furlong est un génie qui a presque à lui seul assumé cette tâche. Mais le PDO est une autre histoire. Il s'agit d'une couche d'abstraction d'accès à la base de données, et pour y parvenir, que cela vous plaise ou non, vous avez besoin d'un analyseur de requêtes. Étant donné que vous disposez déjà d'un analyseur de requêtes et que l'un des pilotes prend déjà en charge les espaces réservés nommés, il est naturel de l'ajouter à tous les pilotes pris en charge. Comme vous pouvez le constater, tout change avec MySQLi.
Pour faire simple, ce n’est pas « paresseux », mais « paresseux ». Il s'agit de suivre la norme.
MYSQLi
Les paramètres nommés ne sont pas pris en charge pour deux raisons principales :PDO
le fait - et il n'est pas nécessaire de réinventer la rouePour développer le point 1 :
mysqli
, malgré ses nombreux inconvénients par rapport àmysqli
,尽管与PDO
, est facilement comparable à un bon wrapper - c'est-à-dire que les paramètres nommés (entre autres) sont fournis par le wrapper. Il n'est pas pris en charge par mysqli lui-même. C'est intentionnel et pour une seule raison :Mysqli
Conçue pour être une bibliothèque rapide et flexible.Si les développeurs intègrent plus de fonctionnalités dans la bibliothèque de base, contre-intuitivement, elle devient moins flexible et prend plus de temps à charger/exécuter.
mysqli
和pdo
Les deux ont été publiés avec PHP 5 (je crois que la version PDO est 5.3), ils ont donc des utilisations différentes.Voulez-vous un temps d'exécution plus rapide ? Utilisez
mysqli
sans wrappers. Voulez-vous des paramètres nommés ? Utilisezmysqli
。您想要命名参数吗?使用PDO
或构建mysqli
ou créez un wrappermysqli
pour gérer cela - mais sachez que cela ralentira votre temps d'exécution.