Maison  >  Article  >  développement back-end  >  Instruction préparée par PDO Objet PDOStatement

Instruction préparée par PDO Objet PDOStatement

不言
不言original
2018-07-03 16:53:142060parcourir

Cet article présente principalement un résumé de l'utilisation des objets PDOStatement de déclarations préparées. Cet article présente les méthodes de PDOStatement et des exemples de méthodes courantes. Les amis dans le besoin peuvent se référer à

Prise en charge de PDO pour les déclarations préparées. Vous devez utiliser l'objet de classe PDOStatement, mais cet objet de classe n'est pas instancié via le mot-clé NEW, mais est renvoyé directement après la préparation d'une instruction SQL prétraitée dans le serveur de base de données via la méthode prepare() dans l'objet PDO. Si l'objet de classe PDOStatement renvoyé par l'exécution précédente de la méthode query() dans l'objet PDO représente uniquement un objet d'ensemble de résultats. Et si l'objet de classe PDOStatement généré en exécutant la méthode prepare() dans l'objet PDO est un objet de requête, il peut définir et exécuter des commandes SQL paramétrées. Toutes les méthodes membres de la classe PDOStatement sont les suivantes :

PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
PDOStatement::bindParam — 绑定一个参数到指定的变量名
PDOStatement::bindValue — 把一个值绑定到一个参数
PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。
PDOStatement::columnCount — 返回结果集中的列数
PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
PDOStatement::execute — 执行一条预处理语句
PDOStatement::fetch — 从结果集中获取下一行
PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
PDOStatement::fetchObject — 获取下一行并作为一个对象返回。
PDOStatement::getAttribute — 检索一个语句属性
PDOStatement::getColumnMeta — 返回结果集中一列的元数据
PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
PDOStatement::setAttribute — 设置一个语句属性
PDOStatement::setFetchMode — 为语句设置默认的获取模式。

1. Préparer l'instruction

Exécuter à plusieurs reprises une requête SQL, en utilisant différents paramètres à chaque itération, dans dans ce cas, il est plus efficace d'utiliser des instructions préparées. Pour utiliser des instructions préparées, vous devez d'abord préparer « une instruction SQL » sur le serveur de base de données, mais il n'est pas nécessaire qu'elle soit exécutée immédiatement. PDO prend en charge l'utilisation de la syntaxe « placeholder » pour lier des variables à cette instruction SQL prétraitée. Pour une instruction SQL préparée, si certaines valeurs de colonne doivent être modifiées à chaque exécution, des « espaces réservés » doivent être utilisés à la place de valeurs de colonne spécifiques. Il existe deux syntaxes pour utiliser les espaces réservés dans PDO : "paramètres nommés" et "paramètres de point d'interrogation". La syntaxe à utiliser dépend des préférences personnelles.

Instruction INSERT utilisant des paramètres nommés comme espaces réservés :

$dbh->prepare(“insert into contactinfo(name,address,phone) values(:name,:address,:phone)”);

Vous devez personnaliser une chaîne en tant que "paramètre nommé", et chaque paramètre nommé doit commencer par deux points (:), Le nom des paramètres doit être significatif, de préférence identique au nom du champ correspondant.
Une instruction INSERT utilisant le paramètre point d'interrogation (?) comme espace réservé :

$dbh->prepare(“insert into contactinfo(name,address,phone) values(?,?,?)”);

Le paramètre point d'interrogation doit correspondre à l'ordre de position des champs. Quel que soit le paramètre utilisé comme requête composée d'espaces réservés, ou qu'aucun espace réservé ne soit utilisé dans l'instruction, vous devez utiliser la méthode prepare() dans l'objet PDO pour préparer la requête qui sera utilisée pour l'exécution itérative, et renvoie un Objet de classe PDOStatement.

2. Paramètres de liaison

Lorsque l'instruction SQL est préparée sur le serveur de base de données via la méthode prepare() dans l'objet PDO, si des espaces réservés sont utilisés, vous avez besoin pour remplacer les paramètres d'entrée à chaque fois qu'il est exécuté. Vous pouvez lier des variables de paramètre aux espaces réservés préparés via la méthode bindParam() dans l'objet PDOStatement (la position ou le nom doit correspondre). Le prototype de la méthode bindParame() est le suivant :

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )

Le premier paramètre de paramètre est requis. Si la syntaxe d'espace réservé utilise des paramètres de nom dans la requête préparée, alors la chaîne de paramètre de nom est utilisée comme premier. Le paramètre de la méthode bindParam() est fourni. Si la syntaxe de l'espace réservé utilise un argument de point d'interrogation, le décalage d'index de l'espace réservé de valeur de colonne dans la requête préparée est transmis comme premier argument à la méthode.

La deuxième variable de paramètre est également facultative et fournit la valeur de l'espace réservé spécifié par le premier paramètre. Étant donné que le paramètre est passé par référence, seules les variables peuvent être fournies en tant que paramètres, pas directement les valeurs.

