Problème script édition/suppression d'articles

Eléphant du PHP | 57 Messages

18 mai 2011, 15:34

Bonjour à tous,

J'ai quelques problèmes avec la réalisation du backoffice de mon site.
J'ai 3 script : un d'ajout, un d'édition et un autre de suppression des articles de blog.
Mon script d'ajout fonctionne parfaitement, en revanche par les deux autres.
En effet, ceux-ci sont fait en 3 fichiers et non pas en 2 comme le premier.

Ceci engendre donc un problème : je n'arrive pas à récupérer mon idArticle, pourtant passé en paramètre dans l'URL.

Voici mon code pour l'édition:

editerarticle.php :
<?php
        // [...]tout mon système d'arborescence qui fonctionne très bien
	// affichage des produits
	$requete = 'SELECT idArticle, idCat, titreArticle, contenuArticle, photoArticle,  descPhoto FROM articles where idCat = \'' . $categorie . '\' ORDER BY dateArticle DESC;';
	$resultat = mysql_query ($requete, $connexion);
	if (!empty($resultat))
	{
		while ($monArticle = mysql_fetch_object ($resultat))
		{
			$contenu = $monArticle->contenuArticle;
			$contenu = substr($contenu, 0, 100);
			echo '<a href="editer.php?categorie='.$monArticle->idCat.'&article='.$monArticle->idArticle.'">';
			echo '<div class="edit">';
			echo '<h3>' .$monArticle->titreArticle. '</h3>';
			echo '<p>' .$contenu. '...</p>';
			echo '</a>';
			echo '</div>';
		}
	}
	else
	{
		echo "Erreur dans l'exécution de la requête.<br/>\n";
		echo "Message de MySQL : ", mysql_error($connexion);
	}
		echo '</ul>';
		echo '</div><br/>';
mon formulaire "form_editionarticle.php" :
<?php
	require_once('connexion.php'); // connexion à la base
	$idArticle = $_GET['article'];
	$request = 'SELECT * FROM articles WHERE idArticle = "'.$idArticle.'";'; // récupération des informations relatives à l'article demandé
	$resultat = mysql_query ($request, $connexion);
	if (!empty($resultat) or die(mysql_error()))
	{
		while ($monArticle = mysql_fetch_object ($resultat))
		{
			/*********** Renommage des variables relatives à $monArticle pour leur exploitation ultérieure ************/
			$titreArticle = $monArticle->titreArticle;
			$contenuArticle = $monArticle->contenuArticle;
			$descPhoto = $monArticle->descPhoto;
			$idCat = $monArticle->idCat;
			$photoArticle = $monArticle->photoArticle;
		}
	}
	else
	{
		echo '<p> Echec de la requête générale d\'édition</p>';
	}
?>
<TABLE width=100% border=0>
<form action="../edition/editer.php" method="post" enctype="multipart/form-data">
	<TR>
		<TD colspan=3><a href="javascript:window.history.go(-3)"><input type="button" value="Retour à la sélection des articles"></input></a></TD>
	</TR>
	<TR>
		<td colspan=1> Titre de l'article : </td>
		<td colspan=2><input type="text" name="titreArticle" size=108 value="<?php echo $titreArticle; ?>"/></td>
	</TR>
	<tr>
		<td colspan="1"> Contenu de l'article : </td>
		<td colspan="2"><textarea name="contenuArticle" rows=15 cols=110 /><?php echo $contenuArticle; ?></textarea></td>
	</tr>
	<tr>
		<td colspan="1">Catégorie :</td>
		<td colspan="2"><em class="info">Pensez à re-sélectionner la catégorie, même si elle reste inchangée.</em><br/>
			<select name="idCat">
					<option selected="selected"> <?php //echo $nomCat; ?></option>
					<?php
					$requete = 'SELECT * FROM categories WHERE idCat>=5 ORDER BY nomCat ASC' ;
					$resultat = mysql_query ($requete, $connexion);
					if (!empty($resultat))
					{
						while ($cat = mysql_fetch_object ($resultat))
						{
							$nomCat = $cat->nomCat;
							echo '<option value="'.$cat->idCat.'">'.$cat->nomCat.'</option>';
						}
					}
					else
					{
						echo "Message de MySQL : ", mysql_error($connexion);
					}
					?>
			</select>
		</td>
	</tr>
	<tr>
		<td width="33%"> Photo : </td>
		<td width="45%"><input type="file" name="photoArticle" id="Changer de photo ?"/></input></td>
		<td width="23%"><img src="<?php echo $photoArticle; ?>"></img></td>
	</tr>
	<tr>
		<td colspan="1"> Description : </td>
		<td colspan="2"><input type="text" name="descPhoto" value="<?php echo $descPhoto; ?>"/></input></td>
	</tr>
	<tr>
		<td colspan="1"><input type="submit" name="submit"/></input></td>
	</tr>
</form>
</TABLE>
<br/><br/>

<?php mysql_close($connexion); //déconnexion ?>
et enfin mon script d'édition "editer.php" :
<?php
	require_once('../includes/connexion.php');
	session_start();
	if (!isset($_SESSION['login']))
	{
		header('Location:../index.php');
		exit();
	}
		echo '<div id="content">';
		include('../includes/header.php');
		include('../fonctions/fctredimimage.php');
$idArticle = $_GET['article'];
if (isset($_POST['submit']))
{
	$idCat = ($_POST["idCat"]);
	$titreArticle = htmlspecialchars($_POST["titreArticle"]);
	$contenuArticle = htmlspecialchars($_POST["contenuArticle"]);
	$photoArticle = $_FILES["photoArticle"];
	$descPhoto = htmlspecialchars($_POST["descPhoto"]);
	addslashes($contenuArticle) && addslashes($titreArticle) && addslashes($descPhoto);

	if(!empty($idCat))
	{
		//----------------------------------------------------------------------------------------------------------------
		// TRAITEMENT DE L'IMAGE
		//----------------------------------------------------------------------------------------------------------------
		$nomOrigine = $_FILES['photoArticle']['name'];
		$repertoireOrigine = "c:/wamp/tmp/";
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		$repertoireDestination = "c:/wamp/www/smtk/photos/";
		$nomDestination = "photo".date("YmdHis").".".$extensionFichier;

		if (!(in_array($extensionFichier, $extensionsAutorisees)))
		{
			echo "Le fichier n'a pas l'extension attendue";
		}
		else
		{
			if (move_uploaded_file($_FILES['photoArticle']["tmp_name"],	$repertoireDestination.$nomDestination))
			{

				$redimOK = fctredimimage(200,270,$repertoireDestination,$nomDestination,$repertoireDestination,$nomDestination);
				if ($redimOK == true)
				{
					//	echo 'Redimensionnement OK !';
				}
				else
				{
					echo 'Le redimensionnement a réussi.';
				}
				$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);
				// ca marche !
			}
			else
			{
				echo "Le fichier n'a pas été uploadé ";
			}
		}

/**********************************************************************/
/******************* REQUETE SQL D'AJOUT DANS LA BDD ******************/
/**********************************************************************/
		$req = "UPDATE articles
        SET
        idCat = '$idCat',
        titreArticle = '$titreArticle',
        photoArticle = '$URLPhoto',
        descPhoto = '$descPhoto',
        contenuArticle = '$contenuArticle'
        WHERE idArticle = '$idArticle';";

		$result = mysql_query($req, $connexion) or die(mysql_error());

		if ($result)
		{
			echo '<div class="valide"><p>La modification a été correctement effectuée.</p></div>' ;
		}
		else
		{
			echo '<div class="echec"><p> La modification a échoué.</p></div>';
		}
	}
	else echo '<div class="echec"><p> Vous n\'avez pas rempli tous les champs. </p></div>';
}
	include('../includes/form_editionarticle.php');
	include('../includes/footer.php');
?>
Voilà le problème : Dès que je soumet mon formulaire, j'obtiens :

Code : Tout sélectionner

Notice: Undefined index: article in C:\wamp\www\SMTK\admtool\includes\form_editionarticle.php on line 3 Notice: Undefined variable: idArticle in C:\wamp\www\SMTK\admtool\edition\editer.php on line 72
Pourtant je ne comprends pas, la ligne $idArticle = $_GET['article']; aurait du régler le problème non ?

Désolé de la longueur de mes script, mais j'ai vraiment besoin d'aide là :x .

Merci d'avance.

Eléphant du PHP | 171 Messages

18 mai 2011, 16:07

Salut,

Alors pour
Notice: Undefined variable: idArticle in C:\wamp\www\SMTK\admtool\edition\editer.php on line 72
c'est normal.

Regarde un peu plus haut dans ton script de traitement de l'édition :
$idArticle = $_GET['article'];
if (isset($_POST['submit']))
{
Ce ne serait pas mieux avec $_POST['article'], sachant que tu traite ton formulaire avec POST ? :p

Et pour
Notice: Undefined index: article in C:\wamp\www\SMTK\admtool\includes\form_editionarticle.php on line 3
lors de la soumission :
if(!empty($_GET['article'])){
    $idArticle = $_GET['article'];
    //Met ton code de formulaire ici
} else {
   echo 'Vous n\'avez pas choisi quel article édité';
}
Ça protège si la page d'édition d'article est demandé sans spécifier l'article en GET.
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

Eléphant du PHP | 57 Messages

18 mai 2011, 16:21

Merci de ta réponse.
J'ai bien essayé $_POST à la place de $_GET, mais je ne vois pas comment ca pourrais marcher (d'ailleurs cela n'a pas marché) puisque je cherche à récupèrer l'idArticle transmis par l'URL depuis le fichier editerarticle.php :
echo '<a href="editer.php?categorie='.$monArticle->idCat.'&article='.$monArticle->idArticle.'">';

Eléphant du PHP | 171 Messages

18 mai 2011, 17:54

Oui mais moi je te parle de $_POST['article'] dans la page de traitement du formulaire, puisque celui ci est envoyé en POST.

Mais j'ai oublié rajoute un <input type="hidden" value="<?php echo $_GET['article']; ?>" name="article" /> dans ton formulaire. ;)
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

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

18 mai 2011, 18:06

salut,

alors première chose, il faut que tu debug, pour cela utilise la fonction var_dump (par exemple var_dump($_GET); pour voir les variables fournient par l'url).
Ensuit pour le deuxième message d'erreur c'est normal car tu ne founit cette info ni das l'url ni dans le formulaire. il faut utiliser ce que t'indiqueskw33d.

Pour le coté html de la chose d'ou sorte les </input> et </img> ?

Pour ce qui est de la pré selection de la catégorie de l'article (c'est assez confortable de ne pas avoir la modifier voir de ne pas l'oublier ;) ) c'est réalisable simplement l'id de catégorie de l'article sélectionné au début de la page pour placer le selected.

par exemple
<?php
while ($cat = mysql_fetch_object ($resultat)){
    $nomCat = $cat->nomCat;
    echo '<option value="'.$cat->idCat.'"';
    if ( $idCat== $cat->idcat) echo ' selected="selected"';
    echo '>'.$cat->nomCat.'</option>';
}
?>
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 57 Messages

19 mai 2011, 09:50

Bonjour,

Ok merci beaucoup à vous deux, cela fonctionne maintenant. Mais j'ai encore quelques questions pour le coup ;)

Tout d'abord, par rapport à la sélection automatique du nom de la catégorie dans ma liste déroulant <select>, j'ai fais comme suis :
	
$req = 'SELECT nomCat FROM categories WHERE idCat = "'.$idCat.'";';
	$res = mysql_query ($req, $connexion);
	if (!empty($res) or die(mysql_error()))
	{
		while ($maCat = mysql_fetch_object ($resultat))
		{
			//
		}
	}
	else
	{
		// Echec
	}

[...]
<select name="idCat">
	<option selected="selected"> <?php echo $maCat; ?> </option>
<?php
	$requete = 'SELECT * FROM categories WHERE idCat <> ' . $idCat . '   and idCat>=5 ORDER BY nomCat ASC ;';
	$resultat = mysql_query ($requete, $connexion);
J'ai donc chercher à exclure la catégorie en question puisqu'elle devrait apparaitre en selected=selected. Ça çà marche bien mais en revanche, mon selected affiche toujours du magnifique... blanc.

Deuxième question, avec mon script actuel, on est obligé de re-téléchargé une photo, sinon on obtient des erreurs de mon script de redimensionnement (les variables extension et je ne sais plus laquelle deviennent undefined).
Comment puis-je faire pour pouvoir conserver la photo actuelle ? Ceci est d'ailleurs valable pour le choix de la catégorie.

Merci d'avance.

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

19 mai 2011, 11:10

salut,

montre nous ton code pour la génération du select :)

pour le fichier tu n'a pas le choix tu ne peux pas pré sélectionner un fichier (c'est normal imagine que l'on sélectionne un fichier de sécurité (genre celui qui contient les mots de passe de tous le système ? heu c'est un exemple hein :) ).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 57 Messages

19 mai 2011, 11:14

Mon code est le même que sur le premier post mais je vais le remettre :
	$req = 'SELECT nomCat FROM categories WHERE idCat = "'.$idCat.'";';
	$res = mysql_query ($req, $connexion);
	if (!empty($res) or die(mysql_error()))
	{
		while ($maCat = mysql_fetch_object ($resultat))
		{
			//
		}
	}
	else
	{
		// Echec
	}

<select name="idCat">
	<option selected="selected"> <?php echo $maCat; ?> </option>
	<?php
		$requete = 'SELECT * FROM categories WHERE idCat <> ' . $idCat . '   and idCat>=5 ORDER BY nomCat ASC ;';
		$resultat = mysql_query ($requete, $connexion);
		if (!empty($resultat))
		{
		        while ($cat = mysql_fetch_object ($resultat))
		        {
			$nomCat = $cat->nomCat;
			echo '<option value="'.$cat->idCat.'">'.$cat->nomCat.'</option>';
		        }
		}
		else
		{
			echo "Message de MySQL : ", mysql_error($connexion);
		}
	?>
</select>
Et en fait pour le fichier, j'ai du mal m'exprimer. En fait le chemin absolu du fichier est stocké dans ma base de données. Je cherche donc simplement à ne pas être obligée de modifier ce chemin. (ex : http://localhost/monsite/photos/)

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

19 mai 2011, 11:28

pour le selected j'ai proposé une solution quelque message plus haut.

Pour le chemin, je ne comprend pas trop, tu souhaite que si l'on modifie une image au final cela soit le même nom de fichier ? parce que le chemin de base c'est toi qui le maitrise (d'ailleur il ne devrait pas être dans la table, et gérer dynamiquement, ou simplement imposé si tu met tous dans le même répertoire ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 57 Messages

19 mai 2011, 12:00

Si tu regarde bien j'ai justement suivi ta solution ;)
J'ai utilisé l'idCat recupéré pour selectionner la catégorie courante, et justement, je me plains que ca ne marche pas :wink:
Je l'ai fais de la manière suivante :
- Requête permettant de récupérer le nom de la catégorie,
- Ajout de la variable obtenue par la requete a la liste <select> avec selected=selected,
- Exclusion de cette catégorie du reste de la liste pour ne pas avoir de doublons.

Mais je ne t'en veux pas, tu as du mal regarder :mrgreen: .

Pour le chemin de mes photos, je rappelle qu'il s'agit d'un script d'édition. Par conséquent, quand on modifie un article, on ne modifie pas forcèment tout les champs.
Or, si je re-choisi pas une nouvelle photos, j'obtiens les variables propres à l'upload de photos citées plus haut indéfinies.

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

19 mai 2011, 12:48

pour la selection ton code n'est pas complet je peux pas savoir.

Pour la modif du fichier, tu n'a pas le choix il faut le gérer, soit le champ est vide et la tu n'en tiens pas compte, soit le champs est remplis et re upload;

tu peut ajouter une checkbox ou un bouton radio pour demande confirmationde modification de l'image si tu préfère être sur, mais ça ne te dispensera pas de devoir vérifier si le champ est vide ou pas ;)

@+
Il en faut peu pour être heureux ......