Afficher/supprimer le contenu d'une bdd en fonction d'un id précis

Afficher/supprimer le contenu d'une bdd en fonction d'un id précis - PHP - Programmation

Marsh Posté le 14-03-2011 à 11:03:19    

Bonjour,
 
Je cherche supprimer la dernière entrée d'une base de donnée au moyen d'un bouton de formulaire.
Pour tenter d'atteindre l'objectif, pourquoi ne pas tenter de passer par une liste déroulante :

Code :
  1. <div class="colonne-1">
  2.   <?php
  3.    echo 'Sélectionnez l\'actualité que vous souhaitez afficher : ';
  4.    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
  5.    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
  6.    $reponse = $bdd->query('SELECT titre, contenu, id FROM news_utilisateur ORDER BY ID DESC LIMIT 0, 10');
  7.    echo '<form method="post" action="../Pages/esphp.php">';
  8.    echo '<SELECT NAME="Actu">';
  9.    echo '<OPTION>Selection</OPTION>';
  10.    while ($donnees = $reponse->fetch())
  11.    {
  12.    echo '<OPTION value=' . $donnees['id'] . '>' . $donnees['titre'];
  13.    echo '</OPTION>';
  14.    }
  15.    echo '</SELECT>';
  16.    echo '<br /> <input type="submit" name="submit" value="selection">';
  17.    echo '</form>';
  18.   ?>
  19.  </div>
  20.  <div class="colonne-2">
  21.   <?php
  22.    if (isset($_POST['Actu']) AND !empty($_POST['Actu']))
  23.    {
  24.     $reponse = $bdd->query("SELECT titre, contenu FROM news_utilisateur WHERE id ="$donnees['id'];
  25.     echo 'test';
  26.    }
  27.   unset($_POST['Actu']);
  28.   ?>
  29.  </div>


 
 
Pour le moment, ce formulaire se contente d'afficher les titres.
 Le problème est que je ne parviens pas à récupérer la valeur du SELECT.
 Celle-ci me permettrait d'afficher sous le menu déroulant, la news correspondant à la valeur prise par l'OPTION.
 Une idée pour y parvenir (avec ou sans JS) ?


Message édité par orang le 15-03-2011 à 18:38:48
Reply

Marsh Posté le 14-03-2011 à 11:03:19   

Reply

Marsh Posté le 14-03-2011 à 11:20:17    

Je crois qu'il manque la balise fermante du form.
Et name="actu" pourrai mieux fonctionner.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 14-03-2011 à 11:34:01    

Merci :)
Mais cela ne me permets pas de récupérer la valeur du SELECT.
Une fois que je pourrais la récupérer, le site pourra afficher les infos.
Ce ne sera qu'en suite que j'inclurai un  

Code :
  1. $sql="delete from news where"


Sachant, que je ne saurai pas quoi insérer pour le where.

Reply

Marsh Posté le 14-03-2011 à 11:34:57    

Bah quand tu fait submit dans le PHP t'as $_POST["actu"] quoi... :spamafote:


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 14-03-2011 à 11:37:43    

Merci, et ensuite, comment exploiter ce $_POST["actu"] pour par exemple, afficher la news qui correspond à l'actu sélectionnée via le menu déroulant ?

Reply

Marsh Posté le 15-03-2011 à 17:48:07    

Je me permets un petit up, comment feriez-vous pour afficher/supprimer le contenu d'une bdd en fonction d'un id précis ?
J'imagine que ce doit être quelque chose comme ça :

Code :
  1. $bdd->query("SELECT titre, contenu FROM news_utilisateur WHERE id ="$donnees['id'];


Ou

Code :
  1. $bdd->query("DELET titre, contenu,id FROM news_utilisateur WHERE id ="$donnees['id'];


Mais je ne parviens pas à trouver la syntaxe exacte.

Reply

Marsh Posté le 16-03-2011 à 10:01:26    

Pour l'affichage :
 
SELECT titre, contenu FROM news_utilisateur WHERE id =".$donnees['id']."
 
Suppression :
 
DELETE FROM news_utilisateur WHERE id =".$donnees['id']."
 
(http://sql.1keydata.com/fr/sql-delete.php)

Message cité 1 fois
Message édité par AzOo le 16-03-2011 à 10:01:51

---------------
*** [Feed-Back] AzOo ***
Reply

Marsh Posté le 16-03-2011 à 10:40:59    

AzOo a écrit :

Pour l'affichage :
 
SELECT titre, contenu FROM news_utilisateur WHERE id =".$donnees['id']."
 
Suppression :
 
DELETE FROM news_utilisateur WHERE id =".$donnees['id']."
 
(http://sql.1keydata.com/fr/sql-delete.php)


 
Merci à toi, suite à ton message, j'ai essayé les deux :  

Code :
  1. $reponse = $bdd->query(DELETE FROM news_utilisateur WHERE id =".$donnees['id']." );


Code :
  1. $reponse = $bdd->query(DELETE FROM news_utilisateur WHERE id =".$donnees['id']." );


 
Mais dans les deux cas :  
 Parse error: syntax error, unexpected T_STRING in C:\wamp\www\Pages\esphp.php on line 37
L’intégralité du code :

Code :
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="ISO-8859-1">
  5. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
  6. <title>Mise En Page</title>
  7. <link href="../CSS/ess-css.css" rel="stylesheet" type="text/css" />
  8. </head>
  9. <body>
  10. <div class="entete">
  11.  <a href="../refonte.html">Bonjour</a>
  12. </div>
  13. <div class="cadre">
  14.  <div class="colonne-1">
  15.   <?php
  16.    echo 'Sélectionnez l\'actualité que vous souhaitez afficher : ';
  17.    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
  18.    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
  19.    $reponse = $bdd->query('SELECT titre, contenu, id FROM news_utilisateur ORDER BY ID DESC LIMIT 0, 10');
  20.    echo '<form method="post" action="../Pages/esphp.php">';
  21.    echo '<SELECT NAME="Actu">';
  22.    echo '<OPTION>Selection</OPTION>';
  23.    while ($donnees = $reponse->fetch())
  24.    {
  25.    echo '<OPTION value=' . $donnees['id'] . '>' . $donnees['titre'];
  26.    echo '</OPTION>';
  27.    }
  28.    echo '</SELECT>';
  29.    echo '<br /> <input type="submit" name="submit" value="selection">';
  30.    echo '</form>';
  31.   ?>
  32.  </div>
  33.  <div class="colonne-2">
  34.   <?php
  35.    if (isset($_POST['Actu']) AND !empty($_POST['Actu']))
  36.    {
  37.     $reponse = $bdd->query(DELETE FROM news_utilisateur WHERE id =".$donnees['id']." );
  38.     echo 'test';
  39.    }
  40.   unset($_POST['Actu']);
  41.   ?>
  42.  </div>
  43. </div>
  44.  <div class="enbas">
  45. au revoir
  46. </div>
  47. </body>
  48. </html>



Message édité par orang le 16-03-2011 à 10:41:51
Reply

Marsh Posté le 16-03-2011 à 10:45:10    

la query doit etre une string.
 
$reponse = $bdd->query("DELETE FROM news_utilisateur WHERE id =".$donnees['id']." " );


---------------
Plop !
Reply

Marsh Posté le 16-03-2011 à 10:52:10    

Merci :)
J'ai testé ceci :  

Code :
  1. $reponse = $bdd->query("SELECT titre, contenu FROM news_utilisateur WHERE id =".$donnees['id']." " );


 
ou recopié ce que tu indiques :

Code :
  1. $reponse = $bdd->query("DELETE FROM news_utilisateur WHERE id =".$donnees['id']." " );


 
Dans les deux cas, le serveur renvoie :
( ! ) Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1' in C:\wamp\www\Pages\esphp.php on line 37
( ! ) PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 in C:\wamp\www\Pages\esphp.php on line 37

Reply

Marsh Posté le 16-03-2011 à 10:52:10   

Reply

Marsh Posté le 21-03-2011 à 10:46:30    

Je me permets un petit up :)

Reply

Marsh Posté le 21-03-2011 à 12:08:01    

- Pourquoi rajouter un espace à la fin de tes requêtes SQL ?
- Tu devrais utiliser les requêtes préparées avec PDO.
- Essaye de faire un echo "SELECT ... " en passant en paramètre tout ce que tu passes en paramètre au $bdd->query(), et copie-colle le résultat dans PHPMyAdmin (ou autre interface d'administration)
- Essaye aussi de mettre un try/catch autour de la requête et d'afficher le détail de l'exception avec un print_r

Reply

Marsh Posté le 21-03-2011 à 12:09:41    

En fait, ligne 37, tu n'as plus de $donnees, donc ta requête est :

Code :
  1. DELETE FROM news_utilisateur WHERE id =


Est-ce qu'il ne faudrait pas mettre plutôt

 
Code :
  1. $reponse = $bdd->query("DELETE FROM news_utilisateur WHERE id =" . $_POST['Actu'] );


edit : ce que j'ai dit sur les requêtes préparées reste valable !


Message édité par Paulp le 21-03-2011 à 12:10:46
Reply

Marsh Posté le 21-03-2011 à 13:03:02    

Merci pour ces nouveaux conseils.
J'ai essayé de me renseigner à propos du PDO::prepare sans trop avoir compris.
Par contre, j'ai entouré d'un try/catch, mais n'ayant plus d'erreur, celui-ci n'est plus nécessaire :

Code :
  1. $reponse = $bdd->query("DELETE FROM news_utilisateur WHERE id =" . $_POST['Actu'] );


fonctionne parfaitement :)
 
Par contre, je ne sais pas comment afficher l'info en question, j'ai essayé ceci :  

Code :
  1. <?php
  2.    try
  3.    {
  4.     $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
  5.     $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
  6.    if (isset($_POST['Actu']) AND !empty($_POST['Actu']))
  7.    {
  8.     $bdd2 = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
  9.     $dotat = $bdd2->query("SELECT titre, contenu FROM news_utilisateur WHERE id =" . $_POST['Actu']);
  10.     $donnees2 = $dotat;
  11.     echo htmlspecialchars($donnees2['titre']) . nl2br(htmlentities($donnes2['contenu']));
  12.    }
  13.    }
  14.    catch(Exception $e)
  15.    {
  16.     die('Erreur : '.$e->getMessage());
  17.    }
  18.   ?>


Mais il m'affiche ceci : Cannot use object of type PDOStatement as array in C:\wamp\www\Pages\esphp.php on line 43


Message édité par orang le 21-03-2011 à 13:05:05
Reply

Marsh Posté le 21-03-2011 à 13:16:09    

quand tu copies ton code, indique quelle ligne correspond au numéro de l'erreur (43 en l’occurrence) ...
 
l'erreur dit que ligne 43 (probablement la ligne 11 ci-dessus), tu essayes d'utiliser un objet PDOStatement comme un tableau.
Il s'agit de $donnees2.
Si tu regardes la ligne d'au dessus, tu as mis $donnees2 = $dotat.
$dotat est effectivement un object PDOStatement.
Comment le convertir en tableau : tu vas sur la doc de PDOStatement
http://php.net/manual/fr/class.pdostatement.php
et tu cherches ...
D'ailleurs, tu l'as déjà fait dans ton code précédent.

Reply

Marsh Posté le 21-03-2011 à 13:42:19    

Merci !
Je pensais justement pouvoir échapper à cette phase, et n'avais pas vu le lien entre celle-ci et le fait qu'il s'agisse d'un object PDOStatement.
Le truc est que désormais, le serveur ne trouve pas la variable donnees2 :

Code :
  1. <?php
  2.    try
  3.    {
  4.     $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
  5.     $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
  6.    if (isset($_POST['Actu']) AND !empty($_POST['Actu']))
  7.    {
  8.     $bdd2 = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
  9.     $dotat = $bdd2->query("SELECT titre, contenu FROM news_utilisateur WHERE id =" . $_POST['Actu']);
  10.     while ($donnees2 = $dotat->fetch())
  11.     {
  12.     echo htmlspecialchars($donnees2['titre']) . nl2br(htmlentities($donnes2['contenu']));
  13.     }
  14.    }
  15.    }
  16.    catch(Exception $e)
  17.    {
  18.     die('Erreur : '.$e->getMessage());
  19.    }
  20.   ?>


Reply

Marsh Posté le 21-03-2011 à 13:51:19    

- Quel est le résultat ?
- Pourquoi te connectes-tu deux fois à la base de données ?
- le !empty() rend inutile le isset()
- pour utiliser les requêtes préparées, au lieu de :

Code :
  1. $dotat = $bdd2->query("SELECT titre, contenu FROM news_utilisateur WHERE id =" . $_POST['Actu']);


utilise :

Code :
  1. $statement = $bdd2->prepare("SELECT titre, contenu FROM news_utilisateur WHERE id=:id" );
  2. $dotat = $statement->execute(array('id'=>$_POST['Actu']));


Message édité par Paulp le 21-03-2011 à 13:51:30
Reply

Marsh Posté le 21-03-2011 à 14:24:53    

Merci encore :)
Suite à tes conseils, j'ai nettoyé le code et été me documenter :

Code :
  1. <?php
  2.    try
  3.    {
  4.    if (!empty($_POST['Actu']))
  5.    {
  6.     $statement = $bdd->prepare("SELECT titre, contenu FROM news_utilisateur WHERE id=:id" ); // Prépare une requête
  7.     $dotat = $statement->execute(array('id'=>$_POST['Actu'])); //Exécute une requête préparée
  8.     echo htmlspecialchars($donnees['titre']);
  9.     echo nl2br(htmlentities($donnees['contenu']));
  10.    }
  11.    }
  12.    catch(Exception $e)
  13.    {
  14.     die('Erreur : '.$e->getMessage());
  15.    }
  16.   ?>


À terme, je placerai la préparation en haut de page, à la place de ce que j'avais fait.


Message édité par orang le 21-03-2011 à 14:25:26
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed