Requete UPDATE avec formulaire

Eléphant du PHP | 57 Messages

18 avr. 2011, 10:16

Bonjour à tous !

Je m'excuse par avance de la longueur de ce post, il y a beaucoup de code à mettre ;).
Donc moi, j'essaye de créer un système d'édition d'articles de blog, et je bloque.

Le script commence donc par une arborescence :
<?php
	include('../includes/header.php');
	
	require_once('../includes/connexion.php');
	$categorie = 0;
	if (!empty($_REQUEST['categorie'])) 
	{
		$categorie = $_REQUEST['categorie'];
	}
	
	// affichage du parent
	$requete = 'SELECT nomCat, idParent FROM categories where idCat = \'' . $categorie . '\';';
	$resultat = mysql_query ($requete, $connexion);
	if (!empty($resultat)) 
	{
		$maCat = mysql_fetch_object ($resultat);
		if (!empty($maCat)) 
		{
			echo '<p><a href="editerarticle.php?categorie=',$maCat->idParent,'"><<</a> <strong>',$maCat->nomCat,'</strong></p>';
		}
	}
	else 
	{
		echo "Erreur dans l'exécution de la requête.<br/>\n";
		echo "Message de MySQL : ", mysql_error($connexion);
	}
	
	// affichage des sous-catégories
		echo '<ul>';
	$requete = 'SELECT nomCat, idCat from categories where idParent = \'' . $categorie . '\';';
	$resultat = mysql_query ($requete, $connexion);
	if (!empty($resultat)) {
		while ($maCat = mysql_fetch_object ($resultat)) {
			echo '<li> <a href="editerarticle.php?categorie=',$maCat->idCat,'">',$maCat->nomCat,'</a></li>';
		}
	}
	else {
		echo "Erreur dans l'exécution de la requête.<br/>\n";
		echo "Message de MySQL : ", mysql_error($connexion);
	}	
	
	// affichage des produits
	$requete = 'SELECT idArticle, idCat, titreArticle, contenuArticle, photoArticle,  descPhoto FROM articles where idCat = \'' . $categorie . '\';';
	$resultat = mysql_query ($requete, $connexion);
	if (!empty($resultat)) 
	{
		while ($monArticle = mysql_fetch_object ($resultat)) 
		{
			echo '<li> <a href="editer.php?categorie='.$monArticle->idCat.'&article='.$monArticle->idArticle.'"><img src="'.$monArticle->photoArticle.'" alt="'.$monArticle->descPhoto.'"/>
			</a><p> '.$monArticle->descPhoto .'</p></li>';
		}
	}
	else 
	{
		echo "Erreur dans l'exécution de la requête.<br/>\n";
		echo "Message de MySQL : ", mysql_error($connexion);
	}	
		echo '</ul>';
					
	mysql_close($connexion);
	echo '<br/>';
	include('../includes/footer.php');
?>
Il s'agit ici de récupèrer l'article en question via une interface "graphique". A ce moment là, j'ai donc besoin de "idArticle" pour obtenir les valeurs des champs de l'article en question.

Ensuite, je souhaite traiter l'article via un formulaire. Ici, c'est déjà un peu plus complexe puisqu'en fait, je veux afficher les données déjà existantes dans chaque champ du formulaire afin que l'administrateur puisse corriger (et non tout retaper). Là, je pense que ca commence à coincer :) :
<?php 	
		require_once('connexion.php');
?>
<table border=2>
	<form action="../edition/editer.php" method="post" enctype="multipart/form-data">
	<br/>
	<h5> MODIFIER UN ARTICLE </h5>
	<tr>
		<td width> Titre de l'article : </td>
		<td width><input type="text" name="titreArticle" size="108" value="<?php echo ''.$monArticle->titreArticle.'' ;?>"/></td>
	</tr>
	<tr>
		<td> Contenu de l'article : </td>
		<td><textarea name="contenuArticle" rows=15 cols=83 /><?php echo ''.$monArticle->contenuArticle.'' ;?></textarea></td>
	</tr>
	<tr>
		<td> Choisir une catégorie :</td>
		<td>
			<select name="idCat">
					<option> <?php echo ''.$monArticle->idCat.'' ;?></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)) 
							{
								echo '<option value="'.$cat->idCat.'">'.$cat->nomCat.'</option>';
							}
						}		
						else 
						{
							echo "Message de MySQL : ", mysql_error($connexion);
						}	
					?> 
			</select>
		</td>
	</tr>
	<tr>
		<td> Photo : </td>
		<td><input type="file" name="photoArticle" id="Changer de photo ?"/></input></td>
		<td><img src="<?php echo ''.$monArticle->photoArticle.'' ;?>"></img></td>
	</tr>
	<tr>
		<td> Description : </td>
		<td><input type="text" name="descPhoto" value="<?php echo ''.$monArticle->descPhoto.'' ;?>"/></input></td>
	</tr>
	<tr>
		<td><input type="submit" name="submit"/></input></td>
	</tr>
	</form>
</table>
<br/>

Enfin, le code du fichier .php qui inclue le formulaire et traite les données. Il s'agit ici d'ajouter les nouvelles données dans la base :
<?php	
	require_once('../includes/connexion.php');
	include('../includes/header.php');
	
if (isset($_POST['submit']))  
{
	$idCat = $_POST['idCat'];
	$titreArticle = $_POST['titreArticle'];
	$contenuArticle = $_POST['contenuArticle'];
	$photoArticle = $_FILES['photoArticle'];
	$descPhoto = $_POST['descPhoto']; 
	if(!empty($idCat) && !empty($titreArticle) && !empty($contenuArticle) && !empty($photoArticle) && !empty($descPhoto))
	{ 
		
		$req = 'UPDATE articles 
				SET 
				idCat = "'. $idCat .'",
				titreArticle = "'. $titreArticle .'",
				photoArticle = "'. $photoArticle .'",
				descPhoto = "'.$descPhoto.'";
				contenuArticle = "'. $contenuArticle .'"		
				WHERE idArticle = "'.$monArticle '";';
				
		$result = mysql_query($req, $connexion) or die(mysql_error());
		
		if ($result)
		{		
			echo '<div class="valide"><p>La modification a été correctement effectué.</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');
?>
Je vous épargne les tables de ma base, je pense que mes noms de champs sont suffisamment explicites ;).
Merci d'avance à celui ou celle qui voudra bien m'aider à résoudre ce problème.

Pauline.

Mammouth du PHP | 672 Messages

18 avr. 2011, 10:39

Bonjour à tous !

Je m'excuse par avance de la longueur de ce post, il y a beaucoup de code à mettre ;).
Donc moi, j'essaye de créer un système d'édition d'articles de blog, et je bloque.
(...)
Merci d'avance à celui ou celle qui voudra bien m'aider à résoudre ce problème.

Pauline.
Bonjour.

Tu peux préciser à quel endroit tu bloques ? Parce que, là comme ça, ce n'est pas évident.

Ton premier script fonctionne ? Si non, il y a un message d'erreur ou il ne donne pas le résultat attendu ?
Idem pour les deux autres.

Eléphant du PHP | 57 Messages

18 avr. 2011, 10:57

Merci de ta réponse. Apparement, les problèmes se situent :

- dans la récupération des données précédentes. Par exemple, le champ titre de mon formulaire contient ca :
<br /> <font size='1'><table class='xdebug-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'> <tr><th align='left' bgcolor='#f57900' colspan=...
Le pire c'est qu'il n'y a encore pas si longtemps, les données d'affichaient bien dans les champs, mais ma requête modifiait tous les articles de ma base.
Bien entendu, j'ai associé à ceci, le bon vieux Trying to get property of non-object.

- de transmission des données de page en page (déduction faite à cause de ce que j'ai dit précédemment).

- et enfin, le problème avec ma reqûete, puisque j'obtiens le message d'erreur T_STRING_ENCAPSED_Blabla.

J'espère que j'ai été suffisament claire :mrgreen:

EDIT : Le premier script fonctionne parfaitement, c'est déjà çà !

Eléphant du PHP | 241 Messages

18 avr. 2011, 11:28

Salut,
dans ton 3ème script ta requête SQL est fausse...
Tu as oublié un " . " vers la fin.
Au lieu de te casser la tête pour chaque variable à devoir faire une concaténation, pourquoi ne pas mettre la requête entre des guillemets ?
Ceci évitera de t'embrouiller avec les " . "
$req = "UPDATE articles
	SET 
	idCat = '$idCat',
	titreArticle = '$titreArticle',
	photoArticle = '$photoArticle',
	descPhoto = '$descPhoto',
	contenuArticle = '$contenuArticle'
	WHERE idArticle = '$monArticle'";
Ta requête n'est pas sécurisé, regarde du côté de http://php.net/manual/fr/function.mysql ... string.php pour la sécuriser un minimum ^^


Par contre j'ai pas du tout compris où était ton problème pour ton second script :o

Eléphant du PHP | 57 Messages

18 avr. 2011, 11:31

Merci, je vais regarder ton lien.
En fait, j'ai le message suivant sur la ligne de condition de ma requete : unexpected T_CONSTANT_ENCAPSED_STRING.

Eléphant du PHP | 57 Messages

18 avr. 2011, 11:49

A priori, après avoir corrigé ma reqûete grâce à ton aide, ce problème est résolu.
Maintenant, le gros problème, c'est tout ces Trying to get property of non-object.
Toutes mes variables dans le formulaire ne s'affichent pas :

Code : Tout sélectionner

Notice: Undefined variable: monArticle in C:\wamp\www\SMTK\admtool\includes\form_editionarticle.php on line 10 Notice: Trying to get property of non-object in C:\wamp\www\SMTK\admtool\includes\form_editionarticle.php on line 10
D'habitude, j'arrive à résoudre le problème, mais là je vois pas :shock: .

(Merci de votre aide !)

Eléphant du PHP | 241 Messages

18 avr. 2011, 11:55

Ce qui pose problème justement ce sont ces
<?php echo ''.$monArticle->titreArticle.'' ;?>
Qu'est-ce que $monArticle ?
Apparament ca n'est défini nul part vu qu'il affiche une erreur.

En fait tu essaye de récupérer les valeurs des champs dans ta bdd c'est ca ?
Que contient le fichier connexion.php ?

Eléphant du PHP | 57 Messages

18 avr. 2011, 12:01

La variable $monArticle est définie dans la troisème requete de mon premier script :
 // affichage des produits
        $requete = 'SELECT idArticle, idCat, titreArticle, contenuArticle, photoArticle,  descPhoto FROM articles where idCat = \'' . $categorie . '\';';
        $resultat = mysql_query ($requete, $connexion);
        if (!empty($resultat)) 
        {
                while ($monArticle = mysql_fetch_object ($resultat)) 
                {
                        echo '<li> <a href="editer.php?categorie='.$monArticle->idCat.'&article='.$monArticle->idArticle.'"><img src="'.$monArticle->photoArticle.'" alt="'.$monArticle->descPhoto.'"/>
                        </a><p> '.$monArticle->descPhoto .'</p></li>';
                }
        }
        else 
        {
                echo "Erreur dans l'exécution de la requête.<br/>\n";
                echo "Message de MySQL : ", mysql_error($connexion);
        }       
                echo '</ul>';
Je te met mon fichier connexion.php, même si ca sert a rien puisque tout le reste de mon site (blog, ajout, suppression,...) fonctionne très bien.
<?php
	require('connect.php');
	
	$connexion = mysql_connect ("localhost", "root", "");
	if (!$connexion) {
		echo 'Désolé, connexion au serveur ' . localhost . " impossible\n";
		exit();
	}
	else {
		if (!mysql_select_db('smtk')) {
			echo "Désolé, accès à la base" . smtk . " impossible\n";
			exit();
		}
		// Spécifie l'encodage UTF-8 pour dialoguer avec la BD
		mysql_query('SET NAMES utf8');
	}
?>
EDIT : C'est justement çà à mon avis le problème, j'ai l'impression que mon troisième script ne parvient pas à récupérer les variables du premier, alors que le premier "editionarticle.php", envoie vers "editer.php"(mon troisième script) dans la dernière requête.

Mammouth du PHP | 672 Messages

18 avr. 2011, 12:39

La variable $monArticle est définie dans la troisème requete de mon premier script
Et dans le script form_editionarticle.php, elle est définie où ?
Notice: Undefined variable: monArticle in C:\wamp\www\SMTK\admtool\includes\form_editionarticle.php on line 10
Notice: Trying to get property of non-object in C:\wamp\www\SMTK\admtool\includes\form_editionarticle.php on line 10
C'est assez clair :
- La variable $monarticle n'est pas définie.
- Tu essayes de récupérer une propriété sur quelque chose qui n'est pas un objet (ce qui se tient avec le premier point).

Eléphant du PHP | 57 Messages

18 avr. 2011, 13:21

Merci à toi, je n'avais pas vu qu'elle n'était pas définie dans le fichier "form_editionarticle.php" !
J'ai donc rajouté cette ligne : $monArticle = $_REQUEST['article']; et il y a nettement moins de messages d'erreur :D .
Cependant, il y en a toujours un paquet quand même.

J'ai toujours le message d'erreur "trying to get property of non-object" dans tout mes input, textarea, ...
Comment puis-je résoudre ce problème ?

Mammouth du PHP | 672 Messages

18 avr. 2011, 13:26

$monArticle = $_REQUEST['article'];

J'ai toujours le message d'erreur "trying to get property of non-object" dans tout mes input, textarea, ...
Comment puis-je résoudre ce problème ?
Tu affectes une chaîne de caractères à $monarticle, et ensuite tu le traites comme un objet, forcément PHP n'apprécie pas trop #-o

Eléphant du PHP | 57 Messages

18 avr. 2011, 13:29

Je comprend tout à fait le principe de ce que tu me dis et je vois mon erreur. Merci pour çà.
En revanche, je ne vois pas du tout comment résoudre le problème. Si tu pouvais au moins me mettre sur la piste, ce serait super ;)

Mammouth du PHP | 672 Messages

18 avr. 2011, 13:36

Pose-toi les bonnes questions...

Première question : Où se trouve l'information que tu souhaites afficher ?
Deuxième question : Comment la récupérer ?

Répondre à ces questions devrait déjà bien t'avancer :wink:

Eléphant du PHP | 57 Messages

18 avr. 2011, 13:48

Ok donc :

Je cherche à récupérer les informations relatives à l'article demandé dans ma BDD. Comme elles ont déjà été demandées dans le fichier editerarticle.php, je peux essayer de les récupérer depuis ce fichier là ? Où est-ce que je ne peux pas, dans ce cas, je dois les re-récupérer dans ma BDD à l'aide d'une requête SQL de ce genre là ?
	$request = "SELECT * FROM articles WHERE idArticle ='" .$_REQUEST['article']."'";
	$resultat = mysql_query ($request, $connexion);
	if (!empty($resultat) or die(mysql_error())) {
	while ($monArticle = mysql_fetch_object ($resultat)) {	
	}
	}
La réponse est que je crois avoir eu les yeux plus gros que le ventre ^^

Mammouth du PHP | 672 Messages

18 avr. 2011, 14:05

En gros, ça fonctionne comme ça :
1. Le "client" (le navigateur) demande la page editerarticle.php
2. Le serveur traite le script PHP (entre autres il récupère les données de la BDD).
3. Le serveur envoie la page HTML générée. Il oublie tout ce qui vient de se passer.
4. Le client demande la page form_editionarticle.php
5. Le serveur traite le script PHP.

Deux solutions :
- Tu trouves un moyen de passer les données récupéréres d'un script à l'autre. Par exemple, avec l'utilisation de Sessions.
- Tu repasses une requête SQL pour récupérer les données.

Passer les données d'une page à l'autre risque de vite devenir compliqué, et multiplie les risques (oublis dans le script, modifications non souhaitées, ...)
Le plus esimple est donc, a priori, de passer une nouvelle requête.