mySQL: "non vides" uniquement...

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


HawkEye
Modérateur
Modérateur
 
Messages: 15041
Inscription: Lun Fév 23, 2004 12:33

mySQL: "non vides" uniquement...

Message le Jeu Juin 21, 2007 14:28

Bonjour,

Je me demandais s'il existait une formulation simpliste pour ne sortir que les champs qui sont remplis (nom, et valeur).

Exemple, une table comme ceci:

Code: Tout sélectionner
[ ref | Long | larg | haut ]
[ 123 | 12mm | vide | 13mm ]


Je voudrais pouvoir en tirer ceci:

ref: 123
Long: 12mm
haut: 13mm

(donc ne pas afficher "larg", car vide).

NB: La table en question est susceptible d'avoir des dizaines de champs.

Je ne sais pas si c'est très clair ?

chtipepere
WRInaute impliqué
WRInaute impliqué
 
Messages: 484
Inscription: Jeu Jan 08, 2004 16:15

Message le Jeu Juin 21, 2007 14:42

Un truc comme ça, ça marche ? :

Code: Tout sélectionner
SELECT nullif(ref = '', ref)
,nullif(Long = '', Long)
,nullif(larg = '', larg)
FROM table
WHERE ....


HawkEye
Modérateur
Modérateur
 
Messages: 15041
Inscription: Lun Fév 23, 2004 12:33

Message le Jeu Juin 21, 2007 15:02

hmmm... non :(

d'autant que ça m'oblige, dans la query, à nommer les éléments, ce que je voudrais qui se fasse seul...

exemple, si j'ajoute une colonne à la table, il faut que pour tout produit pour lequel j'affiche la page, cette nouvelle colonne s'affiche (nom + contenu)...

Il faudrait qu'après la requête effectuée (ça ne concerne qu'un seul enregistrement à la fois), je puisse tourner une boucle qui m'affiche "Nom: valeur" pour chaque "Nom" dont "valeur" est non nul...

chtipepere
WRInaute impliqué
WRInaute impliqué
 
Messages: 484
Inscription: Jeu Jan 08, 2004 16:15

Message le Jeu Juin 21, 2007 15:15

Je pense que la solution doit être .
Maintenant, pour la construction de la requête, il faudrait la construire dynamiquement en utilisant une classe représentant la structure de la table :
Code: Tout sélectionner
class maclasse
{
   var $tablename = 'matable';
   var $varlist = array('monchamp1', 'monchamp2' [...]);
[...]
}

Suivi d'une boucle sur les éléments de la classe (champs de la table) pour construire la requête...
Non?


Bh@Mp0
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 245
Inscription: Mar Jan 18, 2005 19:02

Message le Jeu Juin 21, 2007 15:39

J'ai peut-être une solution, plus du côté de PHP.

