Maison  >  Article  >  développement back-end  >  Que sont les déclarations préparées ? Comment l'utiliser ?

Que sont les déclarations préparées ? Comment l'utiliser ?

王林
王林avant
2019-08-26 11:24:254730parcourir

De nombreuses bases de données matures prennent en charge le concept d'instructions préparées (Prepared Statements). Quels sont-ils? Vous pouvez les considérer comme un modèle d'instruction SQL compilé à exécuter, qui peut être personnalisé avec différents paramètres variables. Les instructions préparées présentent deux avantages principaux :

Les requêtes ne doivent être analysées (ou préparées) qu'une seule fois, mais peuvent être exécutées plusieurs fois avec des paramètres identiques ou différents. Lorsque la requête est préparée, la base de données analyse, compile et optimise son plan d'exécution de la requête. Pour les requêtes complexes, si vous devez exécuter plusieurs fois des requêtes avec des paramètres différents mais la même structure, ce processus prendra beaucoup de temps et ralentira votre application. En utilisant une instruction préparée, vous pouvez éviter des analyses, des compilations et des optimisations répétées. En termes simples, les instructions préparées utilisent moins de ressources et s'exécutent plus rapidement.

Les paramètres transmis aux instructions préparées n'ont pas besoin d'être cités, le pilote sous-jacent s'en chargera pour vous. Si votre application utilise exclusivement des instructions préparées, vous pouvez être sûr qu'aucune injection SQL ne se produira. (Cependant, si vous continuez à créer d'autres parties de la requête sur la base d'entrées non fiables, cela reste risqué).

Parce que les instructions préparées sont très utiles, elles sont la seule chose que PDO fait pour les implémentations Mock fournies par les bases de données. qui ne prennent pas en charge cette fonctionnalité. Cela vous permet d'utiliser une spécification d'accès aux données unifiée sans avoir à vous soucier de savoir si la base de données elle-même dispose de cette fonctionnalité.

/*
使用预处理语句重复插入数据(1)
此示例演示了一个通过向命名占位符代入一个name和一个value值来执行的INSERT查询
*/
连接数据库:$dbh = new PDO("mysql:host=127.0.0.1;dbname=dbname",'username','123');
注:如果插入数据后出现乱码的话,注意检查各个页面的字符集设置,尤其是关于pdo处理的php页面仅有header头设置为utf-8有时也不行,这时就在执行SQL语句前设置数据库的字符集$dbh->query("set names utf8");
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value); //插入一行
$name = 'one';
$value = 1;
$stmt->execute();//使用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();

/*
使用预处理语句重复插入数据(2)
此示例演示了一个通过向用?表示的占位符代入一个name和一个value值来执行的INSERT查询
*/
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value); // 插入一行
$name = 'one';
$value = 1;
$stmt->execute(); // 使用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();

/*
通过预处理语句获取数据
此示例演示使用从表单获取的数据为关键值来执行查询获取数据。用户的输入会被自动添加引号,所以这儿不存在SQL注入攻击的危险。
*/
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
    if ($stmt->execute(array($_GET['name']))) {
        while ($row = $stmt->fetch()) {
        print_r($row);
    }
}

Si le pilote de base de données le prend en charge, vous pouvez également lier les paramètres de sortie de la même manière que les paramètres d'entrée. Les paramètres de sortie sont souvent utilisés comme valeurs de retour des procédures stockées. Les paramètres de sortie sont légèrement plus compliqués à utiliser que les paramètres d'entrée. Lorsque vous les utilisez, vous devez connaître la taille de la valeur du paramètre qu'ils renvoient. S'il renvoie une valeur de paramètre plus grande que celle suggérée, une erreur se produira.

//调用一个带有输出参数的存储过程
$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); //执行存储过程
$stmt->execute();
print "procedure returned $return_value/n";

Vous pouvez également spécifier des paramètres qui représentent à la fois l'entrée et la sortie. La syntaxe est similaire aux paramètres de sortie. Dans l'exemple de code suivant, la chaîne « hello » est transmise à la procédure stockée et, lorsqu'elle est renvoyée, hello est remplacée par la valeur de retour de la procédure stockée.

//调用一个带有输入/输出参数的存储过程
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// 执行存储过程
$stmt->execute();
print "procedure returned $value/n";


//占位符的错误使用
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$stmt->execute(array($_GET['name'])); // 占位符必须用于整个值的位置(下面是正确的用法)
$stmt = $dbh->prepare(”SELECT * FROM REGISTRY where name LIKE ?”);
$stmt->execute(array(”%$_GET[name]%”));

S'il y a une erreur, veuillez la signaler. Si vous souhaitez en savoir plus sur les problèmes connexes, veuillez visiter le site Web PHP chinois : Tutoriel vidéo PHP,

. Je pense qu'il est riche en contenu et en explications. Il vous donnera une réponse satisfaisante.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer