Bonjour à tous, Je vous explique.. J'ai fait un système de news, un système de commentaire et je suis sur la page voir.php hors la je veux mettre un langage BBCode (tout est configurer par rapport au tutos de grafikart) mais gros problème je n'arrive toujours pas à traduire les codes bbcode :( (en dessous du code ci-dessous il y a mon formulaire) Le lien de mon site est: [url=http://zombiekillers.laxone.fr/voir.php?id=13]http://zombiekillers.laxone.fr/voir.php?id=13[/url] (au moins vous verrez mieux^^) [code]<?php if(!empty($_POST)){
$texte = $_POST['contenu'];
$texte = htmlentities($texte,ENT_NOQUOTES,'UTF-8');
$conv = array(
'[b](.?)[\/b]' => ' $1' ); foreach($conv as $k=>$v){ $texte = preg_replace('/'.$k.'/',$v,$texte); } $texte = nl2br($texte); echo $texte; } ?><?php require "config.php";
mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
mysql_select_db("shry");
$sql="SELECT
FROM news WHERE id={$_GET["id"]}";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'
'.mysql_error()); while($data=mysql_fetch_assoc($req)){ echo "

{$data["titre"]}

"; echo "

{$data["contenu"]}

"; echo "

Ajouté le ".date("d/m/Y à H:i",strtotime($data["date"]))." par {$data["author"]}

"; } $sql="SELECT * FROM commentaire WHERE news_id={$_GET["id"]} ORDER BY id DESC"; $req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error()); while($data2=mysql_fetch_assoc($req)){ echo "
"; echo "

Posté le ".date("d/m/Y à H:i",strtotime($data["date"]))." par {$data2["pseudo"]}

"; echo "

{$data2["contenu"]}

"; } ?>[/code] Et j'ai un autre problème avec la même page car plus possible de rajouter une news: message d'erreur: Erreur SQL ! SELECT * FROM news WHERE id= You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 Elle est créer mais l'id ne s'enregistre pas. :( [code] <form action="addcom.php" method="post">
<input type="hidden" name="news_id" value="<?php echo $data[" id>"/>
<strong>Pseudo :</strong> <input type="text" class="titre" name="pseudo"><br><br>
<strong>Adresse E-mail :</strong> <input type="text" name="mail" class="titre"><br><br>
<strong>Contenu :</strong> <br><br>
<textarea name="contenu" class="contenu"></textarea><br><br>
<input type="submit" class="submit" value="Envoyez"><br>
<p><a href="index.php" class="fontsmall">Retour</a></p>
<br>
</form>[/code] Le addcom.php [code]<?php foreach($_POST as $k=>$v) { $_POST[$k] = addslashes($v); } ?> <?php require "config.php";
mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
mysql_select_db("shry");
extract($_POST);
$sql="INSERT INTO commentaire (pseudo,url,mail,contenu,news_id) VALUES ('$pseudo','$url','$mail','$contenu','$news_id')";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'
'.mysql_error()); header("Location: voir.php?id=$news_id"); ?>[/code] Je vous remercie d'avance, Cordialement

27 réponses


Shryler
Auteur

Aidez moi s'il vous plait ^^

essaye de débugger addcom.php en affectant des variables aux champs que tu récupère et en les affichant, sans faire de redirection avec le header("location...") . De manière générale je préfère récupèrer les champs dans des variables et les tracer les pour voir où se situe le problème.
Par ailleurs ton $news_id doit être un integer unsigned, pas besoin de l'échapper avec des ' lors de l'INSERT INTO.
Enfin vérifie ta bdd si l'INSERT de comm' a vraiment lieu, j'ai essayé de poster des commentaires sans succès.

Il ne connait pas $data'id'] de ton formulaire (et c'est normal) :)
Tu devrais mettre $_GET'id'] à la place (<input type="hidden" name="news_id" value="<?php echo $data"id"]; ?>"/>)

je ferais un déjà print_r du POST pour voir si tu récupère bien quelque chose...
et pense à "urlencoder" l'id lors de la redirection
sinon sympa le site le header est pas mal, vivement que tu ajoutes + de contenu ;)

Shryler
Auteur

Je récupère bien j'ai vérifier dans mon Phpmyadmin, mais l'id est 0.

Bon bin +1 pour PhiSyX niquel je te remercie, merci aux autres aussi.
Mon problème a été rectifier grâce à $_GET'id'] je suis con car il faut "prendre" les informations donc GET^^ mais au moins ça m'apprend.

Par contre toujours mon problème par rapport à BBCode.

Fais un truc comme çà : [code]function convert_bbcode($texte) { $texte = htmlentities($texte, ENT_NOQUOTES, 'UTF-8'); $conv = array( '[b](.*?)[\/b]' => ' $1' ); foreach ($conv as $k => $v) { $texte = preg_replace('/' . $k . '/i', $v, $texte); } $texte = nl2br($texte); return $texte; } if (!empty($_POST['contenu'])) { echo convert_bbcode($_POST['contenu']); } // Affichage des données (While news) echo "

" . convert_bbcode($data["contenu"]) . "

";[/code]

Shryler
Auteur

http://zombiekillers.laxone.fr/voir.php?id=6

ça m'affiche toujours pas!

Ha oui, j'ai oublié tu veux aussi mettre la fonction convert_bbcode(...) dans l'affichage du contenu des commentaires…
echo "<p>" . convert_bbcode($data2"contenu"]) . "</p></div>";

Shryler
Auteur

Bon bin c'est niquel (Logique j'ai compris mon erreur, et c'est ça le plus important, car si je créer une "règle" et que je ne l'applique pas à l'endroit que je veux l'utiliser, cela sert à rien^^) Merci beaucoup PhiSyX. Dernière question: [code]

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Création en cours..</title><meta content="Shryler" name="description"><link rel="stylesheet" type="text/css" href="../cssfiles/style.css"><link rel="stylesheet" type="text/css" href="../cssfiles/grid.css"><link rel="stylesheet" type="text/css" href="styleadmin.css">

**Commentaire

* Création ***

Votre commentaire à été ajouté avec succès
Redirection automatique
<?php $sql="SELECT * FROM commentaire WHERE news_id={$_GET["id"]} ORDER BY id DESC";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'
'.mysql_error()); ?><meta http-equiv="Refresh" content="2;url=voir.php?id=$id">

Copyright 2011 - Tous droits réservés - Zombie Killers

[/code] J'ai créer une page directionnel automatique mais je veux que sa retourne sur la page voir.php?id= et le numéro de la news. mais je ne trouve pas le moyen, j'ai essayé GET, $id, mais je voit pas ou je fais une erreur. Donc en faites c'est: comment mettre du php dans des balises meta (car je voudrais aussi pour facebook que FB prennent le titre et le contenu de la news sur la page) Ensuite j'ai fait comme dans le tuto mais ça prend que le code pour l'url, il me semble que la virgule bloque les autres codes [code] $conv = array( '[b](.*?)[\/b]' => ' $1', '[i](.*?)[\/i]' => '$1', '[u](.*?)[\/u]' => '<u>$1</u>', '[img](.*?)[\/img]' => ' ', '[url=([^]]*)](.*)[\/url]' => ' $2' ); [/code]

Essaye ceci, je sais pas si ça marchera :

<meta http-equiv="Refresh" content="2"; url="voir.php?id=<?php echo $data"id"]; ?>" />
Shryler
Auteur

Bin le problème c'est que ça me renvoi toujours à ma page redirectionnel et non à la page voir.php

Shryler
Auteur

Bon j'ai résolu ce problème en modifiant mon addcom.php [code]header("Location: voir.php?id=$news_id&p=1");[/code] J'ai mit ça et dans ma page voir.php?id=, j'ai mit une condition pour que quand il y a &p=1, ça me mette un popup interne: [code] <?php if(isset($_GET['p']) && $_GET['p']==1){
echo '<div class="success">Votre commentaire à bien été posté.

'; } ?>[/code] Résultat sur: http://zombiekillers.laxone.fr/voir.php?id=6&p=1 Bref, j'ai toujours un problème avec mon bbcode :'( [code] $conv = array( '[b](.*?)[\/b]' => ' $1', '[i](.*?)[\/i]' => '$1', '[u](.*?)[\/u]' => '<u>$1</u>', '[img](.*?)[\/img]' => ' ', '[url=([^]]*)](.*)[\/url]' => ' $2' ); [/code] Il me semble que les virgules bloque, car [url] fonctionne sur le site, hors si j'enlève les virgules, ça marche pas non plus :'(

Si tu as plusieurs éléments il faut mettre la virgule. Mais si tu en à qu'un alors ne met pas de virgule.
Si ça peut t'aider voici une partie de mon code qui fonctionne bien.

Shryler
Auteur

Franchement je ne voit pas :( [code]<?php function convert_bbcode($texte)
{
$texte = htmlentities($texte, ENTNOQUOTES, 'UTF-8');
$conv = array(
'[b](.?)[\/b]' => ' $1', '[i](.\?)[\/i]' => '
$1_', '[u](.*?)[\/u]' => '<u>$1</u>', '[img](.*?)[\/img]' => ' ', '[url=([^]]*)](.*)[\/url]' => ' $2', ); foreach ($conv as $k => $v); { $texte = preg_replace('/' . $k . '/', $v, $texte); } $texte = nl2br($texte); return $texte; } if (!empty($_POST['contenu'])) { echo convert_bbcode($_POST['contenu']); } echo "

" . convert_bbcode($data["contenu"]) . "

"; require "config.php"; mysql_connect(DB_HOST,DB_LOGIN,DB_PASS); mysql_select_db("shry"); $sql = "SELECT * FROM news WHERE id={$_GET["id"]}"; $req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error()); while($data=mysql_fetch_assoc($req)){ echo "

{$data["titre"]}

"; echo "

{$data["contenu"]}

"; echo "

Ajouté le ".date("d/m/Y à H:i",strtotime($data["date"]))." par {$data["author"]}
"; echo "Partager

"; } $sql="SELECT * FROM commentaire WHERE news_id={$_GET["id"]} ORDER BY id DESC"; $req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error()); while($data2=mysql_fetch_assoc($req)){ echo "
"; echo "

Posté le ".date("d/m/Y à H:i",strtotime($data2["date"]))." par {$data2["pseudo"]}

"; echo "

" . convert_bbcode($data2["contenu"]) . "

"; } ?>

<center>
<form action="addcom.php" method="post">
<input type="hidden" name="news_id" value="<?php echo $_GET['id'] ?>">
<strong>Pseudo :</strong> <input type="text" class="titre" name="pseudo"><br><br>
<strong>Adresse E-mail :</strong> <input type="text" name="mail" class="titre"><br><br>
<strong>Contenu :</strong> <br><br>
<textarea name="contenu" class="contenu"></textarea><br><br>
<input type="submit" class="submit" value="Envoyez"><br>
<p><a href="index.php" class="fontsmall">Retour</a></p>
<br>
</form>[/code]</center>

Essaye de passer la commande "foreach" dans la boucle "while".

while($data2=mysql_fetch_assoc($req)){  
        echo "<div id=\"divcom\">";    
        echo "<p class=\"datecom\">Posté le ".date("d/m/Y à H:i",strtotime($data2"date"]))." par <a href=\"mailto:{$data2"mail"]}\">{$data2"pseudo"]}</a></p>";
        foreach($conv as $k=>$v){    
            $data2"contenu"] = preg_replace('/'.$k.'/',$v,$data2"contenu"]);    
        }    

        echo "<p>{$data2"contenu"]}</p></div>";   
    }
Shryler
Auteur

Non toujours pas, franchement je voit pas ou je pourrais faire une erreur sérieux :(

Je remonte le sujet car j'ai moi aussi ce problème sans voir pour le moment d'où ça provient.

J'ai une fonction du même genre qui doit à l'affichage montrer le rendu du bbcode. Hors il n'applique QUE la dernière valeur du bbcode.
Du coup tout le bbcode n'est pas appliquer et c'est assez gênant è_é. Si vous avez une solution je suis preneur (à moins que j'en trouve une avant :)).

Je re-pense à une chose avez vous essayer avant le foreach :

$data"contenu"] = nl2br(htmlentities($data"contenu"],ENT_NOQUOTES,'UTF-8'));

Ça ne change rien, je ne pense pas que ça vienne de quelque chose comme ça mais plutôt du preg_replace qui n'a pas l'air de se faire pour tous ou alors qui le fait mais en appliquant seulement le dernier, mais je ne sais pas pour quelle raison...

J'utilise un framework et mon contenu est déjà filtré avant de passer dans la fonction en plus.
J'utilise des objets sinon mais la fonction preg_replace ne les prend pas en compte (sous forme d'array), je l'ai donc "converti" en simple array mais même en testant avec le champ du array que je souhaite (du moins celui que je souhaite le plus) convertir pour le bbcode ça ne fonctionne pas.
Il me renvoi toujours la dernière valeur de l'array contenant les regex du preg et la valeur qui la remplace.

Alors j'ai lu certains truc par rapport à au regex, essayez ceci : [code]'[code]((.+\n?)+)[\/code]' =>'$1' [/code] Si ça ne marche toujours pas, voir sinon à refaire le tuto :S

Y'a quoi de différent par rapport à nous dans ton code là ? Parce que le donner mais si on peut savoir ce qu'à tu as changés ^^".

Et puis je ne pense pas que ça règle mon soucis mais bon je testerais, je pense que ça viens plutôt de la lecture de l'array contenant les regex.

En gros le "n" dans le regex permet de prendre en compte les sauts de ligne et sans parfois ça porte à conflit.

Hello, Utilisez [url=http://php.net/manual/fr/function.str-replace.php]str\_replace[/url]() lorsque vous avez de simple balises, sinon utilisez les regex. Pourquoi? 1. C'est 10x plus rapide, plus lisible 2. Pas besoin de faire de boucle foreach ou autre, la fonction accepte les tableaux (Array). Voici un exemple: [code]<?php // Récupérer votre texte depuis votre base de donnée (ou $_POST)
$text = strip_tags($text);

$search_bbcode = array(
' ', '', // '', ' ', Enlevez les espaces
'', '', // '[i]', '[/i]', Enlevez les espaces
'[u]', '[/u]' // '[u]', '[/u]' Enlevez les espaces
);

$replace_bbcode = array(
'<span style="font-weight:bold;">', '', // b, strong ou span[style="font-weight:bold;"] '', '', // i, em ou span[style="font-style:italic;"] '', '' // u ou span[style="text-decoration:underline;"] ); $text = str_replace($search_bbcode, $replace_bbcode, $text); $sr_bbcode_regex = array( '[url="(http[s]?:[\/]{2}(?:.[^\s]*))"](.*)[\/url]' => ' $2', // [url="http://monsite.tld/"]Nouveau site[/url] (Enlevez les espaces) '[img="(http[s]?:[\/]{2}(?:.[^\s]*))"]' => ' ' // [img="http://www.google.be/images/nav\_logo83.png"] ); foreach ($sr_bbcode_regex as $key => $value) { $text = preg_replace('/' . $key . '/i', $value, $text); } echo nl2br($text); ?>[/code] **Rendu HTML**: [code]Salut ça va?... Pwet pwet
Nouveau site &&
Blabla[/code] Voilà… Si ça peut vous aider :) EDIT: Arf, ça modifie le BBCode même dans les balises [code], pas cool :p

PhiSyX je comprend pas la différence avec nous en faites du coup. Et si on peut pas faire sur les balises [test][/test] vers du html ça va pas trop servir ^^'. Et puis si je peux tout ranger dans un array ce sera tant mieux.

Sinon ZiOu j'ai vaguement testé mais étant donné que j'ai d'autres balises je ne sais pas trop si ça aurait dû bien fonctionner, mais même en le mettant au début dans l'array ça ne fonctionne pas il m'affiche les balises entre crochets.

Je désespère XD.
Tu les places où les \n que je puisse les placer moi aussi dans mes autres regex ?

Ouai nan je viens de tester vite fait ça ne marche pas non plu avec mon code.

@Dexyne: Bah, la différence c'est que ça fonctionne, non? ( Vidéo privée: http://www.dailymotion.com/video/k23llN2nU6GO1K2oGdM )

Dans un post précédent, tu as dit:
"J'ai une fonction du même genre qui doit à l'affichage montrer le rendu du bbcode. Hors il n'applique QUE la dernière valeur du bbcode.
Du coup tout le bbcode n'est pas appliquer et c'est assez gênant è_é. Si vous avez une solution je suis preneur (à moins que j'en trouve une avant)."

Dans le "Rendu HTML" que j'ai mis plus haut, TOUT est converti… Tu peux même le voir sur la vidéo.

Ou alors je n'ai pas du tout compris… ?

J'ai rien avec une relecture j'ai compris ce que tu faisais via ton code, ce que j'avais mal compris mais je vois ce que tu voulais faire avec ^^.
Par contre je ne comprend pas pourquoi tu disais qu'il n'y avait pas besoin de foreach puisqu'il y en a une =O.

Sinon je vais tester puis faire savoir si ça fonctionne.

EDIT: Bah j'ai testé mais ça à pas l'air de fonctionner...que ce soit les balises HTML ou BBCode..
Re-EDIT: En faite ça fonctionne bien xD Merci de ton aide PhiSyX ! :)