Mise à jour d'une table d'une base de donnée SQL via requête PHP [Résolu/Fermé]

Signaler
-
 Fabien59 -
Bonjour,

J'ai déjà posé la question sur d'autres forums, à des amis, j'ai cherché tant et plus, et je ne trouve pas de solution à mon problème, qui semble pourtant survenir alors que mon projet n'est pas si compliqué !

Je développe un site tout en PHP et dont le contenu se trouve dans une base SQL. J'ai donc dans mon site divers structures, comme des articles par exemple, que je veux pouvoir mettre à jour via une section d'administration dans le site. Pour être concret :

Sur ma page d'accueil, j'ai des articles, qui se trouvent dans une table "accueil". Dans la table accueil :
- un champ INT : "id"
- un champ VARCHAR : "titre"
- un champ LONGTEXT : "contenu"
- un champ VARCHAR : "imgurl"

Via l'administration de mon site, j'arrive très bien à ajouter et à supprimer des articles, ainsi qu'à les afficher. Mon soucis arrive pour les mises à jour des articles. J'ai fais ceci :

Une page qui contient un menu déroulant pour choisir l'article qu'on veut modifier (sélection par son titre) :

<form action="up_accueil_form.php" method="GET">
<?php

include("cfgsql.php");

$requete = $bdd->query('SELECT id, titre FROM accueil');
?>

<select name="id">
<?php
while($donnees = $requete->fetch()){
?>
<option value="<?php echo $donnees['id']; ?>"><?php echo htmlspecialchars($donnees['titre']); ?></option>
<?php
}
?>
</select>
<?php
$requete->closeCursor();
?>
<input type="submit" name="submit" value="Modifier" />
</form>


Et la page qui contient le formulaire reprenant le contenu actuel des champs et permettant de les modifier, ainsi que le script pour effectuer l'UPDATE :

<?php

include("cfgsql.php");

$requete = $bdd->prepare('SELECT * FROM accueil WHERE id = :id');
$requete->bindValue('id', $_GET['id'], PDO::PARAM_INT);
$requete->execute();

if($donnees = $requete->fetch()){
if(isset($_POST['submit'])){
$update = $bdd->prepare('UPDATE accueil SET titre = :titre, contenu = :contenu, image = :image WHERE id = :id');
$requete->bindValue('id', $donnees['id'], PDO::PARAM_INT);
$requete->bindValue('titre', $_POST['titre'], PDO::PARAM_STR);
$requete->bindValue('contenu', $_POST['contenu'], PDO::PARAM_STR);
$requete->bindValue('image', $img_path, PDO::PARAM_STR);
}
?>

<form method="POST" action="up_accueil_form.php?id=<?php echo $donnees['id']; ?>">
<label for="titre">Titre de votre article :</label>
<input type="text" name="titre" id="titre" value="<?php echo htmlspecialchars($donnees['titre']); ?>" /><br />
<label for="contenu">Contenu :</label>
<textarea rows="4" cols="50" name="contenu" id="contenu"><?php echo htmlspecialchars($donnees['contenu']); ?></textarea><br />
Image actuelle de votre article :<br/> <?php echo '<img src="' . $donnees['imgurl'] . '" alt="" width="200px"/>' ?><br/>
<label for="image">Si vous souhaitez changer l'image, sélectionnez-la ci-dessous (tous formats | max. 2 Mo) :</label><br />
<input type="file" name="image" id="image" value="<?php echo htmlspecialchars($donnees['imgurl']); ?>"/><br />
<input type="submit" name="submit" value="Modifier" /><br/><br/>
</form>
<?php
}
else{
// L'entrée n'existe pas
}
$requete->closeCursor();

?>


Je n'ai pas d'erreur qui me soit retournée, et var_dump me renvoie ceci :
array(3) { ["titre"]=> string(19) "Test modifie encore" ["contenu"]=> string(14) "Contenu encore" ["submit"]=> string(8) "Modifier" }

Ce qui supposerait que les infos sont bien envoyées dans l'array, mais qu'elles ne sont pas exploitées par le script pour faire les modifs dans la bdd...

Je galère depuis un moment et je dois présenter le projet rapidement maintenant ça devient urgent donc si quelqu'un pouvait m'aider ça serait vraiment super !!