Le troisième paramètre data_type est facultatif et définit le type de données pour le paramètre actuellement lié. Il peut s'agir des valeurs suivantes.

PDO::PARAM_BOOL représente le type de données booléen.
PDO::PARAM_NULL représente le type NULL en SQL.
PDO::PARAM_INT représente le type de données INTEGER en SQL.
PDO::PARAM_STR représente CHAR, VARCHAR et d'autres types de données de chaîne en SQL.
PDO::PARAM_LOB représente le type de données d'objet volumineux en SQL.

Le quatrième paramètre length est facultatif et est utilisé pour spécifier la longueur du type de données.

Le cinquième paramètre driver_options est facultatif et fournit toutes les options spécifiques au pilote de base de données via ce paramètre.
Exemple de liaison de paramètres utilisant des paramètres nommés comme espaces réservés :

<?php
//...省略PDO连接数据库代码
$query = "insert into contactinfo (name,address,phone) values(:name,:address,:phone)";
$stmt = $dbh->prepare($query);          //调用PDO对象中的prepare()方法
 
$stmt->blinparam(&#39;:name&#39;,$name);        //将变量$name的引用绑定到准备好的查询名字参数":name"中
$stmt->blinparam(&#39;:address&#39;,$address);
$stmt->blinparam(&#39;:phone&#39;,phone);
//...
?>

Exemple de liaison de paramètres utilisant des points d'interrogation (?) comme espaces réservés :

<?php
//...省略PDO连接数据库代码
$query = "insert into contactinfo (name,address,phone) values(?,?,?)";
$stmt = $dbh->prepare($query);          //调用PDO对象中的prepare()方法
 
$stmt->blinparam(1,$name,PDO::PARAM_STR);        //将变量$name的引用绑定到准备好的查询名字参数":name"中
$stmt->blinparam(2,$address,PDO::PARAM_STR);
$stmt->blinparam(3,phone,PDO::PARAM_STR,20);
//...
?>

3. l'instruction préparée

Lorsque l'instruction préparée est terminée et que les paramètres correspondants sont liés, elle peut être exécutée à plusieurs reprises dans la zone de cache de la base de données en appelant la méthode execute() dans l'objet de classe PDOStatement Prepared. . Dans l'exemple suivant, le prétraitement est utilisé pour exécuter en continu la même instruction INSERT dans la table contactinfo fournie précédemment, et deux enregistrements sont ajoutés en modifiant différents paramètres. Comme indiqué ci-dessous :

<?php 
try {
     $dbh = new PDO(&#39;mysql:dbname=testdb;host=localhost&#39;, $username, $passwd);
}catch (PDOException $e){
    echo &#39;数据库连接失败:&#39;.$e->getMessage();
    exit;
}
 
$query = "insert into contactinfo (name,address,phone) values(?,?,?)";
$stmt = $dbh->prepare($query);
 
$stmt->blinparam(1,$name);      
$stmt->blinparam(2,$address);
$stmt->blinparam(3,phone);
 
$name = "赵某某";
$address = "海淀区中关村";
$phone = "15801688348";
 
$stmt->execute();           //执行参数被绑定后的准备语句
?>

Si vous transmettez simplement des paramètres d'entrée et que vous avez de nombreux paramètres à transmettre, vous trouverez la syntaxe de raccourci présentée ci-dessous très utile. Il s'agit de la deuxième façon de remplacer les paramètres d'entrée d'une requête prétraitée lors de l'exécution en fournissant un paramètre facultatif dans la méthodeexecute(), qui est un tableau d'espaces réservés de paramètres nommés dans la requête préparée. Cette syntaxe vous permet d'omettre l'appel à $stmt->bindParam(). Modifiez l'exemple ci-dessus comme suit :

<?php 
//...省略PDO连接数据库代码
$query = "insert into contactinfo (name,address,phone) values(?,?,?)";
$stmt = $dbh->prepare($query); 
 
//传递一个数组为预处理查询中的命名参数绑定值,并执行一次。
$stmt->execute(array("赵某某","海淀区","15801688348"));
?>

De plus, si une instruction INSERT est exécutée et qu'il y a un champ ID à croissance automatique dans la table de données, vous pouvez utiliser la méthode lastinsertId() dans l'objet PDO pour obtenir la dernière insertion de l'ID d'enregistrement dans la table de données. Si vous devez vérifier si d'autres instructions DML sont exécutées avec succès, vous pouvez obtenir le nombre de lignes qui affectent l'enregistrement via la méthode rowCount() dans l'objet de classe PDOStatement.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Introduction à la méthode d'importation de la bibliothèque de balises personnalisées thinkPHP2.1

Utilisez des pthreads pour obtenir de véritables Méthode multi-threading PHP

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