Problème de syntaxe elseif/else

Eléphanteau du PHP | 24 Messages

01 oct. 2006, 12:17

Bonjour,

Je m'adresse à vous, car je suis perplexe.

Voici mon code Php :

$sql = "SELECT date_modification FROM cherc_fr WHERE (prenom = '$chprenom' && nom = '$chnom' && ville = '$chville')";
$result = mysql_query($sql);
if (mysql_num_rows($result) == 0) {
echo "Aucune ligne trouvée, rien à afficher.";
}
elseif ($row = mysql_fetch_assoc($result)) {
echo $row["date_modification"];
 }}
Ce code fonctionne.

En revanche, si je veux remplacer elseif par else, Php me signale une erreur. Exemple, je tape :
// mêmes requêtes Sql
if (mysql_num_rows($result) == 0) {
echo "Aucune ligne trouvée, rien à afficher.";
}
else ($row = mysql_fetch_assoc($result)) {
echo $row["date_modification"];
 }}
L'interpréteur me renvoie le message d'erreur
Parse error: parse error, unexpected '{'
sur la ligne où j'ai placé mon else.

Si je supprime l'accolade au niveau du else, j'ai un problème avec mon echo.

Merci pour votre aide (plusieurs paires d'yeux valent mieux qu'une).

Cordialement,

I.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 oct. 2006, 12:22

Cela me paraît tout à fait normal. ;)
//
else ($row = mysql_fetch_assoc($result))
Après un else, tu ne peux avoir qu'une (série d') instruction(s).
En général, on ouvre même une accolade pour placer à l'intérieur de celle-ci
les instructions que l'on souhaite exécuter dans le cas de figure envisagé.

Ici, après ton else, tu as placé une condition (= un test)
mais sans utiliser la syntaxe liée aux tests : le if.

Il te faut donc corriger cette ligne en :
//
elseif ($row = mysql_fetch_assoc($result))
// ou
else { if ($row = mysql_fetch_assoc($result))
       // ...
     }

Mammouth du PHP | 19672 Messages

01 oct. 2006, 12:24

Parce que tu ne dois pas mettre de condition à vérifier dans un esle contrairement à un elseif.

J'ajouterais que ton code proprement écrit devrait davantage ressembler à ceci :
<?php
$sql = "SELECT date_modification ".
       "FROM cherc_fr ".
       "WHERE (prenom = '". $chprenom ."' ".
       "AND nom = '". $chnom ."' ".
       "AND ville = '". $chville ."')";
$result = mysql_query($sql);
if (mysql_num_rows($result) == 0)
{
    echo "Aucune ligne trouvée, rien à afficher.";
}
else
{
    while (false != ($row = mysql_fetch_assoc($result)))
    {
        echo $row["date_modification"];
    }
}
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 24 Messages

01 oct. 2006, 14:18

Bonjour,

Merci à Albat et à Cyrano pour leurs réponses rapides.

Concernant la réponse particulièrement précise de Cyrano, elle me conseille de protéger mes données pour éviter les injections Sql, si j'ai suivi. Pour ma part, je protège déjà mes données avec mysql_real_escape_string : n'est-ce pas suffisant ?

Encore merci.

I.

Mammouth du PHP | 19672 Messages

01 oct. 2006, 14:28

Je n'ai pas fait une protection de données mais une concaténation propre : on sépare convenablement ce qui est du PHP de ce qui est une chaine de caractères sans mélanger, ce qui revient à indiquer à PHP : traite ce qui est du PHP et envoie le reste tel quel. Ta syntaxe est valide, mais force PHP à parser les chaines pour en extraire ce qui est du PHP au passage. Là, on donne de l'oxygène à l'interpréteur en ne le faisant travailler QUE sur ce qui est du PHP.

Ça ne te dispense nullement de protéger tes données avec effectivement une fonction telle que mysql_real_escape_string() :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 24 Messages

01 oct. 2006, 14:30

Merci Cyrano pour ces explications limpides. :lol:

Cordialement,

I.