Page 1 sur 2

Problème à la modification de news

Posté : 13 avr. 2008, 17:33
par ben5back'
Bonjour à tous,

Voilà j'ai codé un script de news utilisant un système de bbcode. Le souci est que lorsque je modifie une news, la modification est enregistrée comme une nouvelle news et donc sous un nouvel id. J'ai beau chercher, je ne trouve pas d'où cela vient.

J'imagine qu'il y a un souci à ce niveau : $id_news = $donnees['id']; // Cette variable va servir pour se souvenir que c'est une modification
Il doit y avoir une perte de l'id...

Ou alors est ce que cela ne pourrais pas venir de ma function bbcode_format, car à la base ce script est celui du Site du Zér0. J'ai juste rajouté ma function bbcode_format. Donc est ce que le fait d'appeler la fonction ne ferait pas perdre l'id de la news ?

Voici liste_news.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Liste des news</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
h2, th, td
{
text-align:center;
}
table
{
border-collapse:collapse;
border:2px solid black;
margin:auto;
}
th, td
{
border:1px solid black;
}
</style>
</head>

<body>

<h2><a href="rediger_news.php">Ajouter une news</a></h2>
<?php
require ("connect.php");

//-----------------------------------------------------
// Vérification 1 : est-ce qu'on veut poster une news ?
//-----------------------------------------------------
if (isset($_POST['titre']) AND isset($_POST['contenu']))
{
$titre = addslashes($_POST['titre']);
$contenu = addslashes($_POST['contenu']);
// On vérifie si c'est une modification de news ou pas
if ($_POST['id_news'] == 0)
{

//-------------------------------
// Fonction qui traite le BBcode
//-------------------------------

function bbcode_format ($contenu) {

$simple_search = array(
'/\[g\](.*?)\[\/g\]/is',
'/\[i\](.*?)\[\/i\]/is',
'/\[s\](.*?)\[\/s\]/is',
'/\[u rl="http://(.*?)\"](.*?)\[\/url\]/is',
'/\[image](.*?)\[\/image_description=(.*?)\]/is',
'/\[image_gauche](.*?)\[\/image_gauche]/is',
'/\[image_droite](.*?)\[\/image_droite]/is',
);

$simple_replace = array(
'<strong>$1</strong>',
'<em>$1</em>',
'<u>$1</u>',
'<a href="$1">$2</a>',
'<img src="$1" alt="$2" class="cadre_image" />',
'<span class="float_left">$1</span>',
'<span class="float_right">$1</span>',
);

$contenu = preg_replace ($simple_search, $simple_replace, $contenu);

return $contenu;
}
// Ce n'est pas une modification, on crée une nouvelle entrée dans la table
mysql_query("INSERT INTO news VALUES('', '" . $titre . "', '" . bbcode_format($contenu) . "', '" . time() . "')") or die(mysql_error());
}
else
{
// On protège la variable "id_news" pour éviter une faille SQL
$_POST['id_news'] = addslashes($_POST['id_news']);
// C'est une modification, on met juste à jour le titre et le contenu;
mysql_query("UPDATE news SET titre='" . $titre . "', contenu='" . $contenu . "' WHERE id='" . $_POST['id_news'] . "'") or die(mysql_error());
}
}

//--------------------------------------------------------
// Vérification 2 : est-ce qu'on veut supprimer une news ?
//--------------------------------------------------------
if (isset($_GET['supprimer_news'])) // Si on demande de supprimer une news
{
// Alors on supprime la news correspondant
// On protège la variable "id_news" pour éviter une faille SQL
$_GET['supprimer_news'] = addslashes($_GET['supprimer_news']);
mysql_query('DELETE FROM news WHERE id=\'' . $_GET['supprimer_news'] . '\'') or die(mysql_error());
}
?>
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
<th>Titre</th>
<th>Date</th>
</tr>
<?php
$retour = mysql_query('SELECT * FROM news ORDER BY id DESC');
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les éditos
{
?>
<tr>
<td><?php echo '<a href="rediger_news.php?modifier_news=' . $donnees['id'] . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="liste_news.php?supprimer_news=' . $donnees['id'] . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees['titre']); ?></td>
<td><?php echo date('d/m/Y', $donnees['timestamp']); ?></td>
</tr>
<?php
} // Fin de la boucle qui liste les news
?>
</table>
</body>
</html>
Et voici rediger_news.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>R&eacute;diger une news</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
h3, form
{
text-align:center;
}
</style>
<script type="text/javascript">
<!--
function insertion(repdeb, repfin) {
var input = document.forms['formulaire'].elements['contenu'];
input.focus();
/* pour l'Explorer Internet */
if(typeof document.selection != 'undefined') {
/* Insertion du code de formatage */
var range = document.selection.createRange();
var insText = range.text;
range.text = repdeb + insText + repfin;
/* Ajustement de la position du curseur */
range = document.selection.createRange();
if (insText.length == 0) {
range.move('character', -repfin.length);
} else {
range.moveStart('character', repdeb.length + insText.length + repfin.length);
}
range.select();
}
/* pour navigateurs plus récents basés sur Gecko*/
else if(typeof input.selectionStart != 'undefined')
{
/* Insertion du code de formatage */
var start = input.selectionStart;
var end = input.selectionEnd;
var insText = input.value.substring(start, end);
input.value = input.value.substr(0, start) + repdeb + insText + repfin + input.value.substr(end);
/* Ajustement de la position du curseur */
var pos;
if (insText.length == 0) {
pos = start + repdeb.length;
} else {
pos = start + repdeb.length + insText.length + repfin.length;
}
input.selectionStart = pos;
input.selectionEnd = pos;
}
/* pour les autres navigateurs */
else
{
/* requête de la position d'insertion */
var pos;
var re = new RegExp('^[0-9]{0,3}$');
while(!re.test(pos)) {
pos = prompt("Insertion à la position (0.." + input.value.length + "):", "0");
}
if(pos > input.value.length) {
pos = input.value.length;
}
/* Insertion du code de formatage */
var insText = prompt("Veuillez entrer le texte à formater:");
input.value = input.value.substr(0, pos) + repdeb + insText + repfin + input.value.substr(pos);
}
}
//-->
</script>
</head>

<body>
<h3><a href="liste_news.php">Retour à la liste des news</a></h3>
<?php
require ("connect.php");

if (isset($_GET['modifier_news'])) // Si on demande de modifier une news
{
// On protège la variable "modifier_news" pour éviter une faille SQL
$_GET['modifier_news'] = mysql_real_escape_string(htmlspecialchars($_GET['modifier_news']));
// On récupère les infos de la news correspondant
$retour = mysql_query('SELECT * FROM news WHERE id=\'' . $_GET['modifier_news'] . '\'') or die(mysql_error());
$donnees = mysql_fetch_array($retour);

//-------------------------------
// Fonction qui traite le BBcode
//-------------------------------

$contenu = $donnees['contenu'];

function bbcode_format ($contenu) {

$simple_search = array(
'/\<strong\>(.*?)\<\/strong\>/is',
'/\<em\>(.*?)\<\/em\>/is',
'/\<u\>(.*?)\<\/u\>/is',
'/\<a href="(.*?)"\>(.*?)\<\/a\>/is',
'/\<img src="(.*?)" alt="(.*?)" class="cadre_image" \/>/is',
'/\<span class="float_left"\>(.*?)\<\/span\>/is',
'/\<span class="float_right"\>(.*?)\<\/span\>/is',
);

$simple_replace = array(
'[g]$1[/g]',
'$1',
'$1',
'$2',
'[image]$1[/image_description=$2]',
'[image_gauche]$1[/image_gauche]',
'[image_droite]$1[/image_droite]',
);

$contenu = preg_replace ($simple_search, $simple_replace, $contenu);

return $contenu;
}

// On place le titre et le contenu dans des variables simples
$titre = stripslashes($donnees['titre']);
$contenu = bbcode_format($contenu);
$contenu = stripslashes($contenu);
$id_news = $donnees['id']; // Cette variable va servir pour se souvenir que c'est une modification

}
else // C'est qu'on rédige une nouvelle news
{
// Les variables $titre et $contenu sont vides, puisque c'est une nouvelle news
$titre = '';
$contenu = '';
$id_news = 0; // La variable vaut 0, donc on se souviendra que ce n'est pas une modification
}
?>
<form action="liste_news.php" method="post" name="formulaire">
<p align="center"><h4>Titre :</h4>
<input type="text" size="30" name="titre" value="<?php echo $titre; ?>"/><br /><br />
<h4>Contenu : </h4><input type="button" value="Gras" onClick="insertion('[g]', '[/g]')"/>&nbsp;
<input type="button" value="Italique" onClick="insertion('', '')"/>&nbsp;
<input type="button" value="Souligné" onClick="insertion('', '')"/>&nbsp;
<input type="button" value="Lien" onClick="insertion('', '')"/>&nbsp;
<input type="button" value="Image" onClick="insertion('[image]', '[/image_description=]')"/>&nbsp;
<input type="button" value="Image alignée à gauche du texte" onClick="insertion('[image_gauche]', '[/image_gauche]')"/>&nbsp;
<input type="button" value="Image alignée à droite du texte" onClick="insertion('[image_droite]', '[/image_droite]')"/><br /><br />
<textarea type="text" cols="80" rows="20" name="contenu"><?php echo $contenu; ?></textarea></td>
<br /><br />
<input type="submit" value="Envoyer" /></p>
</form>
</body>
</html>
Merci d'avance ;)

Posté : 13 avr. 2008, 23:37
par Hywan
Hey,

Woow, ce serait plus facile à lire avec une colorisation syntaxique quand même ! Là, j'ai les yeux qui pleurent ... Tente d'utiliser (voire même d'éditer ton message avec) la balise
 par exemple, c'est super utile, tu verras ;-).

Sinon, je ne vois pas — au premier coup d'œil — de chose qui ne va pas. En fait, j'ai simplement fait une lecture en diagonale, mais je vais quand même te donner un conseil. Place des [i]echo[/i] un peu partout, et tu pourras suivre l'exécution de ton script au pas à pas. Et de cette façon, tu vas pouvoir voir le parcours qu'il fait et donc débugger toi-même ton script :). Une fois que tu connaîtras son parcours, tu pourras même afficher les variables (id par exemple ?) pour voir ce qu'elles contiennent, les comparer et ainsi, comprendre ce qui ne va pas :).

À toi de jouer ;-).

Posté : 14 avr. 2008, 19:17
par ben5back
Voilà j'ai placer des echosdans rediger_news.php, après peut être pas parfaitement où il faut... En tout cas, tout à l'air correcte. Lorsque je pose une nouvelle news, la variable id est bien égale à 0 et lorsque j'en modifie une elle est bien égale à 59 par exemple si c'est la news n°59. Donc je pense que c'est à l'enregistrement que la valeur de l'id est perdue... Mais je ne vois pas où :(

Je remets les codes php avec la balise php ;)

Voici liste_news.php :
<?php
require ("Gt2JM8Pf/connect.php");

//-----------------------------------------------------
// Vérification 1 : est-ce qu'on veut poster une news ?
//-----------------------------------------------------
if (isset($_POST['titre']) AND isset($_POST['contenu']))
{
    $titre = addslashes($_POST['titre']);
    $contenu = addslashes($_POST['contenu']);
    // On vérifie si c'est une modification de news ou pas
    if ($_POST['id_news'] < 1)
    {
	
//-------------------------------
// Fonction qui traite le BBcode
//-------------------------------

function bbcode_format ($contenu) {

        $simple_search = array(
                                '/\[g\](.*?)\[\/g\]/is',                               
                                '/\[i\](.*?)\[\/i\]/is',                               
                                '/\[s\](.*?)\[\/s\]/is',
								'/\[url=(.*?)\](.*?)\[\/url\]/is',
								'/\[image](.*?)\[\/image_description=(.*?)\]/is',
								'/\[image_gauche](.*?)\[\/image_gauche]/is',
								'/\[image_droite](.*?)\[\/image_droite]/is',
                                );

        $simple_replace = array(
                                '<strong>$1</strong>',
                                '<em>$1</em>',
                                '<u>$1</u>',
								'<a href="$1">$2</a>',
								'<img src="$1" alt="$2" class="cadre_image" />',
								'<span class="float_left">$1</span>',
								'<span class="float_right">$1</span>',
                                );
								
        $contenu = preg_replace ($simple_search, $simple_replace, $contenu);

        return $contenu;
}
        // Ce n'est pas une modification, on crée une nouvelle entrée dans la table
        mysql_query("INSERT INTO news VALUES('', '" . $titre . "', '" . bbcode_format($contenu) . "', '" . time() . "')") or die(mysql_error());
		
    }
    else
    {
        // On protège la variable "id_news" pour éviter une faille SQL
        $_POST['id_news'] = addslashes($_POST['id_news']);
        // C'est une modification, on met juste à jour le titre et le contenu;
		mysql_query("UPDATE news SET titre='" . $titre . "', contenu='" . $contenu . "' WHERE id='" . $_POST['id_news'] . "'") or die(mysql_error());
    }
}
 
//--------------------------------------------------------
// Vérification 2 : est-ce qu'on veut supprimer une news ?
//--------------------------------------------------------
if (isset($_GET['supprimer_news'])) // Si on demande de supprimer une news
{
    // Alors on supprime la news correspondant
    // On protège la variable "id_news" pour éviter une faille SQL
    $_GET['supprimer_news'] = addslashes($_GET['supprimer_news']);
    mysql_query('DELETE FROM news WHERE id=\'' . $_GET['supprimer_news'] . '\'') or die(mysql_error());
}
?>
Et voici rediger_news.php :
<?php
require ("Gt2JM8Pf/connect.php");

if (isset($_GET['modifier_news'])) // Si on demande de modifier une news
{
    // On protège la variable "modifier_news" pour éviter une faille SQL
    $_GET['modifier_news'] = mysql_real_escape_string(htmlspecialchars($_GET['modifier_news']));
    // On récupère les infos de la news correspondant
    $retour = mysql_query('SELECT * FROM news WHERE id=\'' . $_GET['modifier_news'] . '\'') or die(mysql_error());
    $donnees = mysql_fetch_array($retour); 
	
//-------------------------------
// Fonction qui traite le BBcode
//-------------------------------

$contenu = $donnees['contenu'];
	
function bbcode_format ($contenu) {

        $simple_search = array(
                                '/\<strong\>(.*?)\<\/strong\>/is',                               
                                '/\<em\>(.*?)\<\/em\>/is',                               
                                '/\<u\>(.*?)\<\/u\>/is',
								'/\<a href="(.*?)"\>(.*?)\<\/a\>/is',
								'/\<img src="(.*?)" alt="(.*?)" class="cadre_image" \/>/is',
								'/\<span class="float_left"\>(.*?)\<\/span\>/is',
								'/\<span class="float_right"\>(.*?)\<\/span\>/is',
                                );

        $simple_replace = array(
                                '[g]$1[/g]',
                                '[i]$1[/i]',
                                '[s]$1[/s]',
								'[url=$1]$2[/url]',
								'[image]$1[/image_description=$2]',
								'[image_gauche]$1[/image_gauche]',
								'[image_droite]$1[/image_droite]',
                                );
								
        $contenu = preg_replace ($simple_search, $simple_replace, $contenu);

        return $contenu;
}
   
    // On place le titre et le contenu dans des variables simples
    $titre = stripslashes($donnees['titre']);
	$contenu = bbcode_format($contenu);
	$contenu = stripslashes($contenu);
    $id_news = $donnees['id']; // Cette variable va servir pour se souvenir que c'est une modification
	echo ("$id_news");
	
}
else // C'est qu'on rédige une nouvelle news
{
    // Les variables $titre et $contenu sont vides, puisque c'est une nouvelle news
    $titre = '';
    $contenu = '';
    $id_news = 0; // La variable vaut 0, donc on se souviendra que ce n'est pas une modification
	echo ("$id_news");
}
?>

Merci d'avance :D

Posté : 14 avr. 2008, 19:20
par Hywan
Pas besoin de mettre des parenthèses pour echo.

Montre nous juste la ligne concernée.

Posté : 14 avr. 2008, 19:23
par ben5back
Comment ça la ligne concernée ?

Posté : 14 avr. 2008, 19:25
par Hywan
Normalement, à l'aide des echos, tu as pu trouver la ligne qui pose problème : celle qui ne réagit pas comment tu veux. C'est celle-là que je veux.

Posté : 14 avr. 2008, 19:27
par ben5back
Euh oui surement, mais les echo tels qu'ils sont placés ne me donnent que la valeur de l'id.

:wink:

Posté : 14 avr. 2008, 19:31
par Hywan
Tes echos te permettent de suivre l'exécution de ton script et de savoir où il y a un problème. Tu places un echo mais pas de n'importe quoi. Tu peux dire :
echo 'Je suis ici, c\'est normal, et id vaut ' . $id . '.' . "\n";
par exemple. Il ne faut pas écrire des echos bêtement, mais les placer là où ton script doit passer, et tu affiches les valeurs. En théorie, tu devrais aboutir sur un mysql_query. On va voir si c'est la bonne requête avec les bonnes valeurs qui sera exécutée.

Posté : 14 avr. 2008, 19:32
par ben5back
C'est bon, ca marche !!!

Le problème vient du fait que avant le bouton, je n'ai pas fait un input de type hidden qui contient l'id de la news. Actuellement, dans mon code, il ne peux pas exploiter l'id, puisque je ne l'envoies pas par une variable POST.

Je n'ai pas trouvé ça tout seul, c'est grâce à un membre d'un autre forum, merci lui. Et merci à toi HyWaN tout de même :D

Posté : 14 avr. 2008, 19:35
par Hywan
Ce que je voulais c'est que tu trouves par toi-même. Si on te donne la réponse, tu ne trouverais pas la prochaine fois et tu reviendrais ici. J'espère juste que tu as compris le raisonnement que j'ai essayé de te faire apprendre. Et à la prochaine.

Pense également à marquer ton sujet comme résolu :).

Posté : 14 avr. 2008, 20:27
par ben5back
Oui oui, j'ai bien compris le raisonnement :D
Pense également à marquer ton sujet comme résolu :).
Je ne peux pas, car je l'ai écrit en tant d'invité ;)

Posté : 14 avr. 2008, 21:15
par ben5back
Euh j'ai encore un petit souci. Rien que le fait de mettre type="hidden", le bbcode ne s'exécute plus... :(
Et si je mets type="text", le bbcode remarche mais par contre mon problème de tout à l'heure recommence...

Je ne comprends pas pourquoi ce petit bout de code influence sur l'exécution du bbcode :shock:

Code : Tout sélectionner

<input type="hidden" name="id_news" value="<?php echo $id_news; ?>" size="30"/>
merci ;)

Posté : 15 avr. 2008, 20:56
par ben5back
Up ! :wink:

Posté : 15 avr. 2008, 23:28
par Hywan
Que te disent tes echos et tes var_dump ?

Je pense que tu dois commencer à me trouver un peu lourd, mais j'aimerais que tu trouves en débuggant toi-même.

Posté : 15 avr. 2008, 23:32
par zeus
Modération:
Je vais appuyer Hywan en t'informant que nous ne sommes pas là pour debugger tes scripts à ta place.
Nous allons t'apprendre à le faire par toi même, il est donc nécessaire que tu fournisses un minimum d'effort de compréhension