mySQL: "non vides" uniquement...

  • Auteur de la discussion Auteur de la discussion HawkEye
  • Date de début Date de début
WRInaute accro
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:
[ 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 ?
 
WRInaute occasionnel
Un truc comme ça, ça marche ? :

Code:
SELECT nullif(ref = '', ref)
,nullif(Long = '', Long)
,nullif(larg = '', larg)
FROM table
WHERE ....
 
WRInaute accro
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...
 
WRInaute occasionnel
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:
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?
 
WRInaute discret
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
 
WRInaute accro
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:
	$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 :)
 
WRInaute discret
Code:
$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 !
 
WRInaute discret
dans ce cas, il faut faire le traitement dans ta requete :

Code:
...
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
 
WRInaute discret
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.
 
WRInaute discret
Enfin bref, ton code est tout pourri quand même :D

Code:
$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;
}
 
WRInaute accro
Bh@Mp0 a dit:
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:
<?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 ?
 
WRInaute discret
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* !
 
WRInaute accro
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)
 
WRInaute accro
...et en l'occurence, la solution que tu fournis résoud le problème (même si mon code est pourri :?).

Merci pour ton aide :D (+reco)
 
WRInaute discret
Désolé si j'ai pu paraître un peu "brusque" (quoi brusque ? tu m'cherches ?!), mais ce n'était pas contre toi mais plutôt contre ceux qui essaient d'aider en indiquant des conneries :D (et c'est pas forcément sur ce post mais sur d'autres, principalement en dév par contre).
 
WRInaute accro
Bh@Mp0 a dit:
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* !

Ben ouai, jsuis un gros faineant et j'ai fais que lire le dernier post et pas l'ensemble du sujet.... mdr
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut