mySQL: "non vides" uniquement...
18 messages
• Page 1 sur 2 • 1, 2
-

HawkEye - WRInaute accro

- Messages: 17005
- Inscription: 23 Fév 2004
mySQL: "non vides" uniquement...
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:
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 ?
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 occasionnel

- Messages: 493
- Inscription: 8 Jan 2004
Un truc comme ça, ça marche ? :
- Code: Tout sélectionner
SELECT nullif(ref = '', ref)
,nullif(Long = '', Long)
,nullif(larg = '', larg)
FROM table
WHERE ....
-

HawkEye - WRInaute accro

- Messages: 17005
- Inscription: 23 Fév 2004
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...
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 occasionnel

- Messages: 493
- Inscription: 8 Jan 2004
Je pense que la solution doit être là.
Maintenant, pour la construction de la requête, il faudrait la construire dynamiquement en utilisant une classe représentant la structure de la table :
Suivi d'une boucle sur les éléments de la classe (champs de la table) pour construire la requête...
Non?
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 discret

- Messages: 245
- Inscription: 18 Jan 2005
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
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 - WRInaute accro

- Messages: 17005
- Inscription: 23 Fév 2004
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...
...me donne le résultat suivant:
--> si je peux dégager les '1:, 2:, 3:' c'est bon
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 occasionnel

- Messages: 260
- Inscription: 8 Aoû 2006
- 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 !
-

Joe Le Mort - WRInaute occasionnel

- Messages: 260
- Inscription: 8 Aoû 2006
dans ce cas, il faut faire le traitement dans ta requete :
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
- 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
-

Bh@Mp0 - WRInaute discret

- Messages: 245
- Inscription: 18 Jan 2005
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.
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 discret

- Messages: 245
- Inscription: 18 Jan 2005
Enfin bref, ton code est tout pourri quand même
- 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

- Messages: 3884
- Inscription: 16 Nov 2004
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 ?
18 messages
• Page 1 sur 2 • 1, 2
Lectures recommandées sur ce thème :
- A titre d'info uniquement ... Faille sur FB avec les "likes"
- Pages dans les résultats uniquement avec "site:" !
- "Ces termes apparaissent uniquement dans les liens"
- Titres de pages "dynamiques" en php/Mysql
- Intégrer Flux Atom avec SimplePie et "=" "&" "_" "?"
- Ajout colonnes "Source" + "Page de destination" + "Pays/Teritoire"
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités
