OK, je dis rien sur le B A BA du debug parce que ma réflexion risque d'être pris comme du troll contre ce [...] de langage.
$sql = "SELECT COUNT(*) FROM ".$this->table." WHERE ".$this->champlogin." = '".$login."' AND ".$this->champpassword." = '".$password."'";
Il me semblait l'avoir saisi correctement à la base.
Tout mon code fonctionne correctement, sauf que.. énième changement de direction, au lieu de faire du pg_query, je dois me retapper le SQL effectué en utilisant sql_prepare et d'isoler le tout dans une couche d'accès aux données. Pour la petite histoire c'est ce que je voulais faire à la base.
Comme d'habitude, mon script aussi banal que de faire tourner une simple requête SQL prend trois plombes à débugger :
1 2 3 4 5 6 7
|
//param 1: nom de la table, param 2: champ de login, param 3: login, param 4: champ de password, param 5: password
$sql = pg_prepare($dbConn, "login", "SELECT COUNT(*) FROM $1 WHERE $2 = '$3' AND $4 = '$5'");
$query = pg_execute($dbConn, "ma_requete", ["table_user", "user_login", "user@unmail.com", "user_password","motdepasse"]);
$dataSet = pg_fetch_all($query); |
Le message d'erreur exact :
pg_prepare(): Query failed: ERREUR: erreur de syntaxe sur ou pr\xc3\xa8s de \xc2\xab $1 \xc2\xbb\nLINE 1: SELECT COUNT(*) FROM $1 WHERE $2 = '$3' AND $4 = '$5'\n, referer:
http://localhost/index.php
Au delà du ton du message, je reprends les choses logiquement :
pg_prepare sert à mettre en cache une requête donnée pour pouvoir la réutiliser et gagner en perfs, la requête fournie en paramètre prend des pseudo variables ($numéro) qui sont ensuite remplacés par le contenu du tableau fourni dans le 3ème paramètre de pg_execute.
Pour re clarifier, les paramètres $3 et $5 sont des champs de type VARCHAR dans la BDD et doivent donc normalement être entre simple quote.
Il y a un truc qui me chiffonne sur le gain de perfs de pg_prepare :
Mon code est encapsulé dans ma classe d'accès aux données dans une méthode spécifique. Si cette requête est créée à cet endroit, elle n'aura qu'une durée de vie que lors de l’exécution de la méthode et jamais au delà, le gain de perf est donc nul non ? Dois-je donc mettre l'ensemble de mes requêtes préparés dans le constructeur de la classe pour les appeler ensuite dans les méthodes de la classe ?
J'éditerai le message s'il manque de clarté, je ne serai pas contre un oreiller, des vacances ou une Piña colada sur une plage dans l'immédiat.
EDIT :
Bon, mon code fonctionne de cette manière :
1 2 3 4
|
$sql = pg_prepare($dbConn, "login", "SELECT COUNT(*) FROM $table WHERE $champlogin = $1 AND $champpassword = $2");
$query = pg_execute($dbConn, "login", [$login, $password]); |
La partie sur les questions de perfs de pg_prepare est toujours valable.
Ce que je ferai à PHP >
Partager