Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb de requete SQL

6 réponses
Avatar
Slyv
Bonjour à tous,

je rencontre un problème au niveau de l'exécution d'une requête SQL et je ne
vois pas où est ma coquille . Avec le débuggage, je sais ce qui cloche mais
je vois pas comment m'en sortir ...

Voici mon code perl qui consiste à récupérer le status de mes comptes
utilisateurs (que je coche via des checkboxs sur la page qui liste les
comptes). A préciser que le status c'est une lettre :Y pour activer / N pour
désactiver.

sub Activity
{
my ($id_user) =@_;
print "Dans la fonction";
$sql= "SELECT activity_user FROM users WHERE id_user=$id_user";
$var = $dbh -> selectrow_array($sql);
return $var;
}

for($i=0;$i<$longueur;$i++)
{
print "tour de boucle $i"
$result=&Activity($line[$i]);
print $result;
}

qui produit l'output suivant :

tour de boucle 0Dans la fonctionN
tour de boucle 1Dans la fonction
tour de boucle 2Dans la fonction

Comme vous pouvez le constater, je ne récupère la valeur que lors du premier
tour de boucle et je comprends pas pourquoi

une idée ?

Merci par avance

Slyv

6 réponses

Avatar
Flatman
* "Slyv" wrote:
|
| Bonjour à tous,
|
| je rencontre un problème au niveau de l'exécution d'une requête SQL et je ne
| vois pas où est ma coquille . Avec le débuggage, je sais ce qui cloche mais
| je vois pas comment m'en sortir ...
|
| Voici mon code perl qui consiste à récupérer le status de mes comptes
| utilisateurs (que je coche via des checkboxs sur la page qui liste les
| comptes). A préciser que le status c'est une lettre :Y pour activer / N pour
| désactiver.
|
| sub Activity
| {
| my ($id_user) =@_;
| print "Dans la fonction";
| $sql= "SELECT activity_user FROM users WHERE id_user=$id_user";
| $var = $dbh -> selectrow_array($sql);
| return $var;
| }
|
| for($i=0;$i<$longueur;$i++)
| {
| print "tour de boucle $i"
| $result=&Activity($line[$i]);
^^^^^ quelle est la valeur de $line... ???
| print $result;
| }
|
| qui produit l'output suivant :
|
| tour de boucle 0Dans la fonctionN
| tour de boucle 1Dans la fonction
| tour de boucle 2Dans la fonction
|
| Comme vous pouvez le constater, je ne récupère la valeur que lors du premier
| tour de boucle et je comprends pas pourquoi
|
| une idée ?
|
| Merci par avance
|
| Slyv
|
|

--
Erik

* Life is wonderful with Emacs and Perl *
Avatar
kurtz le pirate
In article ,
Flatman wrote:

::* "Slyv" wrote:
::|
::| Bonjour à tous,
::|
::| je rencontre un problème au niveau de l'exécution d'une requête SQL et je
::| ne
::| vois pas où est ma coquille . Avec le débuggage, je sais ce qui cloche mais
::| je vois pas comment m'en sortir ...
::|
::| Voici mon code perl qui consiste à récupérer le status de mes comptes
::| utilisateurs (que je coche via des checkboxs sur la page qui liste les
::| comptes). A préciser que le status c'est une lettre :Y pour activer / N
::| pour
::| désactiver.
::|
::| sub Activity
::| {
::| my ($id_user) =@_;
::| print "Dans la fonction";
::| $sql= "SELECT activity_user FROM users WHERE id_user=$id_user";
::| $var = $dbh -> selectrow_array($sql);
::| return $var;
::| }
::|
::| for($i=0;$i<$longueur;$i++)
::| {
::| print "tour de boucle $i"
::| $result=&Activity($line[$i]);
:: ^^^^^ quelle est la valeur de $line... ???
::| print $result;
::| }
::|
::| qui produit l'output suivant :
::|
::| tour de boucle 0Dans la fonctionN
::| tour de boucle 1Dans la fonction
::| tour de boucle 2Dans la fonction
::|
::| Comme vous pouvez le constater, je ne récupère la valeur que lors du
::| premier
::| tour de boucle et je comprends pas pourquoi
::|
::| une idée ?
::|
::| Merci par avance
::|
::| Slyv
::|
::|

très intéressante ta réponse flatman !
Avatar
Antoun
Slyv wrote:
sub Activity
{
my ($id_user) =@_;
print "Dans la fonction";
$sql= "SELECT activity_user FROM users WHERE id_user=$id_user";
$var = $dbh -> selectrow_array($sql);
return $var;


perso, j'écrirais plutôt :

@var = ... ;
return @var[0] ;

ou bien

($var) = ... ;
return $var;

}

for($i=0;$i<$longueur;$i++)
{
print "tour de boucle $i"
$result=&Activity($line[$i]);
print $result;
}


Avatar
Antoun
par ailleurs, c'est une très mauvaise idée de re-lancer la requête à
chaque tour de boucle. A moins que tu aies vraiment une liste énorme de
users, il est bcp + plus efficace de lancer la requête d'ensemble et
d'exploiter le résultat ligne par ligne :


my $liste_users = join("', '", @line) ;
# génère une liste du genre Toto', 'Titi', 'Tata
# qui ne demande qu'à s'insérer dans ta requête
$sql = "SELECT activity_user
FROM users
WHERE id_user IN ('$liste_users')" ;

$sth = $dbh -> prepare($sql) ;
print "$resultn" while ($result) = $sth->fetchrow_array ;


Je connais très mal les connexions Perl/BDD, donc il y a peut-être des
améliorations à apporter à mon utilisation de $dbh et consorts ; mais
pour la démarche d'ensemble, je n'ai aucun doute !

Antoun
Avatar
Patrick Texier
Le Sun, 30 Oct 2005 12:01:29 +0100, Antoun a écrit :

$sth = $dbh -> prepare($sql) ;
print "$resultn" while ($result) = $sth->fetchrow_array ;


Je connais très mal les connexions Perl/BDD, donc il y a peut-être des
améliorations à apporter à mon utilisation de $dbh et consorts ; mais
pour la démarche d'ensemble, je n'ai aucun doute !


Effectivement, il manque une méthode execute entre prepare et fetchrow.
Il est plus que conseillé de tester les erreurs (mise au point, serveur
SQL en rade, base modifiée mais pas la requête...) de toutes les
commandes envoyés.

$sth = $dbh -> prepare($sql) ;
if (!$sth->execute) {
print "nSQL : $sqln Erreur : $sth->errstrn";
}
else {
print "$resultn" while ($result) = $sth->fetchrow_array ;
}

Avatar
Antoun
Patrick Texier wrote:

Effectivement, il manque une méthode execute entre prepare et fetchrow.


oui, moi mon truc c'est rédiger du SQL, l'exécuter ça ne m'intéresse pas
spécialement ;-)