paramétre dans un fichier de conf - Perl - Programmation
Marsh Posté le 12-10-2018 à 09:32:08
Salut,
Comme le souligne la doc DBI, "execute" peut recevoir des paramètres (ici $params) en utilisant des "?" dans la requête préparé par "prepare".
Exemple de la doc:
Code :
|
Source: https://metacpan.org/pod/DBI
Application à ton cas:
Code :
|
dd
Marsh Posté le 12-10-2018 à 09:37:51
Salut Dede,
Merci beaucoup pour ton aide.
Dans mon cas ma requête doit absolument se trouver dans le fichier de conf (la requête est différente en fonction de l'environnement).
Au début je faisais à peu prés comme ça, mais maintenant je ne peu plus
Marsh Posté le 12-10-2018 à 09:57:30
Je ne comprends pas, la requête sql n'est qu'une chaine de caractère.
Dans mon exemple "SELECT * FROM Mytable where name='?'" peut se trouver dans ton fichier de conf comme actuellement.
Marsh Posté le 12-10-2018 à 10:19:32
Pareil
le name='?' n'est pas interprété lors du $sth->execute($param);
Marsh Posté le 12-10-2018 à 10:38:16
Tu vérifies comment ? Tu regardes au niveau de la bdd ?
Tu as vérifiés le contenu de $param ? C'est bien une chaine de caractère ?
dd
Marsh Posté le 12-10-2018 à 10:51:08
J'affiche la valeur de $sql et le résultat de la requête qui est vide.
$param est bien valorisé, c'est une chaîne de caractère.
Marsh Posté le 12-10-2018 à 11:23:11
Ok, normal que tu ne vois pas de changement à "name='?'" car cela se passe lors de l'envoie de ta requête SQL vers la base de donnée.
Si tu veux voir si la requête est vraiment interprété =>
https://stackoverflow.com/questions [...] laceholder
Donc je te propose de rajouter dans ton code
Code :
|
puis de regarder les logs.
Sinon, il faut vérifier si la requête une fois construire renvoie vraiment quelque chose depuis le serveur, si ça se trouve c'est un soucis de cast dans la condition where ... un oubli bête quoi ^^'
Marsh Posté le 12-10-2018 à 11:28:26
Je vais tester la trace, mais si je fais directement
Code :
|
sans passer par le fichier de conf, ça fonctionne très bien.
Il n'y a pas de problème dans mon where
Marsh Posté le 12-10-2018 à 11:41:22
J'ai testé la trace et le résultat envoyé dans la requête est est
Code :
|
Marsh Posté le 12-10-2018 à 12:24:16
Enlève peut être les simple quote autour du ?.
C'est normal que la solution ou tu mets la variable directement fonctionne.
Mais c'est parce qu'il existe dans ton fichier .pl un my $param et que tu définis l'ensemble de la requête dans ce même fichier.
Marsh Posté le 12-10-2018 à 12:33:28
Pourquoi faire dans le compliqué alors qu'il y a simple.
my $sql=$config->{sql};
$sql =~ s/$param/$param/;
et basta
Bon, si il y avait plusieurs exécutions avec des valeurs différentes dans une même session avec la BDD, on pourrait partir dans la voie que vous explorez, mais au vu de son exemple d'utilisation, cela n'a pas l'air d'être le cas.
A+,
Marsh Posté le 12-10-2018 à 12:37:01
pour le plaisir de comprendre
mais sinon, oui c'est l'autre solution.
Marsh Posté le 12-10-2018 à 13:04:51
gilou a écrit : Pourquoi faire dans le compliqué alors qu'il y a simple. |
Merci Gilou, mais c'est pareil
J'ai toujours le $param dans la requête à la place de sa valeur !
Marsh Posté le 12-10-2018 à 13:11:50
J'ai trouvé, il fallait faire
$sql =~ s/\$param/$param/;
Merciiiiiii Gilou et dd
Marsh Posté le 12-10-2018 à 13:34:50
web_olivier a écrit : J'ai toujours le $param dans la requête à la place de sa valeur ! |
Oui, tu as tout a fait raison. J'avais testé sur un exemple, mais qui marchait pour de mauvaises raisons.
Pour en revenir a la question initiale, il suffit de lire la doc de perl DBI poyr avoir la réponse:
sql=SELECT * FROM Mytable where name=?
..............................
my $sth= $dbh->prepare( $sql );
$sth->bind_param( 1, $param );
$sth->execute( );
Et probablement aussi
my $sth= $dbh->prepare( $sql );
$sth->execute( $param );
S'il y a des quotes autour de la valeur dans la query standard, elles ne sont pas présentes en cas de remplacement par un ?
cf cette page de Programming the Perl DBI: https://docstore.mik.ua/orelly/linux/dbi/ch05_03.htm
ou on voit que
$sth = $dbh->prepare( "SELECT name, location FROM megaliths WHERE name = " . $dbh->quote( $siteName ) . "" );
passe a
$sth = $dbh->prepare( "SELECT name, location FROM megaliths WHERE name = ?" );
$sth->bind_param( 1, $siteName );
et ou c'est dit en toutes lettres modulo la remarque ça marche sauf quand ça marche pas.
Citation : You may have noticed that we haven't called the quote( ) method on the values. Bind values are passed to the database separately from the SQL statement,[50] so there's no need to "wrap up" the value in SQL quoting rules. |
A+,
Marsh Posté le 12-10-2018 à 14:07:34
Merci Gilou pour cette explication très enrichissante, je vais lire ça et essayer d'améliorer mon code.
A+
Marsh Posté le 12-10-2018 à 08:41:09
Bonjour,
Je crée un page html générée par un script perl en cgi.
Dans ce script j'utilise un fichier de configuration pour initialiser toutes mes variables.
Une des variables est un requête SQL qui contient un paramètre ($param) passé depuis la page précédente.
voici mon fichier de conf :
Voici le début de mon script :
Mon problème c'est que $param n'est pas interprété et ne prend pas la valeur de la variable $param et $sql=SELECT * FROM Mytable where name='$param' au lieu de $sql=SELECT * FROM Mytable where name='toto' si $param=toto.
Je ne vois pas comment faire pour que $param puisse être évalué avec sa valeur.
Quelqu'un à une idée, une piste ?
Par avance merci pour votre aide