Page 1 sur 1

Lancer une methode avec un bouton.

Posté : 16 juin 2019, 23:14
par BlitzMX
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

Re: Lancer une methode avec un bouton.

Posté : 16 juin 2019, 23:18
par Saian
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.

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 10:26
par BlitzMX
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

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 10:59
par Saian
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. ;)

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 16:02
par BlitzMX
ç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?

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 16:17
par BlitzMX
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. ;)

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 16:45
par Saian
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.

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 17:02
par BlitzMX
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.

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 17:17
par Saian
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).

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 17:19
par BlitzMX
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.

Re: Lancer une methode avec un bouton.

Posté : 17 juin 2019, 20:28
par Saian
Petit complément d'information, en passant par PDOStatement::execute on peut utiliser PDOStatement::rowCount pour obtenir le nombre de lignes affectées.

Re: Lancer une methode avec un bouton.

Posté : 18 juin 2019, 08:59
par BlitzMX
OK Merci