Merci d'avance et bon dimanche :)

9 réponses

Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
Salut,

Dans le bindValue, le premier paramètre doit être l'étiquette, donc ajoutes ":" ...

Exemple :
$requete->bindValue(':id', $donnees['id'], PDO::PARAM_INT); 

Mettez en résolu quand c'est résolu -.- ...
C'est fait ! Je me suis donc empressé d'essayer mais ça ne règle pas le problème.

Merci à toi de me venir en aide :)
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
Oui ...
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
Concernant le titre et le contenu, c'est POST que tu devrais utiliser !

Dans le fetch, précise en paramètre sous quel format le résultat doit être retourné.
$donnees = $requete->fetch(PDO::FETCH_ASSOC)
if($donnees = $requete->fetch(PDO::FETCH_ASSOC)){
var_dump($_POST);
if(isset($_POST['submit'])){
$update = $bdd->prepare('UPDATE accueil SET titre = :titre, contenu = :contenu WHERE id = :id');
$requete->bindValue(':id', $donnees['id'], PDO::PARAM_INT);
$requete->bindValue(':titre', $_POST['titre'], PDO::PARAM_STR);
$requete->bindValue(':contenu', $_POST['contenu'], PDO::PARAM_STR);
//$requete->bindValue(':image', $img_path, PDO::PARAM_STR);
$requete->execute();
}

Toujours négatif...
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
Ligne 4 : $requete, et non pas $update !

Edit : $update, et non pas $requete, pour différencier des autres requêtes !
Je suis tes recommandations mais ça ne fonctionne pas jusque là... Tu m'as l'air de voir un max d'erreurs alors je te remets tout le code du script :

<?php

include("cfgsql.php");


$requete = $bdd->prepare('SELECT * FROM accueil WHERE id = :id');
$requete->bindValue('id', $_GET['id'], PDO::PARAM_INT);
$requete->execute();

if($donnees = $requete->fetch(PDO::FETCH_ASSOC)){
var_dump($_POST);
if(isset($_POST['submit'])){
$requete = $bdd->prepare('UPDATE accueil SET titre = :titre, contenu = :contenu WHERE id = :id');
$update->bindValue(':id', $donnees['id'], PDO::PARAM_INT);
$update->bindValue(':titre', $_POST['titre'], PDO::PARAM_STR);
$update->bindValue(':contenu', $_POST['contenu'], PDO::PARAM_STR);
//$requete->bindValue(':image', $img_path, PDO::PARAM_STR);
$requete->execute();
}
else
echo '<p>Formulaire non envoyé</p>';
?>
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
<?php 

include("cfgsql.php"); 

$requete = $bdd->prepare('SELECT * FROM accueil WHERE id = :id'); 
$requete->bindValue(':id', $_GET['id'], PDO::PARAM_INT); 
$requete->execute(); 

if($donnees = $requete->fetch(PDO::FETCH_ASSOC)){ 
    var_dump($_POST); 
    if(isset($_POST['submit'])){ 
        $update = $bdd->prepare('UPDATE accueil SET titre = :titre, contenu = :contenu WHERE id = :id'); 
        $update->bindValue(':id', $donnees['id'], PDO::PARAM_INT); 
        $update->bindValue(':titre', $_POST['titre'], PDO::PARAM_STR); 
        $update->bindValue(':contenu', $_POST['contenu'], PDO::PARAM_STR); 
        //$update->bindValue(':image', $img_path, PDO::PARAM_STR); 
        $update->execute(); 
    } 
    else echo '<p>Formulaire non envoyé</p>'; 
?>

N'oublies pas de refermer le premier "if".

Mettez en résolu quand c'est résolu -.- ...
<?php

include("cfgsql.php");

$requete = $bdd->prepare('SELECT * FROM accueil WHERE id = :id');
$requete->bindValue(':id', $_GET['id'], PDO::PARAM_INT);
$requete->execute();

if($donnees = $requete->fetch(PDO::FETCH_ASSOC)){
var_dump($_POST);
if(isset($_POST['submit'])){
$update = $bdd->prepare('UPDATE accueil SET titre = :titre, contenu = :contenu WHERE id = :id');
$update->bindValue(':id', $donnees['id'], PDO::PARAM_INT);
$update->bindValue(':titre', $_POST['titre'], PDO::PARAM_STR);
$update->bindValue(':contenu', $_POST['contenu'], PDO::PARAM_STR);
//$update->bindValue(':image', $img_path, PDO::PARAM_STR);
$update->execute();
} }
else {echo '<p>Formulaire non envoyé</p>'; }
?>

J'ai bien fermé les 2 if et j'ai mis aussi les accolades à else mais toujours sans succès
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
Aprés le var_dump du POST !
Sinon, avant d'envoyer le formulaire var_dump retourne "formulaire non envoyé" et une fois fait, il ne dit plus rien
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
C'est modifié, essaye !
Je n'ai ni de retour "Envoye" ni "Formulaire non envoyé (ID incorrect). Le seul var_dump qui répond c'est le premier pour $_POST
Et puis si aussi le deuxième répond mais uniquement avant l'envoie il dit "formulaire non envoyé" mais une fois qu'on envoie le submit plus rien
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
Es tu sure que ceci ne fonctionne pas ?!

<?php 

include_once("cfgsql.php"); 

if(!isset($_GET['id'])) {
 header('Location: first_page.php');
 die();
}

$requete = $bdd->prepare('SELECT * FROM accueil WHERE id = :id'); 
$requete->bindValue(':id', $_GET['id'], PDO::PARAM_INT); 
$requete->execute(); 
$donnees = $requete->fetch(PDO::FETCH_ASSOC);
$requete->closeCursor();

if(!empty($donnees)) {
 if(isset($_POST['submit'])) {
  $update = $bdd->prepare('UPDATE accueil SET titre = :titre, contenu = :contenu WHERE id = :id'); 
  $update->bindValue(':id', $donnees['id'], PDO::PARAM_INT); 
  $update->bindValue(':titre', $_POST['titre'], PDO::PARAM_STR); 
  $update->bindValue(':contenu', $_POST['contenu'], PDO::PARAM_STR); 
  //$update->bindValue('image', $img_path, PDO::PARAM_STR);
  $update->execute();
  $update->closeCursor();
  
  $donnees['titre'] = $_POST['titre'];
  $donnees['contenu'] = $_POST['contenu'];
 }

 echo '<form method="POST" action="up_accueil_form.php?id=' . $donnees['id'] . '">
   <label for="titre">Titre de votre article :</label> 
   <input type="text" name="titre" id="titre" value="' . htmlspecialchars($donnees['titre']) . '" /><br /> 

   <label for="contenu">Contenu :</label> 
   <textarea rows="4" cols="50" name="contenu" id="contenu">' . htmlspecialchars($donnees['contenu']) . '</textarea><br /> 

   Image actuelle de votre article :<br/>
   <img src="' . $donnees['imgurl'] . '" alt="" width="200px"/><br/> 

   <label for="image">Si vous souhaitez changer l\'image, sélectionnez-la ci-dessous (tous formats | max. 2 Mo) :</label><br /> 
   <input type="file" name="image" id="image" value="' . htmlspecialchars($donnees['imgurl']) . '"/><br /> 
   <input type="submit" name="submit" value="Modifier" /><br/><br/> 
  </form>';
} 
else { 
 // L'entrée n'existe pas 
}
?>

Mettez en résolu quand c'est résolu -.- ...
Je vais pas faire semblant, et d'avance, toutes mes excuses : je ne sais pas depuis combien de temps je te fais galérer pour rien, mais tu m'as donné la solution à un moment donné, je mettais depuis tout a l'heure mon fichier modifié dans un mauvais dossier sur mon serveur (le manque de sommeil ne pardonne pas...)... Un mot : MERCI
Juste encore un petit truc : pour l'upload de l'image je voudrais, s'il on en envoie une nouvelle, faire l'upload et ensuite l'UPDATE avec la mise à jour de l'url de l'image, et si on garde l'ancienne image ne faire l'UPDATE que sur les champs titres et contenu, tu veux bien me donner un dernier petit coup de main ? (je ferais attention a ce que je fais cette fois...). J'ai essayé de faire ceci mais ca ne marche pas : erreur à la ligne "$update->execute();" dans la première condition...

<?php

include_once("cfgsql.php");

if(!isset($_GET['id'])) {
header('Location: contacts.php');
die();
}

$requete = $bdd->prepare('SELECT * FROM accueil WHERE id = :id');
$requete->bindValue(':id', $_GET['id'], PDO::PARAM_INT);
$requete->execute();
$donnees = $requete->fetch(PDO::FETCH_ASSOC);
$requete->closeCursor();

if(!empty($donnees)) {

if(!empty($_POST['image'])) {

$extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png' );
$extension_upload = strtolower( substr( strrchr($_FILES['image']['name'], '.') ,1) );

if ($_FILES['image']['size'] <= 2097152 & in_array($extension_upload, $extensions_valides))
{
$nom='images/user/'.basename("image".time().".".$extension_upload);
move_uploaded_file($_FILES['image']['tmp_name'], 'images/user/'.basename("image".time().".".$extension_upload));
}
if(isset($_POST['submit'])) {
$update = $bdd->prepare('UPDATE accueil SET titre = :titre, contenu = :contenu, imgurl = :imgurl WHERE id = :id');
$update->bindValue(':id', $donnees['id'], PDO::PARAM_INT);
$update->bindValue(':titre', $_POST['titre'], PDO::PARAM_STR);
$update->bindValue(':contenu', $_POST['contenu'], PDO::PARAM_STR);
$update->bindValue('image', $nom, PDO::PARAM_STR);
$update->execute();
$update->closeCursor();

$donnees['titre'] = $_POST['titre'];
$donnees['contenu'] = $_POST['contenu'];
}
}

else
{
if(!empty($donnees)) {
if(isset($_POST['submit'])) {
$update = $bdd->prepare('UPDATE accueil SET titre = :titre, contenu = :contenu WHERE id = :id');
$update->bindValue(':id', $donnees['id'], PDO::PARAM_INT);
$update->bindValue(':titre', $_POST['titre'], PDO::PARAM_STR);
$update->bindValue(':contenu', $_POST['contenu'], PDO::PARAM_STR);
$update->execute();
$update->closeCursor();

$donnees['titre'] = $_POST['titre'];
$donnees['contenu'] = $_POST['contenu'];
}
}
}
}
echo '<form method="POST" action="up_accueil_form.php?id=' . $donnees['id'] . '">
<label for="titre">Titre de votre article :</label>
<input type="text" name="titre" id="titre" value="' . htmlspecialchars($donnees['titre']) . '" /><br />

<label for="contenu">Contenu :</label>
<textarea rows="4" cols="50" name="contenu" id="contenu">' . htmlspecialchars($donnees['contenu']) . '</textarea><br />

Image actuelle de votre article :<br/>
<img src="' . $donnees['imgurl'] . '" alt="" width="200px"/><br/>

<label for="image">Si vous souhaitez changer l\'image, sélectionnez-la ci-dessous (tous formats | max. 2 Mo) :</label><br />
<input type="file" name="image" id="image" /><br />
<input type="submit" name="submit" value="Modifier" /><br/><br/>
</form>';


?>

Merci encore pour ton aide
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
Ok, je me disais bien aussi !

Pour le upload, je n'ai pas vérifier si la partie de l'envoi est correcte, je suppose qu'elle l'est.

<?php
include_once("cfgsql.php");

$requete = $bdd->query('SELECT id, titre FROM accueil');
?>

<form action="up_accueil_form.php" method="GET">
 <select name="id">
  <?php
  while($donnees = $requete->fetch(PDO::FETCH_ASSOC)) {
   echo '<option value="' . $donnees['id'] . '">' . htmlspecialchars($donnees['titre']) . '</option>';
  }
  
  $requete->closeCursor();
  ?>
 </select>

 <input type="submit" name="submit" value="Modifier" /> 
</form>


<?php 

include_once("cfgsql.php"); 

if(!isset($_GET['id'])) {
 header('Location: first_page.php');
 die();
}

$requete = $bdd->prepare('SELECT * FROM accueil WHERE id = :id'); 
$requete->bindValue(':id', $_GET['id'], PDO::PARAM_INT); 
$requete->execute(); 
$donnees = $requete->fetch(PDO::FETCH_ASSOC);
$requete->closeCursor();

if(!empty($donnees)) {
 if(isset($_POST['submit'])) {
  $newImage = '';
  
  if(!empty($_FILES['image']['tmp_name'])) AND $_FILES['image']['error'] == 0) {
   $extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png' );
   $extension_upload = strtolower( substr( strrchr($_FILES['image']['name'], '.'), 1));
   
   if($_FILES['image']['size'] <= 2097152 & in_array($extension_upload, $extensions_valides)) { 
    $nom = 'images/user/'.basename("image".time().".".$extension_upload); 
    if(move_uploaded_file($_FILES['image']['tmp_name'], 'images/user/'.basename("image".time().".".$extension_upload)))
     $newImage = $nom; 
   }
  }
  
  $reqStr = 'UPDATE accueil SET titre = :titre, contenu = :contenu ';
  if(!empty($newImage)) $reqStr .= ', imgurl = :imgurl ';
  $reqStr .= 'WHERE id = :id';
  
  $update = $bdd->prepare($reqStr); 
  $update->bindValue(':id', $donnees['id'], PDO::PARAM_INT); 
  $update->bindValue(':titre', $_POST['titre'], PDO::PARAM_STR); 
  $update->bindValue(':contenu', $_POST['contenu'], PDO::PARAM_STR); 
  if(!empty($newImage)) $update->bindValue(':imgurl', $newImage, PDO::PARAM_STR);
  $update->execute();
  $update->closeCursor();
  
  $donnees['titre'] = $_POST['titre'];
  $donnees['contenu'] = $_POST['contenu'];
 }

 echo '<form method="POST" action="up_accueil_form.php?id=' . $donnees['id'] . '" enctype="multipart/form-data">
   <label for="titre">Titre de votre article :</label> 
   <input type="text" name="titre" id="titre" value="' . htmlspecialchars($donnees['titre']) . '" /><br /> 

   <label for="contenu">Contenu :</label> 
   <textarea rows="4" cols="50" name="contenu" id="contenu">' . htmlspecialchars($donnees['contenu']) . '</textarea><br /> 

   Image actuelle de votre article :<br/>
   <img src="' . $donnees['imgurl'] . '" alt="" width="200px"/><br/> 

   <label for="image">Si vous souhaitez changer l\'image, sélectionnez-la ci-dessous (tous formats | max. 2 Mo) :</label><br /> 
   <input type="file" name="image" id="image" value="' . htmlspecialchars($donnees['imgurl']) . '"/><br /> 
   <input type="submit" name="submit" value="Modifier" /><br/><br/> 
  </form>';
} 
else { 
 // L'entrée n'existe pas 
}
?> 


Mettez en résolu quand c'est résolu -.- ...
if(!empty($_FILES['image']['tmp_name'])) AND $_FILES['image']['error'] == 0) {
m'a renvoyé une erreur de syntaxe.

Je l'ai remplacé par :
if(!empty($_FILES['image']['tmp_name'])) {

Et... ça fonctionne !!!!!!!! Je crois qu'aucun mot ne pourra témoigner de ma joie et de ma gratitude pour ton aide, tu viens de m'enlever une sacrée épine du pied !!!
Un grand merci en tout cas :)
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
ça reste le même principe !

Si image non vide, afficher image;

Il n'y a pas de sinon.
Alors je fais ça non :

if(!empty($donnees['imgurl'])) echo '<img src="' . $donnees['imgurl'] . '";

?
Impec :

{
    echo  '<h1>' . (stripslashes($donnees['titre'])) . '</h1>';
	if(!empty($donnees['imgurl'])) echo '<img src="' . $donnees['imgurl'] . '" alt="" width="400px" class="imageflottante"/>';
	echo '<p>' . (nl2br(htmlspecialchars(htmlspecialchars_decode(stripslashes($donnees['contenu']))))) . '</p><br/>';
}


Oui je raconte ma vie... lol
Messages postés
2483
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
217
Voila.

stripslashes, htmlspecialchars_decode, htmlspecialchars, nl2br !!! Est ce que tu les utilises correctement, ou est ce que t'as juste copié collé un script ...
Je les utilise certainement un peu bêtement : je les mets tous en me disant "je limite les problème d'affichage au maximum"... Oui je suis en mode débutant quand même ^^