Lancer une methode avec un bouton.

Eléphanteau du PHP | 25 Messages

16 juin 2019, 23:14

Quel est le meilleure moyens de lancer une méthode avec un bouton.
Par exemple, je veux effacer une ligne dans mysql avec un certain ID a partir d'un bouton.

Merci

Avatar du membre
Mammouth du PHP | 1609 Messages

16 juin 2019, 23:18

Bah je sais pas si c'est LE meilleur moyen mais simplement tu fais un lien Supprimer href="delete.php?id=$id" et dans le script delete.php tu fais une requête DELETE FROM table WHERE id = :id.
Modifié en dernier par Saian le 17 juin 2019, 01:47, modifié 1 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

17 juin 2019, 10:26

Pardon mais, ou puis-je trouver les bases du PHP standard? je me prend la tête toute la journée a chercher des solutions mais je ne trouve pas de bases pour apprendre a faire tout les trucs standards.

Code pour lire a partir de mySQL, code pour écrir a partir de mySQL, code pour effacer a partir de mySQL, etc.


Pensez-vous que pour mon fichier php je puisse utiliser ça?

$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare("DELETE FROM billets WHERE id = $_GET['id']");
$req->execute(array($Titre, $Contenu));

Merci

Avatar du membre
Mammouth du PHP | 1609 Messages

17 juin 2019, 10:59

Oui à un ou deux détails près.
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$bdd->exec($req);

Il est recommandé de lier le paramètre en utilisant la méthode bindParam pour éviter une injection SQL car l'utilisateur pourrait modifier le contenu de $_GET['id'] pour tenter une attaque. La méthode bindParam va ajouter des ' autour de la chaîne et échapper les ' à l'intérieur de la chaîne s'il y en a.
Si tu es un puriste tu pourrais ajouter un troisième paramètre au bindParam, PDO::PARAM_INT pour signaler au bindParam que le paramètre est un integer mais ça marchera de toute façon très bien avec la valeur par défaut PDO::PARAM_STR.
https://www.php.net/manual/fr/pdostatem ... dparam.php

Et la méthode PDO::exec est plus adaptée à l'exécution d'un UPDATE ou d'un DELETE car elle retourne le nombre de lignes affectées. Tu peux ainsi tester le retour du exec pour savoir si une ligne a bien été supprimée.

On pourrait soulever une autre question de sécurité, l'utilisateur a-t-il le droit de supprimer la ligne en question ?

Et sinon au passage dans ton code tu as mis
"DELETE FROM billets WHERE id = $_GET['id']"
si tu veux qu'un index de tableau soit interprété dans une chaîne tu dois alors le mettre entre accolades
"DELETE FROM billets WHERE id = {$_GET['id']}"
. Mais comme je te l'ai précisé, en l’occurrence il faut que tu passes par le bindParam.

PS : pour les bases standards comme tu dis et bien tu achètes un bon bouquin ou tu trouves des bons tutaux sur un site internet type openclassrooms https://openclassrooms.com
La doc php quand à elle se trouve sur le site https://www.php.net
Avec les bons mots clés tu peux trouver tout ce dont tu as besoin via google. ;)
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

17 juin 2019, 16:02

ça avance merci beaucoup ...
Maintenant le lien est
supprimer_billet.php?id=17

le code dans le fichier:
<?php

$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$bdd->exec($req);


?>
et j'obtient l'érreur:

Warning: PDO::exec() expects parameter 1 to be string, object given in....

Comment je fais la conversion du id en string?

Eléphanteau du PHP | 25 Messages

17 juin 2019, 16:17

Comment faire pour convertir le bindParam en string?
J'ai une erreur de Warning: PDO::exec() expects parameter 1 to be string,
Oui à un ou deux détails près.
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$bdd->exec($req);

Il est recommandé de lier le paramètre en utilisant la méthode bindParam pour éviter une injection SQL car l'utilisateur pourrait modifier le contenu de $_GET['id'] pour tenter une attaque. La méthode bindParam va ajouter des ' autour de la chaîne et échapper les ' à l'intérieur de la chaîne s'il y en a.
Si tu es un puriste tu pourrais ajouter un troisième paramètre au bindParam, PDO::PARAM_INT pour signaler au bindParam que le paramètre est un integer mais ça marchera de toute façon très bien avec la valeur par défaut PDO::PARAM_STR.
https://www.php.net/manual/fr/pdostatem ... dparam.php

Et la méthode PDO::exec est plus adaptée à l'exécution d'un UPDATE ou d'un DELETE car elle retourne le nombre de lignes affectées. Tu peux ainsi tester le retour du exec pour savoir si une ligne a bien été supprimée.

On pourrait soulever une autre question de sécurité, l'utilisateur a-t-il le droit de supprimer la ligne en question ?

Et sinon au passage dans ton code tu as mis
"DELETE FROM billets WHERE id = $_GET['id']"
si tu veux qu'un index de tableau soit interprété dans une chaîne tu dois alors le mettre entre accolades
"DELETE FROM billets WHERE id = {$_GET['id']}"
. Mais comme je te l'ai précisé, en l’occurrence il faut que tu passes par le bindParam.

PS : pour les bases standards comme tu dis et bien tu achètes un bon bouquin ou tu trouves des bons tutaux sur un site internet type openclassrooms https://openclassrooms.com
La doc php quand à elle se trouve sur le site https://www.php.net
Avec les bons mots clés tu peux trouver tout ce dont tu as besoin via google. ;)

Avatar du membre
Mammouth du PHP | 1609 Messages

17 juin 2019, 16:45

Autant pour moi, le PDO::exec attend bien un string (la requête) tu ne peux donc pas faire le DELETE en faisant un bindParam et passer par PDO::exec.

Avec le PDO::prepare il faut donc utiliser PDOStatement::execute. C'est un peu dommage mais bon.
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$req->execute();
Tu peux toujours tester le retour mais la pour savoir si la requête s'est bien exécutée ou pas (retour true ou false).

Et puis du coup tu peux même réduire le code à ça :
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->execute(array(':id' => $_GET['id']));

Mais pour garder l'option de récupérer le nombre de lignes affectées en passant par PDO::exec tu dois pourvoir faire proprement aussi comme ça :
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$bdd->exec('DELETE FROM billets WHERE id = '.$bdd->quote($_GET['id']));
le PDO::quote va protéger ta chaîne tout comme le fait le bindParam.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

17 juin 2019, 17:02

Je me suis peut-être trompé.

J'ai résolu le problème comme ça:



$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);

$req->execute();


Tout simplement.



Autant pour moi, le PDO::exec attend bien un string (la requête) tu ne peux donc pas faire le DELETE en faisant un bindParam et passer par PDO::exec.

Avec le PDO::prepare il faut donc utiliser PDOStatement::execute. C'est un peu dommage mais bon.
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$req->execute();
Tu peux toujours tester le retour mais la pour savoir si la requête s'est bien exécutée ou pas (retour true ou false).

Et puis du coup tu peux même réduire le code à ça :
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->execute(array(':id' => $_GET['id']));

Mais pour garder l'option de récupérer le nombre de lignes affectées en passant par PDO::exec tu dois pourvoir faire proprement aussi comme ça :
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$bdd->exec('DELETE FROM billets WHERE id = '.$bdd->quote($_GET['id']));
le PDO::quote va protéger ta chaîne tout comme le fait le bindParam.

Avatar du membre
Mammouth du PHP | 1609 Messages

17 juin 2019, 17:17

Tu ne t'es pas trompé, c'est la première réponse que je t'ai donné dans ma réponse précédente. :P
Pour le reste j'ai détaillé et personnellement je privilégierais la troisième option car plus cohérente à mon sens (utiliser le PDO::exec pour un UPDATE ou un DELETE).
Modifié en dernier par Saian le 17 juin 2019, 17:20, modifié 2 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

17 juin 2019, 17:19

Tu ne t'es pas trompé, c'est la première réponse que je t'ai donné dans ma réponse précédente. :P
Pour le reste j'ai tout détaillé et personnellement je privilégierais la troisième option car plus cohérente à mon sens.


J'aime beaucoup plus la troisième en effet.
Merci.

Avatar du membre
Mammouth du PHP | 1609 Messages

17 juin 2019, 20:28

Petit complément d'information, en passant par PDOStatement::execute on peut utiliser PDOStatement::rowCount pour obtenir le nombre de lignes affectées.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

18 juin 2019, 08:59

OK Merci