Problème à la modification de news

ben5back'
Invité n'ayant pas de compte PHPfrance

13 avr. 2008, 17:33

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 ;)

ViPHP
ViPHP | 4674 Messages

13 avr. 2008, 23:37

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 ;-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 9 Messages

14 avr. 2008, 19:17

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

ViPHP
ViPHP | 4674 Messages

14 avr. 2008, 19:20

Pas besoin de mettre des parenthèses pour echo.

Montre nous juste la ligne concernée.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 9 Messages

14 avr. 2008, 19:23

Comment ça la ligne concernée ?

ViPHP
ViPHP | 4674 Messages

14 avr. 2008, 19:25

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 9 Messages

14 avr. 2008, 19:27

Euh oui surement, mais les echo tels qu'ils sont placés ne me donnent que la valeur de l'id.

:wink:

ViPHP
ViPHP | 4674 Messages

14 avr. 2008, 19:31

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 9 Messages

14 avr. 2008, 19:32

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

ViPHP
ViPHP | 4674 Messages

14 avr. 2008, 19:35

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 :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 9 Messages

14 avr. 2008, 20:27

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é ;)

Petit nouveau ! | 9 Messages

14 avr. 2008, 21:15

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 ;)

Petit nouveau ! | 9 Messages

15 avr. 2008, 20:56

Up ! :wink:

ViPHP
ViPHP | 4674 Messages

15 avr. 2008, 23:28

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 avr. 2008, 23:32

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer