Page 1 sur 1

Utilisation de in_array avec if

Posté : 27 déc. 2008, 16:14
par Stef
Hi les gaziers!!

Je dois faire une requête pour trouver si une colonne d'une table contient une certaine chaine de caractères, alors je fais ça:
$x = mysql_query($check);
$test = mysql_fetch_array($x) 
if (in_array ('loisirs', $test)) {......
Le blème c'est que si 'loisirs' n'est pas la 1ère entrée dans la table pour le champ concerné, ben ça ne marche pas (en fait ça exécute un else, alors que il y a pourtant des entrées contenant 'loisirs')...
Comment faire pour que mon code trouve s'il y a ou pas 'loisirs' même s'il n'est pas dans la 1ère ligne de la table?
Là je cale...

Posté : 27 déc. 2008, 17:22
par animithra
Bonjour.

Comme je ne sais pas dans quel contexte tu veux effectuer ce test, je te donne une réponse globale :

- si tu veux travailler sur une table en étant sûr qu'elle contient (respectivement ne contient pas) le terme 'loisirs' dans une colonne connue, tu peux utiliser une clause WHERE dans ta requête via l'attribut LIKE (resp. NOT LIKE).

- si tu veux travailler sur une table et trier les résultats avec deux actions différentes selon que la colonne contient ou non 'loisirs' tu peux conserver ta structure de test actuelle en l'intégrant à une boucle while :

Code : Tout sélectionner

while($test = mysql_fetch_array($x)){ //tant qu'il existe des résultats à la requête //on effectue les opérations if (in_array ('loisirs', $test)) { //.... } else{ //.... } }
Note : si tu choisis la première option, il faudra tester ce que vaut mysql_num_rows($x) (à défaut la ligne suivante te renverrait une erreur s'il n'y a aucun résultat).

J'espère avoir répondu à ta question et te souhaite une bonne programmation ^^

Posté : 27 déc. 2008, 17:44
par Stef
Hello animithra,

merci pour ces infos!!

j'ai essayé comme ça:

Code : Tout sélectionner

$check = "SELECT cat FROM item WHERE cat LIKE '%restaurant%'"; $x = mysql_query($check); $test = mysql_fetch_array($x) if (in_array ('restauration', $test)) {

et comme ça:

Code : Tout sélectionner

$check = "SELECT cat FROM item"; $x = mysql_query($check); while ($test = mysql_fetch_array($x)) { if (in_array ('restauration', $test)) {
ça marche pas :(

permettez que j'émette une expression de frustration: zut!

Edit:

ça marche avec un while (j'avais pas actualisé la bonne page lors de ma vérif...), mais pas tout à fait comme je le voudrais: ça me permet donc de bien recevoir dans mon 1er if les données que je veux, mais le else est exécuter aussi sur toutes les autres boucles...
un vrai casse-tête!

Posté : 27 déc. 2008, 18:54
par animithra
j'ai essayé comme ça:
Code:

$check = "SELECT cat FROM item WHERE cat LIKE '%restaurant%'";
$x = mysql_query($check);
$test = mysql_fetch_array($x)
if (in_array ('restauration', $test)) {
Cela ne pouvait pas fonctionner : tu ne sélectionnes que les colonnes "cat" contenant "restaurant", il devient alors évident que le test n'est jamais vérifié ;) de plus il te manquait un ';' après la déclaration de la variable $test.

Pour le else, je te l'ai proposé tout simplement pour compléter ton if, libre à toi de l'utiliser ou non.

Tu peux aussi modifier la condition de la boucle while pour qu'elle sorte une fois que tu as trouvé un certain nombre de résultats.
Il te suffit alors de déclarer une variable compteur et d'utiliser l'opérateur OR (aussi noté ||, Alt Gr + 6).

Bon courage et bonne progra !

Posté : 27 déc. 2008, 19:15
par Stef
Merci pour avoir noter l'absence du ; ... :oops:

sinon oui oui, j'ai tout à fait besoin d'un else:


if il y a des lignes avec 'restaurant' dans le champ qui m'intéresse alors action
else il n'y a pas 'restaurant' alors un autre code...

C'est une page qui va afficher les données d'une ligne de ma table dont un des champs est 'restaurant' en l'occurence; si il y a 'restaurant' dans un ou plusieurs champs de cette table je veux pouvoir exécuter mon if mais pas le else, lequel servira à retourner qu'il n'y a pas d'enregistrements de cette sorte.
En gros je veux que mon code fasse:

regarde dans la table si une ou des lignes ont à tel champ tel chaine, si oui, affuche ceci, si non affiche cela;
mais il faut que ce soit l'un ou l'autre, pas les deux!
dans la version à while le code opère les deux... quand il trouve la chaine en question pour un ligne il excute le if, et pour une ligne où il ne trouve pas la chaine il exécute le else, et ce n'est pas ce que je veux.

Sinon, j'ai essayé ça:
$check = "SELECT cat FROM item WHERE cat LIKE '%restaurant%'";
				   $x = mysql_query($check);
				   $test = mysql_fetch_array($x);
				   if (in_array ('restauration', $test)) {
et j'ai cette réponse:
Warning: in_array() [function.in-array]: Wrong datatype for second argument in C:\wamp\www\
le 'wrong datatype pour second argument' c'est $test...

Edit:
j'ai commis une bourde, voici la version rectifiée et qui fait que ça fonctionne comme je le voulais:

$check = "SELECT cat FROM item WHERE cat LIKE '%restauration%'";
				   $x = mysql_query($check);
				   $test = mysql_fetch_array($x);
				   if (in_array ('restauration', $test)) {
j'avais mis "restaurant" au lieu de "restauration"...

Merci merci merci aminithra!! :D ça fonctionne comme je le voulais!

[/b]

Posté : 27 déc. 2008, 19:24
par animithra
Ok je pensais que tu voulais tester chaque ligne! (d'où le while).

Il y a beaucoup plus simple.

Pour tester l'existence dans la table tu peux modifier ta requête pour :

Code : Tout sélectionner

//requete $sql = "SELECT cat FROM item WHERE cat LIKE 'restaurant'"; //tu peux aussi mettre LIKE 'restaur%' pour inclure restauration ou tout mot commençant par //'restaur' //envoi de la requete $req = mysql_query($sql); //si la requete n'a aucun résultat (cas où aucun restau dans la table) if(mysql_num_rows($req)==0){ //traitement } //sinon si la table contient au moins 1 restaurant else { //traitement }
Voilou ^^

Posté : 27 déc. 2008, 19:27
par Stef
ok!! ça m'a l'air intéressant comme procédure je vais cogiter là-dessus.

sinon je suis parvenu au résultat escompté: cf mon édition de mon post précédent. :)


Edit:

Ouais, ben j'ai opté pour la dernière solution que tu as proposée, et ça marche à merveille! c'est parfait :D

J'ai appris des trucs encore aujourd'hui! chuis bien content, je veux émettre cette fois une expression d'allegresse: youpi!!! :D
et pis j'ai bien avancé sur mon site du coup, reyoupi! maintenant j'ai d'autre chats à fouetter: les probl. d'affichage dans IE :S (ça me gonfle grave les caprices de ie! pour un peu j'emettrais une expression de colère mais je vais me contenter d'un "grrrrr" (un gros "grrrrr")).

Posté : 27 déc. 2008, 20:39
par AB
Et si tu n'as pas besoin de retourner de valeur et qu'il s'agit simplement de faire un test tu peux encore améliorer la rapidité de ta requête en utilisant SELECT count... qui comptera simplement le nombre de résultats
$check = "SELECT count(*) as nb FROM item WHERE cat LIKE '%restauration%'";
    
         // Exécution de la requête
         $req = mysql_query($check);
    
         // Création du tableau associatif du résultat
         $resultat = mysql_fetch_assoc($req);
    

         // nb est le nom de l'allias associé à count(*) et retourne le résultat de la requête dans le tableau $resultat; 
         if ($resultat['nb'] > 0) 
          {
          }
           else
          {
          }

Posté : 27 déc. 2008, 21:04
par Stef
Ho yeah, merci AB! :wink: