Salut !

Voilà, je suis sur un développement d'un site, plus particulièrement sur une page de retrait de produits insérés dans une base de données.
Sur cette page, j'appelle ma base, je lui fais une requête pour afficher toute la table, et avec PHP je fais un

$elems = $pdo->query('SELECT * FROM produit');

Auquel j'applique un template HTML.
Tout fonctionne, je récupère le nom du produit, son prix, son image etc.
Cependant pour la suppression, j'ai besoin d'afficher un bouton à côté de chaque article, et au clic, j'effectue une requête SQL qui supprime le produit avec l'identifiant de cette occurence.

<td rowspan="2" class="noborder"> &nbsp; <button class="btn btn-danger" onclick=" <?php $rec=$pdo->prepare('DELETE FROM produit WHERE produit.idProduit = '.$elem->idProduit); $rec->execute(); ?>
window.location.reload(true);">!</button></td>

D'abord, ce qui est bizarre c'est que le code s'éxécute lors du chargement de la page, et non pas en cliquant sur le bouton.
Ensuite, il me vide entièrement la table, et non pas seulement avec l'identifiant désiré.
Pourtant quand je fais un var_dump de $elem, il me retourne bien le tableau avec toutes les données de ma table, y compris l'identifiant.
Quand je souhaite afficher l'identifiant je caste en (int) ce que me retourne $elem->idProduit et l'identifiant s'affiche bien.
ça fait un bon moment que je cherche comment résoudre ce problème en essayant diverses requêtes et divers moyens d'obtenir l'ID, les 2 fonctionnent individuellement (j'arrive à supprimer un identifiant précis en cliquant sur n'importe quel bouton, et j'arrive à récupérer l'identifiant de chaque occurence), mais impossible de faire fonctionner les deux simultannément. Si quelqu'un a une réponse à m'apporter, elle sera la bienvenue. Merci d'avance ! :)

12 réponses


eltharin
Réponse acceptée

essaies, au lien de ton bouton de faire un lien html avec en php :

echo '<a href="/ma_page_de_suppr.php?id='$elem->idProduit'">mon lien</a>';

et donc tu crées une page ma_page_de_suppr.php :

 $rec=$pdo->prepare('DELETE FROM produit WHERE produit.idProduit = :produit');
 $rec->execute(array('produit'=>$_GET['id']));

Bonjour,

c'est normal que cela ne fonctionne pas car tu mélanges ici un code s'exécutant côté serveur et un côté s'exécutant côté client.

Schématiquement :

Navigateur ---> Requête au Serveur.
Serveur --> Interpréteur php si le fichier est un fichier php
Interpréteur Php --> Donne le Html généré suite au passage de l'interpréteur php au serveur.
Serveur--> Envoie l'Html au Navigateur (Il n'y a donc à ce moment là plus aucun code php, tout a été exécuté/interprété sur le serveur pour produire de l'html)
Navigateur reçoit l'Html et l'affiche. Il déclenche les appels aux images/css/js de la page, traite les réponses.
L'interpréteur Javascript interprète alors les javascripts de la page.

Cette simplification un peu grossière devrait te permettre de comprendre pourquoi ce que tu essayes de faire NE PEUT PAS marcher de cette façon

Le onClick c'est du javascript. Le contenu que tu lui a donné est du php. Le php est interprété sur le serveur et donc avant que tu ai reçu la page du serveur.

cordialement

Anthony

Je comprend la logique, j'ai crée une fonction que j'appelle. Quand je charge la page, le code ne s'éxécute plus automatiquement, mais la requête ne supprime plus rien...

onclick="delprod('<?= (int)$elem->idProduit ?>');
window.location.reload(true);"
function delprod($prod){
  $rec=$pdo->prepare('DELETE FROM produit WHERE produit.idProduit = '.$prod.'');
  $rec->execute();
}

Bonjour,

Comme l'a dit antho07, tu demandes une page au serveur, le php génrère la page et transmet du HTML à ton navigateur qui te l'affiche en forme.

Tu ne peux pas demander à ton navigateur d'executer du PHP.

Si tu eux réexecuter du PHP derrière, il faut que ton navigateur refasse une demande (requete HTTP), soit par appel normal (passage à une page différente) ou via appel AJAX (requete HTTP sur la page courante).

Et sur la nouvelle page appellée, là tu pourras executer ton PHP pour faire ton delete.

Je n'ai aucune connaissance en ajax, et je passe déjà par une autre page qui englobe mes fonctions, mais dans tous les cas je suis quand même obligé d'envoyer du php en paramètre d'entrée pour récupérer l'identifiant de l'occurence produit non ?
J'ai essayé beaucoup de beaucoup trop de manières différentes, je suis un peu perdu là.

<?php echo "<a href='inc/delete.php?id=$elem->idProduit'>lien</a>";  ?>
<?php
$rec=$pdo->prepare('DELETE FROM produit WHERE produit.idProduit = :produit');
$rec->execute(array('produit'=>$_GET['id']));
header('Location: ./delprod.php');
?>

Aucune suppression :/

ta page c'est juste ces deux lignes?

du coup il devrait te dire $pdo est inconnu.

Il faut te connecter à chaque page.

Non la page d'affichage des produits à supprimer est bien plus longue, en l'état actuel :

<?php
include 'inc/functions.php';
logged_only();
require 'inc/header2.php';
?><br/>
<style>
td{
  text-align:center;
}
.noborder{
  border-width:0px;
}
td.bordered{border-width:1px;
 border-style:solid;
 border-color:black;
}
</style>
<?php
include 'inc/db.php';
$elems = $pdo->query('SELECT * FROM produit');
foreach($elems as $elem):
  ?>
<table>
<tr>
  <td class="bordered" rowspan="2"> <?php if($elem->imageProd!=""){
    $image = "res/objets/".$elem->imageProd;
    echo"<img width='150px' height='150px' src='$image'>";
  } ?>
  </td>
  <td class="bordered" style="width:400px; font-weight:bold;"><?= $elem->nomProd ?></td>
  <td class="bordered" rowspan="2" style="width:100px; text-align:center;"><?= $elem->prixProd ?>€</td>
<td rowspan="2" class="noborder"> &nbsp; <button class="btn btn-danger" id="btndel" onclick="<?php echo "<a href='/inc/delete.php?id='$elem->idProduit''>lien</a>";  ?>">!</button></td></tr>
</td>
  <tr><td><?= $elem->descrProd ?></td></tr>
</table>
<br/>
<?php endforeach ?>
<br/>
<?php require 'inc/footer.php'; ?>

EDIT : Pdo est défini dans db.php

<?php
$pdo = new PDO('mysql:dbname=tp_commerce;charset=utf8;host=localhost', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

et bien sur ta page inc/delete.php il faut remettre include 'inc/db.php';

ça ne fonctionne toujours pas, mais quand je clique sur le bouton il ne me redirige même pas sur la page ?id

<button class="btn btn-danger" id="btndel" onclick="<?php echo "<a href='/inc/delete.php?id='$elem->idProduit''>lien</a>";  ?>">!</button>

Au lieu de ton bouton tu met un lien, tu ne met pas un lien dans un onclick...

La fatigue.. ^^'
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: '.18.'' in C:\wamp64\www\PhpCommerce\inc\delete.php on line 4
( ! ) PDOException: SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: '.18.' in C:\wamp64\www\PhpCommerce\inc\delete.php on line 4

<?php
include 'db.php';
$rec=$pdo->prepare('DELETE FROM produit WHERE produit.idProduit = :produit');
$rec->execute(array('produit'=>$_GET['id']));
header('Location: ./delprod.php');
?>

Erreur de ma part,

href='inc/delete.php?id=$elem->idProduit'>

et pas

href='inc/delete.php?id=.$elem->idProduit.'>

ça a l'air fonctionnel :) Merci à toi Eltharin, quelques petits détails à finir mais ça devrait aller maintenant :)