Problème de champ à NULL

Eléphanteau du PHP | 30 Messages

03 mai 2011, 16:02

Bonjour,
je savais pas trop où poster mon sujet, mais vu que ça à l'air d'être un problème simple, que je n'arrive bien sûr pas à résoudre, je suis venu ici.

Voici mon code simplifié :
$query='SELECT nom
            FROM `depot`
            ORDER BY nom';
$requete=mysql_query($query)or die (mysql_error());
while ($result=mysql_fetch_assoc($requete) {
if ($result['nom'] == null) {
echo '0';
}
else {
echo '1';
}
}
Voilà en gros mon code largement simplifier.
En fait, même quand le champ `nom`est null, il ne rentre pas dans le if et je n'ai "que des 1".
J'ai essayé :
- != null
- empty()
- isnull
- == "NULL"
- === null
...

Et comme vous vous en doutez, rien n'y fait, et dans la liste que je veux afficher, des Null s'affiche au lieu des espaces voulus.
Toutes les idées sont évidemment les bienvenues.

Bien cordialement, Cédric.

ViPHP
xTG
ViPHP | 7331 Messages

03 mai 2011, 16:11

C'est bien un null et pas un vide ? Car ce n'est pas la même chose.

Eléphanteau du PHP | 30 Messages

03 mai 2011, 16:21

"NULL" c'est ce qui est écrit dans la base de donnée.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 mai 2011, 21:40

peut tu nous montrer le create table de la table dépôt et un dump de données (5 lignes devraient suffire).

suivant le champ de la table, ça peut être null, ou une chaine de caractère (a tu testé == 'null' ?).


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 30 Messages

04 mai 2011, 09:52

En fait je n'ai pas à proprement dis fais un create table en SQL, je l'ai créé avec phpmyadmin colonne par colonne.
A la base, cette colonne est un varchar(100), null --> non, Defaut --> aucun.
Elle est mise à jour tous les jours avec un fichier .txt où il est écrit parfois NULL.

Et j'ai essayé == 'null' evidemment ;)
Vu que les NULL sont dans le fichier texte, j'ai evidemment pensé qu'il les prennait pour une chaine de caractères, mais bon même en essayant, cela ne fonctionne pas...
Voici les 5 premières lignes affiché grâce à SELECT dif_civilite, dif_nom, dif_prenom, dif_denomi FROM `diffuseur` WHERE `dif_denomi`='null'

dif_civilite dif_nom dif_prenom dif_denomi
MR DUPONT DUPONT NULL
MR DUPONT YANNICK NULL
MR DUPONT FREDERIC NULL
MR DUPONT PASCAL NULL
MR DUPONT NULL NULL


Voici mon php :
if (isset($_POST['rech_depot'])) {
$depot=$_POST['depot'];
$nil=$_POST['nil'];
$query='SELECT dif_nil, dif_civilite, dif_nom, dif_prenom, dif_adresse, dif_nim, dif_cp, dif_denomi, dif_designation, dif_deposi_nim
	FROM `diffuseur`
	WHERE dif_deposi_nim LIKE \'%'.$depot.'%\'
	AND dif_nil LIKE \''.$nil.'\'
	ORDER BY dif_denomi, dif_nom, dif_prenom';
$requete=mysql_query($query);
echo '<form method="post" action="#" name="select_nil" />';
echo '<select name="choix_nil">';
while ($result=mysql_fetch_assoc($requete)) {

if ($result['dif_denomi'] == "NULL") {
$var='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '.$result['dif_nom'].' '.$result['dif_prenom'].' '.$result['dif_adresse'].' '.$result['dif_cp'].' ';
echo '<option value="'.$result['dif_nim'].'" label="'.$var.'" >'.$var.'</option>';
}
else {
$var=''.$result['dif_denomi'].' '.$result['dif_nom'].' '.$result['dif_prenom'].' '.$result['dif_adresse'].' '.$result['dif_cp'].' ';
echo '<option value="'.$result['dif_nim'].'" label="'.$var.'" >'.$var.'</option>';
}
}
echo '</select>';
echo '<input type="submit" name="valid_nil" value="Valider mon commerce" />';
echo '</form>';

}

Eléphant du PHP | 73 Messages

04 mai 2011, 11:42

essaye avec 3 === et sans guillemets, ou avec isnull, comme ça :
if ($result['dif_denomi'] === NULL)
ou alors avec isnull comme ça :
if (isnull($result['dif_denomi']))
bon courage

ViPHP
xTG
ViPHP | 7331 Messages

04 mai 2011, 13:39

Si dans PhpMyAdmin le NULL est en italique c'est un NULL.
S'il n'est pas en italique c'est que c'est une chaîne de caractère et dans ce cas il faut faire attention à la casse : null != NULL ;)

Eléphanteau du PHP | 30 Messages

04 mai 2011, 13:45

Le null n'est pas en italique et est écrit "NULL".

Or comme mentionné plus haut, ...
if ($result['dif_denomi'] == "NULL")
... ne fonctionne pas, il va directement dans le else.
J'ai essayer de passer par une variable tierce du genre ...
$var = $result['dif_denomi']
if ($var] == "NULL")
... mais sans succès également, je pensais que c'était tout simple et finalement :|

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 mai 2011, 21:44

Et si tu fais un var_dump($result['dif_denomi']), et un strlen($result['dif_denomi']) histoire que l'on voit à quoi ressemble cette variable une fois récupérée par php ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 73 Messages

05 mai 2011, 09:20

al_pagino : tu as testé ce que je t'ai mis ? ça devrait fonctionner.. (si c'est un champ NULL et non une chaine de caractères)

Eléphanteau du PHP | 30 Messages

05 mai 2011, 10:44

@olivierg : Oui, regarde mon premier message, testé sans succès

@Ryle :
- var_dump : Renvoie rien du tout
- strlen : Renvoie 32 à chaque fois pour des villes differentes

Eléphanteau du PHP | 30 Messages

05 mai 2011, 10:53

En fait, lorsque j'importe mon fichier .txt, les colonnes ont un nombre fixe de caractères, soit 32.
Merci à Ryle de m'avoir fait découvrir cette fonction.

La solution parait si bête ... :
if ($result['dif_denomi'] == "NULL                            ")
NULL (4 caractères) + 28 espaces !...

ViPHP
xTG
ViPHP | 7331 Messages

05 mai 2011, 13:00

Ah ouais fallait y penser. :p

Petit truc pour te simplifier la vie pour de futurs fichiers qui viendraient tout foutre en l'air si changement du nombre d'espaces :
if ( strtolower(substr($result['dif_denomi'],0,4)) == "null")

Eléphanteau du PHP | 30 Messages

05 mai 2011, 17:20

Je prend ta solution xTG, merci de votre aide en tout cas.

Eléphant du PHP | 275 Messages

05 mai 2011, 17:25

trim ?