problème d'apostrophes ou de virgules dans les variables

Eléphant du PHP | 89 Messages

06 mai 2007, 10:06

Bonjour à tous!
Voici mon probléme: J'ai développé une base de données MySQL de livraison de colis et nous exploitons cette base par l'intermédiaire d'un programme en PHP5. Les employés font des recherches de livraison par l'intermédiaire du N° de colis.
J'ai découvert que l'on pouvait adjoindre à cette base une carte (Google ou mappy) visualisant sur la carte l'adresse de livraison!
Cela marche trés bien mais j'ai un problème avec les adresses comportant des apostrophes ou des virgules par exemple
64 boulevard de l'hopital 75013 PARIS
ou
12, boulevard Garibaldi 75000 PARIS
la variable $address ne prend en compte que les caractéres jusqu'à l'apostrophe ou la virgule dans la valeur du champ caché

c'est à dire :

64 boulevard de l' ou 12, evidemment j'ai la réponse suivante : "64 boulevard de l' " Adresse introuvable
echo "<td span class=Style2>".$address." // à cet endroit l'adresse est compléte 
<input name='address'  type='hidden' value='$address' //à cet endroit l'adresse est coupée /></td>"; 
(De plus les points et/ou les guillemets ne changent rien : value="$address" ou value='$address' ou enfin value=".$address.")

existe-t-il une fonction en PHP pour contourner ce probléme?
Pour infos le champ adresse dans la base est du type VARCHAR

voici le code:
<?php
include("tete.php"); 
?>
<html> 
  <head> 
  
    <title>Rechercher</title>
  <style type="text/css">
<!--
.Style2 {
	font-family: Arial, Helvetica, sans-serif;
	font-size: x-small;
}
.colee {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 17px;
	color: #FFFFFF;
}
-->
  </style>
 
</head>
 <body> 
<span class="Style2">
<form action="cherchcol.php" method="post" name="f" enctype="multipart/form-data">
        <td><input name="choix" type="hidden" value="colis" checked="checked" type="radio" /></td>
	    
     <td> <input type=hidden name=count value="0" size=1
     onkeydown="alert('Cette valeur est créée automatiquement!');
   return false;">
   <center>
   <td><input type="text" name="recherche" size="30" maxlength="30" /></td>
        <input type=hidden name=reset value="Restaurer">
        <input name="Rechercher" value="Rechercher" type="submit" />
		</center>
        </form>
<div id="rechercheinfo" style="position:absolute;
left:350px; top:25px; visibility: hidden">
  <table border=1 cellspacing=0 cellpadding=4>
  <tr><td bgcolor=#FF0000>
    <font size=2 face="arial,helvetica" color=#FFFFFF><b>
      Saisissez <span style="text-decoration: underline;">le N° </span><br>
    </b></font>
  </td></tr></table>
</div>
<script language="JavaScript"><!--


document.f.recherche.onkeydown = function()
 { document.f.count.value++; }

document.f.reset.onclick = function()
 { return(confirm('Voulez-vous vraiment\n'
 +'annuler toutes les saisies ?')); }


if(navigator.appName.indexOf('Netscape') != -1)
{
  with (document)
  {
    f.count.onmouseover = function()
     { countinfo.visibility='visible'; }
    f.count.onmouseout = function()
     { countinfo.visibility='hidden'; }

    f.recherche.onmouseover = function()
     { rechercheinfo.visibility='visible'; }
    f.recherche.onmouseout = function()
     { rechercheinfo.visibility='hidden'; }

    f.reset.onmouseover = function()
     { resetinfo.visibility='visible'; }
    f.reset.onmouseout = function()
     { resetinfo.visibility='hidden'; }
  }
}

if(navigator.appName.indexOf('Explorer') != -1)
{
  with (document)
  {
    f.count.onmouseover = function()
     { countinfo.style.visibility='visible'; }
    f.count.onmouseout = function()
     { countinfo.style.visibility='hidden'; }

    f.recherche.onmouseover = function()
     { rechercheinfo.style.visibility='visible'; }
    f.recherche.onmouseout = function()
     { rechercheinfo.style.visibility='hidden'; }

    f.reset.onmouseover = function()
     { resetinfo.style.visibility='visible'; }
    f.reset.onmouseout = function()
     { resetinfo.style.visibility='hidden'; }
  }
}


//--></script>

<?php
if ( !$_POST[choix] || !$_POST[recherche])
{
echo "<table width=100% border=1 align=center>";
echo "<td colspan=9 align=center bgcolor='#cccccc'>RECHERCHE DE COLIS :<img src='s.png' width='20' height='20'></td>"; echo "</table>";
exit;
} $connect=mysql_connect("localhost", "root", "") or die ("Echec de la connexion au serveur !"); 
$select=mysql_select_db("col"); 
$query = "SELECT DISTINCT ncol,Adresse,CP,VILLE,DATE,systeme  FROM colis
WHERE  ". $_POST[choix]." = ".$_POST[recherche]." ORDER BY DATE DESC";
$result=mysql_query($query); 
$totenreg=mysql_num_rows($result);
if ( $result && mysql_num_rows($result) ==0)
echo "<td colspan=9 align=center bgcolor='#FFFFFF'><center>PAS DE REPONSES CORRESPONDANTES</td>"; 
else if ($result) {
echo "<form action='#'  onclick='return geocode(document.getElementById('req').value)'>";  
echo "<table width=100% border=0 align=center>";
echo "<tr bgcolor='#000000'>"; 
echo "<td colspan=9><b><center><span class=colee><img src='s.png' width='20' height='20'>NOMBRE DE REPONSES :  ".$totenreg."</td>";
echo "</tr>"; 
echo "<tr align=center bgcolor=#FFFFCC>";
echo "<td align=center><img src='cel2.png' width='20' height='20' alt='Numéro de colis' ></td>";
echo "<td align=center><img src='cp.png' width='20' height='20'></td>";
echo "<td align=center><img src='sy.gif' width='20' height='20'></td>";
echo "<td align=center><img src='c2.png' width='20' height='20'></td>";
echo "<td align=center><img src='f.png' width='20' height='20'></td>";
echo "</tr>"; 
$i=0; 
while ($row=mysql_fetch_array($result)) { 
if ($i==0) { 
echo "<tr bgcolor=#EEEEEE>"; 
$i++; }
else { 
echo "<tr bgcolor=#DDDDEA>";
$i--; 
}
$datTemp = $row['DATE'];
$address = $row['Adresse']."  " .$row['CP']."  ".$row['VILLE'];
if ($datTemp == '1990-01-01') {
echo "<td span class=Style2>".$row["ncol"]."</td>\n";
echo "<td span class=Style2>".$address."<input name='address' size='30' type='hidden' value='$address' ></td>";
echo "<td span class=Style2>".$row["systeme"]."</td>";
echo "<td align=center><img src='ad2.png' width='20' height='20'></td>";
echo "<input type='submit' style='margin-top:5px' value='Search!' 
           onclick='return geocode(document.getElementById('req').value)'></td>";
}
else if ($datTemp != '1990-01-01') {
echo "<td span class=Style2>".$row["ncol"]."</td>\n";
echo "<td span class=Style2>".$address."<input name='address'  type='hidden' value='$address'/></td>";
echo "<td span class=Style2>".$row["systeme"]."</td>";
list($annee,$mois,$jour) = explode("-",$datTemp); // Date Event, 2003-04-23 => 23.04.2003
echo "<td span class=Style2><b>$jour/$mois/$annee</td>";// Affichage de la date Event // 
}
else
echo "</tr>"; } 
echo "</table>"; }
include("mappy.php");
echo "</form>";
?>
	
	</body>
</html>
[/b]

Eléphant du PHP | 271 Messages

06 mai 2007, 10:23

Essai de l'écrire en ajoutant un " stripslashes "
echo "<td span class=Style2>"stripslashes(.$address.)" // à cet endroit l'adresse est compléte  
<input name='address'  type='hidden' value='$address' //à cet endroit l'adresse est coupée /></td>"; 
Je ne suis pas sûr de la concanétation "(.$address.)" mais essais cela devrait fonctionner sinon retires les points.
Patience et obstination sont des qualités !

Eléphant du PHP | 271 Messages

06 mai 2007, 10:28

Désolé, je n'ai pas tout lu
echo "<td span class=Style2>".$address." // à cet endroit l'adresse est compléte   
<input name='address'  type='hidden' value='stripslashes($address)' //à cet endroit l'adresse est coupée /></td>"; 
Essais un des 2 exemples..
Patience et obstination sont des qualités !

Mammouth du PHP | 991 Messages

06 mai 2007, 10:33

le mieux serait de rajouter le stripslash avant l'insertion dans la base de donnée, car juste le mettre a l'affichage de rajouterai juste qu'un\ devant les ' pour l'affichage et des que tu voudra utiliser les données directement depuis ta base de donnée ca va foiré puisque les \ ne seront pas dans la base de donnée.

Tu peux faire une sorte de regex afin de rajouter devant tous les caracteres qui te pose probleme
voici un
Lien
qui pointe vers un tres bon tuto pour les regex

@+ thehawk
DevOps, Symfony4, Hoa

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

06 mai 2007, 13:46

Rien à voir avec stripslashes() ou addslashes, il s'agit simplement d'avoir un résultat html cohérent. Un attribut html correctement constitué s'écrit ainsi :

Code : Tout sélectionner

attribut="valeur html entre guillemets"
Pour éviter d'avoir des guillemets entre des guillemets (ou des apostrophes entre apostrophes), il faut échapper les caractère. En html cela se fait en transformant les caractères spéciaux en entité html (et absolument pas avec des antislashs, gardez ça pour php ou js :x ). Il te faut donc passer ta valeur par htmlentities().

La virgule ne devrait pas te poser de problème, ou alors il y a autre chose dans ton code que je ne vois pas. Personnellement, je te recommande d'utiliser des guillemets pour délimiter tes attributs, ca évite ce genre de problème, et il me semble de toute façon que c'est la norme, et tu peux toujours y coller le htmlentities de toute façon :)
echo '<td span class="Style2">'.$address ;
echo '<input name="address" type="hidden" value="'.htmlentities($address).'" />';
echo '</td>';
Dans tous les cas, pour comprendre ce qui ne va pas, la première chose à faire c'est de contrôler le code source html qui a été généré :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 89 Messages

06 mai 2007, 17:00

Encore une fois merci Ryle! ta solution fonctionne.

j'en avais trouvée une autre un peu plus lourde peut-être
<?php....
echo "<td span class=Style2>".$address."";
?>
<input name='address' type='hidden' value="<?php echo $address ?>"/>
<?php
echo "</td>";
...?>