Remplacer caracteres dans une boucle

Fermé
Nichan - 20 sept. 2014 à 01:27
 Nichan - 23 sept. 2014 à 02:56
Bonjour, je suis confronte a un probleme dont je ne sais pas s'il existe ou pas une solution.

J'ai un code qui affiche le contenu d'une table selon des criteres. Mais parfois dans cette table il peut y avoir un apostrophe dans les valeurs que je recupere et je souhaiterais effectuer un replace dessus avant affichage mais je n'y arrive pas.
Je vous met les morceaux de code concernes

La requete sur les donnees

if (empty($lettre) && empty($categorie)) {$req = mysql_query("select * from manga order by id desc limit 0,25") or die( 'Erreur '.$req.'<br />'.mysql_error() );} 
else if (isset($categorie) && empty($lettre)) {$req = mysql_query("select * from manga where type LIKE '$categorie' or cat like '%$categorie%' order by title") or die( 'Erreur '.$req.'<br />'.mysql_error() );}
else {$req = mysql_query("select id, title, type, auteur, redact from manga where title regexp '($lettre)' order by title asc") or die( 'Erreur '.$req.'<br />'.mysql_error() );}

Et ensuite l'affichage selon les criteres ici les 25 nouvelles entrees dans la table

 //on affiche les dernieres fiches faites si le visiteur n'a rien choisit
if ($actu==0)
{
echo"<b>Les 25 dernieres fiches Manga :</b><br /><br />";
while ( $row = mysql_fetch_assoc( $req ) )
{
//verification apostrophe dans titre
$replace = array(" ", "'");
$replace2 = array(" ", "'");
$titreclean = str_replace ( $replace, $replace2, $title) ;
echo "<b><a href='manga2.php?id2=$row[id]&$row[title]'>$row[title]</b></a> - $row[type] - $row[auteur]<br />";} ;}

Comme vous pouvez le voir j'essaie dans la boucle de proceder a la verification et au remplacement des apostrophes mais ca ne marche pas ca ne retourne rien du tout.
A voir également:

2 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 226
Modifié par gravgun le 20/09/2014 à 10:14
'lut, arrrrrrrrgh le massacre...
Les fonctions mysql_* n'existent plus. Elles sont obsolètes dans PHP5.5 et supprimées dans PHP5.6, pour des raisons de sécurité et de design, qui avaient tendance a engendrer de très mauvais codes et de mauvaises pratiques. Surtout, l'injection SQL y était très propice si on ne faisait pas attention.

Par mauvaises pratiques, j'entends l'utilisation de mysql_real_escape_string qui finit par être confuse dans certains cas, ton utilisation de
die()
qui est juste une pratique atroce
, etc...

Pour les injections SQL, c'est ton cas, donc potentiellement n'importe qui peut détruire ta base de donnée en visitant une de tes pages. Regarde ceci:
mysql_query("select * from manga where type LIKE '$categorie' or cat like '%$categorie%' order by title")

En soi la requête est bonne, mais tu insères
$categorie
dans la requête sans aucune vérification de format autre que son existence (
isset($categorie)
).

Faire des replace sur les résultats d'une requête ou avant de la faire n'est pas une solution. Si certains caractères t'embêtent, il y a de très fortes chances que plein d'autres te causent des ennuis du même genre, il faut donc résoudre ça, pas le cacher.

Pour cela, bien tu va devoir tout refaire... Nan je plaisante, mais prend le temps avant de continuer ton projet d'apprendre a te servir de PDO ou de mysqli (syntaxiquement plus proche de mysql_*), et particulièrement des requêtes préparées (tuto PDO, tuto mysqli), qui non seulement t'évitera des injections SQL mais t'évitera de vérifier/modifier l'entrée utilisateur dans tous les sens avant de faire ta requête.

Une fois ça fait, remplace-moi tout ce bazar de mysql_* obsolète.

Autrement, ton remplacement ne marche pas pour 2 raisons:
- tu ne te sers pas de str_replace comme il faut, je t'invite a relire sa page de doc (particulièrement l'utilisation des 2 premiers paramètres)
- ton titre avec les apostrophes supposément remplacés se nomme
$titreclean
, mais tu ne t'en sers pas dans ton echo.
from human import idiocy
del idiocy
0
mon serveur est sous php 4

Et pour la variable titreclean la elle n'est pas placee parce que je sais pas comment la placer

ou comme ca

<a href='manga2.php?id2=$row[id]&$row[titreclean]'>$row[title]</b></a>

ou comme ca

<a href='manga2.php?id2=$row[id]&$titreclean'>$row[title]</b></a>
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 226
20 sept. 2014 à 23:55
2e solution ;)
0
Ca ne marche pas ca me retourne une variable vide.

Tu dis que j'utilise mal la fonction str_replace j'ai lu la doc et je ne vois pas en quoi je l'utilise mal.
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 226
22 sept. 2014 à 21:53
Désolé j'ai répondu un peu vite la dernière fois...
Je dit que tu te sers mal de
str_replace
, car vu que tes 2 tableaux de trouvaille/remplacement sont identiques, la fonction ne fait... rien. Si tu veux remplacer les apostrophes par des espaces, tu fais juste
str_replace("'", " ", $title)
.
J'ai relu vite fait ton code, si je comprend bien tu veux juste faire en sorte que l'apostrophe ne gêne pas le morceau de balise HTML? Si c'est le cas il existe
urlencode
qui est la spécifiquement pour ça:
$titreclean = urlencode($title);
; et le tour est joué ;)
0
Ca fonctionne mais pas en l'ecrivant comme toi, mais en l'ecrivant
$titreclean = urlencode($row[title]);
. Par contre ca remplace les espaces par des + c'est normal? Sinon tu as raison sur le fait que plutot que de cacher le probleme je devrais le traiter a la source. Je vais donc modifier l'insertion dans la base des infos. Je peut utiliser urlencode pour traiter mes variables avant l'envoi a la base ou je doit plutot utiliser htmlentities ou str_replace?

Ps : dans mon str_replace je ne desirais pas seulement remplacer les apostrophe mais aussi remplacer les espaces d'ou la maniere dont je l'avait ecrit.
0