12
votes

Comment utiliser des déclarations préparées avec Postgres

Je sais que j'ai besoin de déclarations préparées parce que je fais plus d'un appel à ma base de données lors d'un script.

J'aimerais obtenir des exemples concrets sur le phrase suivante

Regardez les variables de typée, de validation et de désinfectionnement et de l'utilisation de PDO avec des déclarations préparées.

Je sais ce qu'il veut dire en validant et en désinfectant les variables. Cependant, je ne suis pas totalement sûr des déclarations préparées. Comment préparer des déclarations? Par filtres, c'est-à-dire en désinfectant? Ou par une couche de PDO? Quelle est la définition du calque?

Que signifient les déclarations préparées dans la déclaration? s'il vous plaît, utilisez des exemples concrets.


0 commentaires

4 Réponses :


0
votes

Comment préparer des déclarations:

Vous définissez une requête une fois et peut l'appeler aussi souvent que vous le souhaitez avec différentes valeurs. (par exemple, dans une boucle) xxx

voir: http://us2.php.net/manual/fr/function.pg-execute.php


0 commentaires

8
votes

Qu'est-ce que les déclarations préparées signifient dans la déclaration?

du Documentation :

Cette fonctionnalité permet aux commandes qui seront utilisées à plusieurs reprises pour être analysées et planifiées une seule fois, plutôt que chaque fois qu'elles sont exécutées.

voir pg_prepare

Exemple de la page liée ci-dessus: xxx

Le La documentation MySQL pour les déclarations préparées répond bien à la suivante Questions:

  • Pourquoi utiliser des déclarations préparées?
  • Quand devriez-vous utiliser préparé déclarations?

5 commentaires

Vos exemples ont-ils la même fonctionnalité que les robots? Ils sont beaucoup plus clairs pour moi que ceux du robot. Il semble utiliser beaucoup de tableaux qui les rendent difficiles à lire pour moi.


@ Masi - Les exemples que j'ai fournis proviennent de la page DOC PG_PREPARE. Ils sont plus faciles à suivre, mais je dirais que les exemples de @Glass Robot sont plus réels du monde (par exemple, des marqueurs nommés). Je vous suggère d'obtenir vos mains sales dès que possible. Il n'y a pas d'exemple pour les gouverner tous ».


Votre réponse n'utilise pas PDO. Cela me suggère que vous pouvez utiliser des déclarations préparées sans PDO. PDO semble offrir une indépendance de base de données uniquement.


Il semble que pg_query = pg_prepare + pg_pg_execution - possibilité_to_run_a_list_vars_to_a_statement .


S'il vous plaît, voyez ma réponse à votre réponse ci-dessus ou sur Stackoverflow.com/Questtions/1247373/...



6
votes

Cela signifie qu'il vous aidera à prévenir les attaques d'injection SQL en éliminant la nécessité de citer manuellement les paramètres.

Au lieu de placer une variable dans le SQL, vous utilisez un marqueur nommé ou d'interrogation pour lequel des valeurs réelles seront substituées lorsque l'instruction est exécutée. P>

Définition de PDO du manuel PHP:
"L'extension des objets de données PHP (PDO) définit une interface légère et cohérente pour accéder à des bases de données en php." P>

Voir le manuel PHP sur PDO et PDO :: Préparez .

Un exemple d'une instruction préparée avec des marqueurs nommés: p> xxx pré>

un exemple d'une déclaration préparée avec marqueurs d'interrogation: p>

<?php
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432');

$sql = "SELECT username, password
FROM users
WHERE username = ?
AND password = ?";

$sth = $pdo->prepare($sql);
$sth->execute(array($_POST['username'], $_POST['password']));
$result = $sth->fetchAll();


1 commentaires

Vos commandes semblent sélectionner les colonnes Nom d'utilisateur et mot de passe à partir des utilisateurs de la table lorsque, par exemple, nom d'utilisateur = A et mot de passe = a. Cela me suggère que le code n'est pas pratique dans la vie réelle car il n'a aucun sens dans la sélection des deux noms de colonne lorsque vous les connaissez déjà. Toutefois, si vous sélectionnez la troisième colonne en fonction des deux, alors votre chemin semble fonctionner. Il semble que les entrées de l'utilisateur soient traitées de manière à ce que l'échec / accident dans l'exécution des requêtes avec l'entrée de l'utilisateur ne modifie pas les données d'origine, donc aucune injection SQL: par exemple, arrêtez-vous si elle échoue à la préparation ...



0
votes

réponse à la réponse de karim79

ceci xxx

semble être identique à ce xxx


Conclusion: L'utilisation de pg_prepare et pg_execute fait beaucoup plus efficacement PHP, car vous n'avez pas besoin de prendre en compte désinfectionner. Il vous aide également à utiliser PDO.


0 commentaires