CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[PHP] Help pour ma fonction delete($id)

panavision
panavision
Niveau 11
13 février 2013 à 10:12:09

Salut, j'aurais besoin d'aide pour faire fonctionner ma fonction delete($id).

Je me suis vraiment emmêlé les pinceaux.

Cette fonction, comme son nom l'indique, sert à supprimer des données dans la bdd.

J'ai mis $id comme argument. Ceci dit, dans l’exécution de cette fonction, je veux entrer une chaîne de caractère. Cette chaine de caractère renverra donc automatiquement l'id car celle-ci est associé à lui dans un array.

De plus, il me faut vérifier si la chaîne de caractère existe bel et bien.

J'ai créer cette méthode et j'ai essayé tant bien que mal d'y inclure les paramètres souhaités. Mais ça ne fonctionne pas.

Je vous laisse voir la fonction :

http://wall.deblan.fr/x16cb/php/1/

Vous l'aurez compris j'essaie de transformer une chaîne de caractère en entier.

Quand je rentre un login dans ma bdd puis quand j'instancie la fonction delete()comme ceci :

echo $manager->delete('pseudo') ;

ça me retourne toujours "Utilisateur inconnu". Et quelque soit la valeur passée en argument, que celle-ci existe ou non en bdd.

Que me suggerez-vous ?

merci.

vava740
vava740
Niveau 10
13 février 2013 à 10:52:56

Tu n'es pas obligé de faire toutes ces vérifications, MySQL ne supprimera rien si l'id en question n'existe pas, et si il existe tout se passera correctement.

Tu peux lui passer l'id en chaîne de caractère ou en entier, MySQL saura faire avec. :ok:

print_r est une fonction de débug, elle t'affiche ce que tu lui passe en paramètres mais ne le retourne pas, tu concatène le résultat de print_r à ta requête SQL, ça ne rime strictement à rien...

Tu peux simplement faire :

$statement = $this->db->db()->prepare('DELETE FROM membres WHERE id = :id');
$statement->bindValue(':id', $id);
return $statement->execute();

Et ta fonction est dans un modèle j'imagine, par conséquent il n'y a aucune raison de retourner des chaînes de caractères, tu retourne un booléen selon le bon fonctionnement ou non de l'opération, mais du texte n'a rien à faire dans ta valeur de retour.

Pseudo supprimé
Pseudo supprimé 13 février 2013 à 10:54:18

('SELECT COUNT(*) FROM membres WHERE username = :login');
Le problème viendrait pas de là ?
":login"

("SELECT COUNT(*) FROM membres WHERE username = '$login'");
Si $login est bien une variable comme je l'ai compris, faut le mettre dans la rqt,
Sinon il va chercher dans la database si il y a un membre qui s'appelle ":login".

De plus, il faut echapper les caractères mySQL pour éviter les injections,
Et faire attention à d'autres trucs, par exemple ne pas prendre en compte la casse.

Et les recherches de chaines de caractères s'effectuent en entourant celles-ci par des guillemets simple ou double.

Pseudo supprimé
Pseudo supprimé 13 février 2013 à 10:55:14

Ah j'ai dis n'importe quoi peut être, ':login' renvoi quoi en fait ?

vava740
vava740
Niveau 10
13 février 2013 à 13:48:41

@Serialesky: Renseigne-toi sur les requêtes préparées avec PDO, :login signifie ici qu'il y aura une variable à échapper, qu'on insert dans la requête par la suite avec bindValue(). Une fois la requête complète elle est exécutée. PDO mettra tout seul les guillemets et échappera la valeur en tenant compte de l'encodage de la BDD.

Pseudo supprimé
Pseudo supprimé 13 février 2013 à 15:49:44

Ah ok, j'utilise le vieux "mysql_query" et du coup j'ai pas compris.

panavision
panavision
Niveau 11
14 février 2013 à 04:46:59

Salut à tous. Merci pour vos réponses.

@vava740 :

Finalement j'ai réussi à faire en sorte que ma fonction delete supprime l'id en tapant une chaine de caractère correspondant au username.

http://wall.deblan.fr/x16d0/php/1/

Pour cela, je me suis aidé de ma fonction getId($login) que j'ai créer plus tôt :

http://wall.deblan.fr/x16d1/php/1/

c'est cette fonction que je passe en argument de ma fonction delete. Par exemple :

$manager->delete($manager->getId('panavision'));

T'avais raison pour le print_r que je m'entêtais à laisser c'est ce qui bloquais lors de l’exécution de la fonction. Maintenant avec le $this->r[$this->login], il n'y a plus de soucis.

ça fonctionne plutôt bien. Mais le problème c'est que quand le pseudo n'existe pas ou quand le pseudo à été supprimé, j'ai une erreur notice qui s'affiche dans ma vue 'undefined index:panavision ' c'est bien normal que la fonction ne trouve pas cette entrée en BDD puisque celle-ci est effacée .

Maintenant j'aimerais pouvoir vérifier si une valeur existe en bdd avant d'obtenir son id ou de la delete.

J'ai essayé avec fetchColumn() mais je ne sais pas pourquoi ça ne marche pas. Il faut dire que je ne maîtrise pas encore tout à fait la PDO. Je ne cerne pas bien encore le rôle de rowCount() et de fetchColumn(). J'aimerais que tu m'éclaires si tu en sais quelques chose car la doc de PDO n'est pas très explicite à ce sujet à mon avis.

voici la fonction que j'ai tenté de créer pour voir si le login existe :

http://wall.deblan.fr/x16d6/php/1/

En ce qui concerne les messages d'erreur que j'affiche dans mon model, c'est uniquement pour les tests et les debugs pendant le codage. Sinon, dès que j'aurais terminé cette classe, je remplacerais cela par des true/false.

vava740
vava740
Niveau 10
14 février 2013 à 07:45:30

$statement->rowCount() pour savoir le nombre de lignes qu'a retourné ta requête SQL.

Quoi qu'il en soit tu n'étais pas obligé de créer une fonction pour ça. Ton getId ne devrait pas fonctionner comme ça, revois tes bases de SQL. Tu veux avoir les infos d'un utilisateur, tu récupère les infos d'un utilisateur, tu dump pas toute ta base pour faire un traitement en PHP après.

SELECT id FROM membres WHERE username = :username

Tu bind :username avec la nom d'utilisateur qui t'es passé en paramètre, tu appelle une fois fetch() pour récupérer la ligne retournée (si tu as fait ta table correctement il ne devrait pas être possible d'utiliser plusieurs fois le même nom d'utilisateur), et tu peux retourner uniquement l'id.

Mais vérifie d'abord d'avoir un rowCount, et tu retourne 0 si aucune ligne n'est retournée.

Avec ça tu pourras faire $id = $manager->getId('Pseudo'), vérifier que l'id est plus grand que 0, si oui tu peux le supprimer, sinon c'est qu'il n'existe pas. :ok:

Sinon dans ta fonction getId() tu n'as pas besoin de mettre le login dans un attribut d'instance, ni ton $this->r. Au passage dans ta fonction actuelle tu redéclare à chaque tour de boucle $this->r au lieu de push ton tableau, normal qu'à la fin il ne trouve pas l'index (même problème que l'autre jour, au lieu d'alimenter un tableau tu l'écrase systématiquement avec la dernière ligne).

Revois peut-être le principe des boucles et des tableaux si ça peut t'aider. :(

panavision
panavision
Niveau 11
14 février 2013 à 10:58:46

Merci pour les explications sur rowCount(). En gros si j'ai bien compris, ça me permettra de compter le nombre de valeurs dans ma table.

En ce qui concerne ma fonction getId($login). Elle a pour but d'obtenir l'id d'une chaîne de caractère dans la colonne username de ma table. De plus si je ne mets pas l'attribut $login en argument, j'ai du mal à comprendre comment je pourrait spécifier de quel login je veux avoir l'ID.

L'undefined index provenait plutôt de ma fonction logExists($login) que j'avais mis en conditions dans la fonction getID($login). Celle-ci avait une requête mal executée , c'est ce qui me renvoyais undefined index.
Mais j'avoue que c'était stupide de ma part de mettre le $this->r dans la boucle.

Voici la fonction en question corrigée :

http://wall.deblan.fr/x16da/php/1/

Maintenant j'ai un autre petit problème. Quand je veux générer une erreur dans ma vue, je fais un if($manager->logExists($login)) dans ma classe avec $manager l'instance du Manager, et là, PDO me renvoie une erreur du genre too many connections.

Je sais pas trop ce que je dois faire pour stopper cette erreur, j'ai instancié mon manager que dans 2 ou 3 fichiers maximum. :(

vava740
vava740
Niveau 10
14 février 2013 à 12:07:58

Ton manager se reconnecte à la BDD à chaque fois que tu fais une requête ? :-(

panavision
panavision
Niveau 11
15 février 2013 à 00:39:29

euh, je ne pense pas qu'il se reconnecte à chaque fois. :question:

ma connexion n'est pas dans une boucle :(

Je crois savoir pourquoi j'ai eu cette erreur 'too many connections'.

J'avais deux classes et chacune d'elles s'incluaient mutuellement. Donc je pense que c'est ça qui a provoqué l'erreur.

Par ailleurs, j'ai pu utiliser le rowCount() et c'est exactement ce que je cherchais pour compter les entrées dans ma table. :ok:

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment