Version complète: sur le forum Webmaster Hub : url rewriting $fonction refuse les lettres
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > Fichier .htaccess et réécriture d'URLs
MonWeb
Bonjour

J'ai commencé par chercher le problème dans mes scripts et dans ma base mais sans résultat...

Je constate que quand j'utilise $fonction pour obtenir des infos dans ma base, ça ne fonctionne pas si il y a des lettres et ça fonctionne si il y des chiffres.

exemple en utilisant exactement les même scripts :

$toto appelle "machin" qui se trouve dans le champ d'une table ça fonctionne pas.
si je remplace dans ce même champ d'une table "machin" par "1234567" comme ci dessous ça fonctionne !
$toto appelle "1234567" dans le champs d'une table et ça fonctionne !

Dans mon fichier htaccess j'ai ça

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


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 ?

Merci d'avance


Dan
Je ne comprends rien à ton post, et pourtant le l'ai lu trois fois.

Que veux-tu dire par "$fonction" ??
Que veux-tu dire par "$toto appelle "machin" qui se trouve dans le champ d'une table ça fonctionne pas." ??

Est-ce que "$toto" est une fonction ? Est-ce que "machin" est un argument de cette fonction ?

Et pour ta réécriture, les lettres sont prises en compte par le (.*) ... le . signifiant "n'importe quel caractère"
Difficile de proposer de nouvelles règles sans savoir ce qu'il faut réécrire !
MonWeb
Bonjour Dan,

Oups désolé si j'étais pas très clair

Pour être plus clair:

$result = $mysql->query('SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='.$id);

Avec WHERE ville j'appelle la ville "123456" ça marche
Avec WHERE ville j'appelle "Marseille" ça marche pas !

C'est pour cette raison que je pense avoir un problème avec les lettres dans l'url rewriting puisque ça marche avec les chiffres

Je suis clair ? ou on comprend toujours rien smile.gif
Dan
Dans tes requêtes mysql, il faut mettre des quotes autour des chaines de caractères, or tu n'en as pas...

C'est la syntaxe des SELECT, UPDATE, INSERT ... et cela n'a rien à voir avec la réécriture tongue.gif

Donc une syntaxe telle que
SQL
SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville=123

est correcte. C'et pour cette raison que ça marche dans ton exemple.
Et si tu veux rechercher marseille tu devras l'écrire comme ceci
SQL
SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='marseille'

idem si tu dois rechercher 123 comme chaîne de caractères et non comme entier.
SQL
SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='123'

Il te manque les quotes dans ton exemple... tongue.gif

Dan
MonWeb
J'aurai vraiment aimé que ce soit ça smile.gif

Mais
$result = $mysql->query('SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='.$id');

Provoque une erreur sad.gif

et mon code de départ ne fonctionne que avec des chiffres !!
$result = $mysql->query('SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='.$id);


Je me suis peut etre pas bien expliqué voici un peu plus de code

CODE
if($id) {

  $id = addslashes($id);
  //donne le result de la ville mais ne fonctionne que avec des chiffres et pas avec des lettres
  $result = $mysql->query('SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='$id);
  if($result) {
    list($ville,$www,$cp,$nom_dept,$numero_dept)=mysql_fetch_row($result);
    //donne le resultat de la region
    $result2 = $mysql->query('SELECT region FROM cartedefrance WHERE numero_dept =\''.$numero_dept.'\'');
    if($result2) {
      list($region)=mysql_fetch_row($result2);
    }
    //donne le titre de la page mairie et .$ville affiche le nom de la ville et code postal après Mairie//
    $page->settitle('Mairie '.$ville.' '.$cp.' ');
MonWeb
Si ça ne vient pas de l'url rewriting alors retour à la case depart ??? avec mon post non résolu dans la rubrique Php (on trouve plus d'info sur mon code qui bloque avec les lettres) ou je continu ici ?
Dan
C'est tout simplement un problème de syntaxe q_smallexcla.gif

Essaye ceci :
CODE
$result = $mysql->query("SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville=' ".$id." ' ");

J'ai laissé les espaces autour des " et ' pour la clarté, mais supprime-les ! tongue.gif
Cela doit donner ceci que tu peux copier/coller :
CODE
$result = $mysql->query("SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='".$id."'");

Si tu te mélanges les pinceaux avec les quotes, tu peux toujours t'assurer de la syntaxe correcte de ton SELECT en remplaçant $mysql->query() par print.

CODE
print "SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='".$id."'";

Affichera bien, si $id="marseille"
CITATION
SELECT ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='marseille'

donc avec les quotes autour de la valeur de ta variable !
Et là ce sera correct q_smallexcla.gif
MonWeb
Dan,

J'ai modifié les quotes mais je n'obtiens toujours pas de résultat sad.gif sauf quand je remplace dans ma base "marseille" par "123456" avec des chiffres ça marche mais pas avec des lettres. Comme je ne peux pas remplacer le nom de toutes les villes par des chiffres il faut absolument trouver pourquoi wink.gif

J'ai bien cherché avant de poster encore sur le forum....je ne comprends pas pourquoi je peux faire appel uniquement à des chiffres dans la base mad2.gif

Pour plus d'infos voici le code complet de mes 2 pages : mairies.php et mairie.php Merci d'avance.

mairies.php= Page qui donne la liste des mairies que se trouve dans un département
mairie.php = page qui affiche les informations d'une seule ville lorsqu'on a cliqué sur une ville dans la liste des mairies de la page mairies.php

code de la page mairies.php

CODE
<?php
$page->settitle('Toutes les Mairies de votre département');
//affiche dans la page mairies.php le numero du département//
$pid = $id;
if($pid) {
// Corse //
if($id=='2a' || $id=='2b') {$pid=$id;}
else {$pid=($id);}
if($pid) {
//affiche dans page mairies.php le numero du departement
  $result = $mysql->query("SELECT numero_dept, nom_dept, region, adresse, telephone, fax, email, www FROM cartedefrance WHERE numero_dept='".$pid."'");
  if($result && mysql_num_rows($result)>0) {
    $infos = mysql_fetch_array($result);
    //donne le titre de la page mairies.php
$page->settitle('Mairies '.$infos['nom_dept'].' '.str_pad($infos['numero_dept'],2,'0',STR_PAD_LEFT));    }}
//affiche la liste des villes dans la page mairies
  $dpt = addslashes($dpt);
  $result = $mysql->query("SELECT id,ville,www,codepostal FROM mairie WHERE numero_dept='".$pid."'ORDER BY ville");
  if($result) {
    $page->addhtml('<h2>Liste des mairies du département '.$infos['nom_dept'].' ('.str_pad($infos['numero_dept'],2,'0',STR_PAD_LEFT).')</h2>');  
   $page->addhtml('<h3>Mairies : '.$infos['nom_dept'].' ('.str_pad($infos['numero_dept'],2,'0',STR_PAD_LEFT).')</h3>');  
    $page->addhtml('<div id="informations"><ul>');    
//appelle dans la base les infos qui s'affiche dans la liste des mairies sur la page mairies.php
    while(list($id,$ville,$www,$cp)=mysql_fetch_row($result)) {
    //affiche les villes dans la liste des villes de la page mairies.php mais aussi url rewrite pour la page mairie.php pour le résultat sur la page mairie avec une seule ville
      $page->addhtml('<li><a href="'.$page->path.'mairie/mairie-'.$ville.'.htm">'.$ville.'</a> ('.$cp.')</li>');  }
   $page->addhtml('</ul></div>');  
  }}
?>


Code de la page mairie
CODE
<?php
if($id) {$id = addslashes($id);
  //donne le resultat de la ville à voir
$result = $mysql->query("SELECT id,ville,www,codepostal,nom_dept,numero_dept FROM mairie WHERE ville='".$id."'");
  if($result) {list($id,$ville,$www,$cp,$nom_dept,$numero_dept)=mysql_fetch_row($result);
    //donne le resultat de la region et passe par cartedefrance pour trouver le departement qui correspond à la région
    $result2 = $mysql->query("SELECT region FROM cartedefrance WHERE numero_dept ='".$numero_dept."'");
    if($result2) { list($region)=mysql_fetch_row($result2);}
//donne le titre de la page mairie.php
    $page->settitle('Mairie '.$ville.' '.$cp.' ');    
//affiche les infos dans la page mairie.php
    $page->addhtml('<div id="titre">');
    $page->addhtml('<h2>Mairie : '.$ville.'</h2>');
    $page->addhtml('<h3>Ville de : '.$ville.'</h3>');
    $page->addhtml('</div>');
    $page->addhtml('<div id="informations"><ul>');
    $page->addhtml('<li>Code postal de la mairie: '.$cp.'</li>');
    $page->addhtml('<li>Visitez le site Internet de la mairie : <a href="'.$www.'">'.$www.'</a></li>');
    $page->addhtml('<li>Cette Mairie est dans la region: <a href="'.$page->path.'conseil-regional/conseil-regional-'.urlencode($region).'.htm"> '.$region.'</a></li>');
    $page->addhtml('</ul></div>');
    
  }}
?>


Je me suis acharné sur un problème de syntaxe pour suivre tes recommandations mais j'ai pas trouvé un truc faux dans mon code
Dan
Ta variable $id au début des deux fichiers, elle tombe d'où ? Du plafond ?
Tu signales que c'est le code "complet" .... sad.gif
MonWeb
Après avoir cherché inutilement partout et notamment dans ces 2 très long posts
1-Mysql
2-Php


La solution est bien dans l'url rewriting qui ne donnait aucun résultat avec des lettres

Merci a tous ceux qui m'ont aidé et voici la solution 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.