Mise à jour d'une table d'une base de donnée SQL via requête PHP

Résolu/Fermé
-
 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
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
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
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
Tu as oublié d'exécuter la requête préparé, non ?!
Comme ceci ? :

if($donnees = $requete->fetch()){
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', $donnees['titre'], PDO::PARAM_STR);
$requete->bindValue(':contenu', $donnees['contenu'], PDO::PARAM_STR);
//$requete->bindValue(':image', $img_path, PDO::PARAM_STR);
$requete->execute();
}
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
Oui ...
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
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
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
<?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
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
Aucune erreur affichée ?
Non, et le var_dump dit toujours que les nouvelles valeurs entrées dans le formulaire ont été ajoutées à l'array...
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
Ok,

Vérifies le contenu de "$donnees['id']" et la valeur de retour de "$update->execute()" ...
Je ne sais pas comment faire, mais je penses que le contenu de $donnees['id']" est bien mon numéro d'id puisque cette variable figure dans l'action de mon formulaire et quand on envoie le submit, on retrouve bien l'id dans l'URL.

Mais si tu me donnes de quoi tester tout ça comme il faut je m'exécute de suite !
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
<?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); 
        var_dump($update->execute());
        echo '<script>alert("Envoye");</script>'; 
    }
} 
else echo '<p>Formulaire non envoyé (ID incorrect).</p>';
?> 
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
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
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
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
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
De rien !

Pour l'erreur de syntaxe, il y a une parenthèse fermante de trop.
Super je n'avais pas vu ! Ca fonctionne très très bien !

Juste j'ai toujours les <br /> qui apparaissent dans le textarea quand j'édite un contenu qui contient des retours à la ligne. Pas très sexy de les enlever à la main à chaque modif, et pourtant j'ai bien mis : (nl2br(htmlspecialchars(htmlspecialchars_decode(stripslashes($donnees['contenu']))))) pour éviter tous problèmes d'affichages de ce genre... Si jamais t'as une idée là dessus (oui j'abuse de ta gentillesse ^^)

Encore merci pour tout !!
C'est bon j'ai trouvé il fallait justement ne pas mettre le nl2br dans le textarea, ça marche maintenant à la perfection :)
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
227
Justement, tu faisais l'inverse ...
Yes ! Tout est ok maintenant encore merci à toi :)