Lorsque tu récupères tes résultats, avec un mysql_fetch_assoc(), tu fais un array_filter() sur cet array : sans fonction de callback définie, ça va te virer tous les champs "FALSE" (par exemple, la string vide, l'entier 0, le type NULL, ...). Sinon, tu peux définir toi-même ta propre fonction de callback.

http://fr.php.net/manual/fr/function.array-filter.php


HawkEye
Modérateur
Modérateur
 
Messages: 15041
Inscription: Lun Fév 23, 2004 12:33

Message le Jeu Juin 21, 2007 15:54

Wow... là vous êtes trèèès loin, pour moi... j'en suis pas à ce niveau ;)

Bon je vais creuser un peu...

J'avais presque une solution, mais j'ai un bug...

Code: Tout sélectionner
   $query   =   "SELECT * FROM `table` WHERE `id` LIKE '$id'";

   $result =   mysql_query($query,$db);
   $list   =   mysql_fetch_array($result);
   
   $nb_specs   =   count($list);
   
   $spec_name   =   array_keys($list);
   $spec_data   =   array_values($list);
   
   for($i=2;$i<$nb_specs;$i++)
      {
      echo '<br />';
      echo $spec_name[$i];
      echo ': ';
      echo $spec_data[$i];
      }


...me donne le résultat suivant:

1: 20 mm
Longueur: 20 mm
2: 120 ml
largeur: 120 ml
3:
hauteur:
4: 5.0 mm
diametre: 5.0 mm
5:
Voltage:
6:
Ampérage:


--> si je peux dégager les '1:, 2:, 3:' c'est bon :)


Joe Le Mort
WRInaute impliqué
WRInaute impliqué
 
Messages: 255
Inscription: Mar Aoû 08, 2006 14:13

Message le Jeu Juin 21, 2007 16:01

Code: Tout sélectionner
$result =   mysql_query($query,$db);
$list   =   mysql_fetch_array($result);

foreach($list as $k => $v){
if (!empty($v)){
   echo $k.' = '.$v.'<br />';
}

}


en bcp plus simple !


HawkEye
Modérateur
Modérateur
 
Messages: 15041
Inscription: Lun Fév 23, 2004 12:33

Message le Jeu Juin 21, 2007 16:06

J'y ai cru...

Mais ça me sort la même chose, ces saletés de 1:, 2: etc...


Joe Le Mort
WRInaute impliqué
WRInaute impliqué
 
Messages: 255
Inscription: Mar Aoû 08, 2006 14:13

Message le Jeu Juin 21, 2007 16:08

dans ce cas, il faut faire le traitement dans ta requete :

Code: Tout sélectionner
...
where
tonchamps != 'null' and tonchamps != ''
AND
tonchamps2 != 'null' and tonchamps != ''


si tu as trop de champs évite de faire cela, ca sera trop long, et lourd.

edit : essaye de faire un echo de ton champs pour savoir si c'est bien vide ou si c'est un espace ou si c'est null


KOogar
WRInaute accro
WRInaute accro
 
Messages: 3334
Inscription: Mar Nov 16, 2004 18:27

Message le Jeu Juin 21, 2007 16:48

HawkEye a écrit:J'y ai cru...

Mais ça me sort la même chose, ces saletés de 1:, 2: etc...


substr()


Bh@Mp0
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 245
Inscription: Mar Jan 18, 2005 19:02

Message le Jeu Juin 21, 2007 17:09

Non mais vous êtes tous nazes là !

mysql_fetch_array te crée deux indices pour parcourir tes champs : par associativité avec le nom et par numéro du champ.
Si tu ne veux que les chiffres, tu utilises mysql_fetch_row ; si tu ne veux que les noms des champs, tu utilises mysql_fetch_assoc.


Bh@Mp0
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 245
Inscription: Mar Jan 18, 2005 19:02

Message le Jeu Juin 21, 2007 17:11

Enfin bref, ton code est tout pourri quand même :D

Code: Tout sélectionner
$query = "SELECT * FROM `table` WHERE `id` LIKE '".$id."'";

$result =   mysql_query($query,$db);
$list   =   mysql_fetch_assoc($result);

// la prochaine ligne est "facultative" et devrait résoudre ton problème de champs "vides"
$list = array_filter($list);

foreach($list AS $key => $value) {
        echo "<br />".$key.": ".$value;
}


KOogar
WRInaute accro
WRInaute accro
 
Messages: 3334
Inscription: Mar Nov 16, 2004 18:27

Message le Jeu Juin 21, 2007 17:21

Bh@Mp0 a écrit:Non mais vous êtes tous nazes là !

mysql_fetch_array te crée deux indices pour parcourir tes champs : par associativité avec le nom et par numéro du champ.
Si tu ne veux que les chiffres, tu utilises mysql_fetch_row ; si tu ne veux que les noms des champs, tu utilises mysql_fetch_assoc.


Relax CowBoy !!

Pour ma part mon substr() c'est pas terrible. Alors j'ai fait un ptit regex qui devrait marcher sans probleme

Code: Tout sélectionner
<?php
$chaine = '1: 20 mm';
$pattern = '#(\d+): (\d+) (\w+)#';
$renplacement = '$2 $3';
echo preg_replace($pattern, $renplacement, $chaine);
?>


Mais pour moi les clés viennent du tableau et pas de la table. Enfin, j'ai jamais été tres bon en sql... si tu peux eclairer ma lanterne ?


Bh@Mp0
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 245
Inscription: Mar Jan 18, 2005 19:02

Message le Jeu Juin 21, 2007 17:44

Non mais ce qui est dingue, c'est que je donne la solution dès ma première réponse et personne semble la lire ... et après, je ne lis que des erreurs grosses comme ma *censured* !


HawkEye
Modérateur
Modérateur
 
Messages: 15041
Inscription: Lun Fév 23, 2004 12:33

Message le Jeu Juin 21, 2007 21:14

Bh@Mp0, comme je l'ai indiqué je ne suis pas naze, mais nul à ce niveau et conscient de l'être ;)

Donc ta solution, je ne la comprenais pas.

Maintenant que j'ai un peu plus d'indices, je vais pouvoir tester et te dire ce que ça donne 8)

mySQL: "non vides" uniquement...

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités