Version complète: sur le forum Webmaster Hub : forcer une fonction sans annuler les autres
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
MonWeb
Bonjour,

J'ai un script qui me pose un problème

CODE
/* Corse */
if($id=='2a' || $id=='2b') {$pid=$id;}
else {$pid=round($id);}
if($pid) {
  $result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = \''.$pid.'\'');
}


Ce script fonctionne correctement et appelle dans la base tous les départements sauf 2a et 2b !!

Si j'ajoute une ligne comme ci dessous, je peux appeller le departement 2a et la base me repond correctement pour le département 2a
Mais cette fonction annule la fonction pour les autres départements et je n'obtiens plus de résultat pour les autres départements.
Au départ je pensais que le problème venait de la base à cause d'un appel alphanumerique, mais la ligne ci dessous confirme que ma base repond et que le problème vient du script Php.

CODE
/* Corse */
if($id=='2a' || $id=='2b')
{$pid=$id;}
else {$pid=round($id);}
                                    //j'ajoute cette ligne et la base me repond correctement mais cette fonction prime sur les autres départements
                                    if ($id='22' && $pid='2a')
if($pid) {


Est ce que quelqu'un a une idée pour corriger mon erreur ? pour que le script force une fonction pour le département 2a et 2b sans annuler la fonction pour le reste des départements.

Merci d'avance
Portekoi
Bizarre... pourquoi tu échappes les "\'" ?

CODE
/* Corse */
if($id=='2a' || $id=='2b') {$pid=$id;}
else {$pid=round($id);}

//on vérifie l'affichage
echo $pid . " <-- <br>";

if($pid) {
  $result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = ''.$pid.'');
}


Test ca smile.gif
MonWeb
CODE
Bizarre... pourquoi tu échappes les "\'" ?


si j'enlève j'obtiens cette erreur

CODE
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in chemin.... on line 15


mais en utilisant
CODE
/* Corse */
if($id=='2a' || $id=='2b') {$pid=$id;}
else {$pid=round($id);}

//on vérifie l'affichage
echo $pid . " <-- <br>";

if($pid) {
  $result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = \''.$pid.'\'');


CODE
//on vérifie l'affichage
echo $pid . " <-- <br>";


me donne la valeur 0 pour le département 2a !!!!

alors qu'avec une ligne en plus comme if ($id='22' && $pid='2a') j'obtiens le bon résultat ! et la valeur du $pid ne correspond pas à 0 mais à 2a
pluriels
le problème ne vient-il pas plutôt de
CODE
WHERE numero_dept = \''.$pid.'\'');

J'aurais plutôt écrit la contrainte sur le champ nom_dept:
SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM conseilgeneral WHERE nom_dept = '2a'

Pour info, round('2a') renvoie 0 car 2a est une chaine de caractères
Portekoi
Ah ok, tu utilises une class...

Fais un :

echo 'SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM conseilgeneral WHERE numero_dept = '.$pid;

avant et après ta requête smile.gif
MonWeb
CODE
echo 'SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = '.$pid;


j'obtiens la meme chose que avec :

CODE
//on vérifie l'affichage
echo $pid . " <-- <br>";


C'est a dire 0
MonWeb


CITATION
Pour info, round('2a') renvoie 0 car 2a est une chaine de caractères


else {$pid=round($id);}
si on enleve "round" les départements avec un 0 devant ne fonctionne plus et se retrouve dans la meme situation que 2a et 2b

Pour simplifier j'ai enlevé =round et ajouté un 0 dans ma base devant les dpartement 1,2,3,4,5,6,7,8,9

J'ai donc maintenant else {$pid=($id);} a la place else {$pid=round($id);} et tout fonctionne sauf 2a et 2b
Portekoi
Justement, le round ne porte pas sur 2a ou 2b puisqu'il fait un test avant...

Essaie ca :

CODE
if($id=='2a' || $id=='2b') {
$pid=$id;
echo $pid . ' ---------- ' . $id . ' Premier choix';
}
else {
$pid=round($id);
echo $pid . ' ---------- ' . $id . ' ----------' . round($id) . ' Second choix';
}
MonWeb
avec ce code

CODE
if($id=='2a' || $id=='2b') {
$pid=$id;
echo $pid . 'le pid qui est numero_dept dans ma base ' . $id . ' Premier choix';
}
else {
$pid=($id);
echo $pid . ' est le pid qui est numero_dept dans ma base ' . $id . ' est le id dans ma base' . ($id) . ' Second choix';
}


exemple pour le département 06
resultat = 06 est le pid qui est numero_dept dans ma base 06 et le id dans ma base est06 Second choix

exemple pour le département 2a
resultat= est le pid qui est numero_dept dans ma base et le id dans ma base est Second choix
donc aucun resultat ! meme pas 0 puisque =round a été suprimé pour simplifier (voir mon post ci dessus)
Portekoi
Donc quand $id = '2a', cela affiche quand même "Second choix?"
MonWeb
oui mais ne donne aucune valeur

dans la base le id est = 21 pour numero_dept=2a
dans la base le id est = 22 pour numero_dept=2a
Portekoi
Je comprends rien... Tu as deux fois le même ID ?

De plus, $id contient quoi? 21 ou 2a ??

J'ai l'impression que ton $id contient l'ID de la base donc... comment veux tu que la requête fonctionne si $pid est égal à une chaine caractère?
MonWeb
si le script reconnait

dans la base le id est = 6 pour numero_dept=06 (donc 6 est le id et 06 est $pid dans le script)
dans la base le id est = 23 pour numero_dept=21 (donc 23 est le id et 21 est $pid dans le script) (Cotes d'Or)

mais pas

dans la base le id est = 21 pour numero_dept=2a (donc 21 est le id et 2a est $pid dans le script)
dans la base le id est = 22 pour numero_dept=2b (donc 22 est le id et 2b est $pid dans le script)

Pourquoi ne pas laisser le script comme ça en ajoutant une fonction qui donne une exception
if id=21 alors pid==2a et pour le reste des départements $pid=($id);

C'est possible ?
Portekoi
Et ca?

CITATION
/* Corse */
if($id=='21'){
$pid = '2a';
}
elseif ($id=='22') {
$pid='2b';
}
else {$pid=round($id);}
if($pid) {
$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = \''.$pid.'\'');
}


Mais pourquoi tu ne fais pas directement :

CODE
$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE id = \''.round($id).'\'');


??
MonWeb
CODE
/* Corse */
if($id=='21'){
$pid = '2a';
}
elseif ($id=='22') {
$pid='2b';
}
else {$pid=round($id);}
if($pid) {
$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = \''.$pid.'\'');
}


Ca fonctionne pour tout les départements sauf 2a et 2b il semble que elseif ($id=='22') {$pid='2b';} ne fonctionne pas


CITATION
Mais pourquoi tu ne fais pas directement :

CODE$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE id = \''.round($id).'\'');


Parce que je provoque une erreur
pour le département 30 la base m'envoie les infos du département 91
parce qu'il prend id= dans la base et non plus numero_dept
dans la base le id est = 30 pour numero_dept=91 (donc 30 est le id et 91 est $pid dans le script)

donc je dois utiliser

CODE
$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = \''.$pid.'\'');
pluriels
Pourquoi préfères-tu une requête sur l'id plutôt que sur nom_dept ?
CODE
$nom_dept = '2a';
$nom_dept = "02";
ou encore
$nom_dept="21";
$mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE nom_dept = '$nom_dept');

Tu n'aurais pas besoin du round ou de gérer les 2a 2b ?
MonWeb
CITATION
Pourquoi préfères-tu une requête sur l'id plutôt que sur nom_dept ?
CODE$nom_dept = '2a';
$nom_dept = "02";
ou encore
$nom_dept="21";
$mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE nom_dept = '$nom_dept');
Tu n'aurais pas besoin du round ou de gérer les 2a 2b ?


J'ai fais ce test

CODE
/* Corse */
if($id=='21'){$nom_dept='2a';}
else if ($id=='22') {$nom_dept='2b';}
else {$nom_dept=($id);}

if($nom_dept) {
$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = \''.$nom_dept.'\'');


Ca ne change pas le problème du 2 a et 2b quand j'utilise $nom_dept a la place de $pid ca fonctionne mais pas avec 2a et 2b

si je donne la valeur 210 a la place de 2a ça marche

dans la base le id est = 21 pour numero_dept=2a (donc 21 est le id et 2a est $pid dans le script)
Je change et remplace le 2a par 210
dans la base le id est = 21 pour numero_dept=210 (donc 21 est le id et 210 est $pid dans le script)

Donc dès que j'introduis une lettre ça marche plus !!

Portekoi
NON, regarde le where de la requête de pluriels...

Il a mit nom_dept à la place de numero_dept...
MonWeb
le script avec nom_dept ne marche pas car dès qu'on fait appel a autre chose que des chiffres ça ne marche plus

CODE
/* Corse */
if($id=='21'){$pid= '2a';}
elseif ($id=='22') {$pid='2b';}
else {$nom_dept=($id);}
if($nom_dept)  {
$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE nom_dept = \''.$nom_dept.'\'');


celui la non plus car dès qu'on fait appel a autre chose que des chiffres ça ne marche plus

CODE
/* Corse */
if($id=='21'){$pid= '2a';}
elseif ($id=='22') {$pid='2b';}
else {$pid=($id);}
if($pid)  {
$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE nom_dept = \''.$pid.'\'');


mais avec numero_dept ça marche parque qu'on fait appel a des chiffres sauf pour 2a et 2b parce qu'il y a des lettres

CODE
/* Corse */
if($id=='21'){$pid= '2a';}
elseif ($id=='22') {$pid='2b';}
else {$pid=($id);}
if($pid)  {
$result = $mysql->query('SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept = \''.$pid.'\'');


Et si on insistait sur le forcage de 2a et 2b ( if($id=='21'){$pid= '2a';} ne force pas le département 2a à cause de la lettre a )
en ajoutant une fonction qui donne une exception

C'est possible ?
Dan
CITATION(thierryfrancois @ vendredi 5 septembre 2008 à 15:14) *
le script avec nom_dept ne marche pas car dès qu'on fait appel a autre chose que des chiffres ça ne marche plus

Tout simplement parce que la syntaxe de ton SELECT n'est pas correcte !
Il FAUT des quotes autour de tout ce qui n'est pas numérique pur.

Voir ce post : http://www.webmaster-hub.com/index.php?s=&...st&p=281120

Dan
MonWeb
La solution est bien dans l'url rewriting qui ne donnait aucun résultat avec des lettres (pour voir le post url rewriting complet )

Donc rien à voir avoir Php et Mysql....

Merci a tous ceux qui m'ont aidé et voici la solution ci dessous pour ceux qui auront un jour le même problème

Au départ j'avais cette ligne dans mon htaccess:
CODE
RewriteRule ^(.*)/(.*)-([0-9]+)\.htm$ index.php?action=$1&url=$2&id=$3 [L]


L'ouverture de mon post était :

CITATION
N'ayant pas de code de réecriture pour les lettres dans mon htaccess du genre ([0-9]+)-([-a-zA-Z0-9_]+) je me demande si la solution à mon problème n'est pas par la.....

Est ce que quelqu'un pourrait proposer un code de réecriture ?


Finalement en supprimant cette ligne

CODE
RewriteRule ^(.*)/(.*)-([0-9]+)\.htm$ index.php?action=$1&url=$2&id=$3 [L]


et en remplaçant par :

CODE
RewriteRule ^(.*)/(.*)-([a-zA-Z_-]+)\.htm$ index.php?action=$1&url=$2&id=$3 [L]


Tout fonctionne parfaitement whistling.gif

bonne journée
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.