Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/05/2011, 14h09   #1
 
Femme rachida ben khlifa
Étudiant
Inscription : avril 2011
Messages : 30
Détails du profil
Informations personnelles :
Nom : Femme rachida ben khlifa
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 30
Points : -4
Points : -4
Par défaut suppression en php5

salut,
j'ai une problème à la fonction supprimer puisqu'il permet de me supprimer toutes les enregistrements dés que je veux supprimer un seul enregistrement lorsque je fais entre le clé primaire(id_circuit) voici mon code:
Code :
1
2
3
4
5
6
7
public function supprimercircuit($id_circuit){
$y = $_POST['id_circuit'];
$requete ="DELETE from circuit where id_circuit LIKE '%".$y."%';";
if($result = @mysql_query($requete)) {  
echo "";
}
}
et je fais l'appel de la fonction de la manière suivante:
Code :
1
2
3
4
5
<form method="post" action="circuitsupprimer.php">
				<font color="white">id_circuit:</font>
				<input name="id_circuit" type="text" value ="<?php include('recherchedecircuit.php'); $obj=new circuit('.$id_circuit.','.$Nomcircuit.','.$Villededépart.','.$Jourdedépart.','.$Jourderetour.','.$Durée.','.$Prix.','.$Supplementsingle.','.$Reductionenfant.','.$Description.'); $obj->supprimercircuit('.$id_circuit.'); ?>"><br></center>
				<td>
				<button name="supprimer" value=supprimer type=submit"><img src="bouttondelete.jpg" width="100" height="100"></button></form>
comme je dis il me permet de supprimer tous les enregistrements et il m'affiche la faute suivante:
Citation:
<br /> <b>Notice</b>: Undefined index: id_circuit in <b>D:\EasyPHP-5.3.3\www\pfe\recherchedecircuit.php</b> on line <b>307</b><br />
et merci d'avance
rachouda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 14h25   #2
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Code :
1
2
public function supprimercircuit($id_circuit){
      $y = $_POST['id_circuit'];
A quoi vous sert $id_circuit si vous utilisez "$y" dans votre requête (soit directement la variable en POST, super faille de sécurité)

Par ailleurs, il faut éviter les variables avec accent.

Enfin,
Code :
<input name="id_circuit" type="text" value ="<?php include('recherchedecircuit.php'); $obj=new circuit('.$id_circuit.','.$Nomcircuit.','.$Villededépart.','.$Jourdedépart.','.$Jourderetour.','.$Durée.','.$Prix.','.$Supplementsingle.','.$Reductionenfant.','.$Description.'); $obj->supprimercircuit('.$id_circuit.'); ?>">
Vous mettez un méthode de suppression directement dans la valeur du formulaire? J'ai l'impression que les bases du PHP ne sont pas maitrisées du tout...

http://sylvie-vauthier.developpez.co...rand-debutant/
Regardez surtout :
  • variables
  • Toute l'étape 3 (formulaire)
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 21h27   #3
 
Femme rachida ben khlifa
Étudiant
Inscription : avril 2011
Messages : 30
Détails du profil
Informations personnelles :
Nom : Femme rachida ben khlifa
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 30
Points : -4
Points : -4
merci a vous c'est bien passé voici le code si quelqu'un veut l'utiliser:
Code :
1
2
3
4
5
6
7
8
9
10
11
public function supprimercircuit($id_circuit){
if(isset($_POST['supprimer']))
{
 $requete ="DELETE from circuit where id_circuit LIKE '%".$_POST['id_circuit']."%';";
    if($result = @mysql_query($requete)) 
{  
					echo "";
}
}
echo "<font color='white'>id_circuit:</font>
	<input name='id_circuit' type='text' >";
rachouda est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/05/2011, 13h11   #4
Membre expérimenté
 
Avatar de FMaz
 
Inscription : mars 2005
Messages : 648
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 648
Points : 527
Points : 527
Si je peux me permettre d’améliorer le code:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public function supprimercircuit($id_circuit)
{
    $requete ="DELETE from circuit where id_circuit LIKE '%".(int)$id_circuit."%';";
    $result = @mysql_query($requete);
 
    return $result===false ? 'erreur' : true;
}
 
 
if(isset($_POST['supprimer']) && isset($_POST['id_circuit']))
{
    $ret = supprimercircuit($_POST['id_circuit']);
    echo 'Résultat = ' . $ret;
}
echo "<font color='white'>id_circuit:</font>
	<input name='id_circuit' type='text' >";
FMaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 14h57   #5
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Citation:
Envoyé par FMaz Voir le message
Si je peux me permettre d’améliorer le code
Sans remettre en doute vos compétences et sauf votre respect, les améliorations sont minimes par rapport à tout ça :

Code :
$result = @mysql_query($requete));
1 parenthèse en trop et le @ n'est, pour moi, pas une bonne pratique. (on cache les messages en prod et on les log, ou les affiche en dev mais on ne met pas de "@")

Code :
return $result===false ? 'erreur' : true; + echo 'Résultat = ' . $ret;
Donc si la requête fonctionne bien, on affiche "Résultat = " ?

Le fait de retourner une valeur est bien mais à part ça, pas d'amélioration pour moi
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/05/2011, 15h19   #6
Membre expérimenté
 
Avatar de FMaz
 
Inscription : mars 2005
Messages : 648
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 648
Points : 527
Points : 527
J'ai édité pour la ) en trop, merci.
le @ était dans le code original, je l'ai préservé. Le projet peut le justifier et je ne suis pas en mesure de juger de sa pertinence.

Le plus important dans mon correctif est le fait que toutes les requêtes ayant été données jusqu'ici étaient injectables.

L'autre détails était ce que tu mentionnais: rachouda utilise une fonction, mais n'utilise jamais le paramètre. J'ai donc proposé une fonction mieux découplée.


Finalement, si la requête s'exécute bien, je n'ai aucune idée de ce que rachouda voudra affichée. C'est à elle de s'occuper de l'implémentation. Pour répondre à ta question, si la requête réussit, ça affichera 1.

Exemple d'implémentation:
Code :
1
2
3
4
5
6
7
 
if($ret){
     echo '<div class="confirm_msg">' . _("Le circuit à été supprimé avec succès.") . '</div>';
}
else{
     echo '<div class="error_msg">' . _("Erreur lors de la suppression.") . '</div>';
}
On pourrait encore ajouter une meilleure gestion des erreurs en capturant les détails de l'erreur dans la fonction, et en retournant les résultats pour les afficher en complément au message d'erreur.

Bref, on pourrait faire un tas de choses, mais les détails d'implémentation dépasse la question.
FMaz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/05/2011, 15h32   #7
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Au temps pour moi, le @ était effectivement dans le code de base...Mon message s'adresse donc à l'OP pour ce point

Et j'ai du dérouler la page trop vite car je pensais que le (int) avait été mis par quelqu'un d'autre avant... C'est ça de faire plein de choses en même temps...

Par contre, pourquoi ne pas faire "return $result" plutôt que votre condition ternaire qui est inutile si vous utilisez l'implémentation de votre dernier message (qui est celle que j'utiliserais, en plus, ça sent la bonne librairie de traduction ça )

Après, on est d'accord pour l'implémentation des erreurs, j'essayais juste d'avertir l'OP par mes remarques envers votre post.
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 15h41   #8
Membre expérimenté
 
Avatar de FMaz
 
Inscription : mars 2005
Messages : 648
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 648
Points : 527
Points : 527
Et bien, ce code est loin d'être parfait, mais je crois qu'il n'est jamais trop tard pour commencer à améliorer le code pour avoir un découplage des responsabilités.

On appel la fonction avec une tâche en tête: supprimer. On s'attend à ce qu'elle retourne que c'est bon, ou pas. L'implémentation ne devrait même pas avoir à se soucier du fait qu'il y ai une ressource. Si éventuellement la base de données étaient changée pour autre chose que MySQL, il sera plus simple de modifier quelques fonctions que l'ensemble des cas d'implémentation qui doivent traiter avec une ressource.

Voilà pourquoi la fonction que je propose ne retourne pas une ressource.
FMaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 15h54   #9
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Sauf que, de mémoire (belle lurette que j'utilise plus mysql_*), mysql_query ne retourne pas obligatoirement une ressource.

En y allant, je cite le manuel :

Citation:
Pour les autres types de requêtes, INSERT, UPDATE, DELETE, DROP, etc., mysql_query() retourne TRUE en cas de succès ou FALSE en cas d'erreur.
Il ne retournera pas de ressource dans ce cas-ci.
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 02h37   #10
Membre expérimenté
 
Avatar de FMaz
 
Inscription : mars 2005
Messages : 648
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 648
Points : 527
Points : 527
Ah, et bien dans cas, oui, retourner $result pourrait être une option.
( Moi non plus je n'utilise plus mysql_ )

Alors la méthode pourrait être:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
/**
 * Effectue la suppression d'un circuit
 * 
 * @param int $id_circuit Id du circuit à supprimer
 * @return bool
 */
public function supprimercircuit($id_circuit)
{
    $requete ="DELETE from circuit where id_circuit = ".(int)$id_circuit.";";
    return @mysql_query($requete);
}
 
 
if(isset($_POST['supprimer']) && isset($_POST['id_circuit']))
{
    $ret = supprimercircuit($_POST['id_circuit']);
    echo 'Résultat = ' . ($ret ? 'Ok' : 'Erreur');
}
echo "<font color='white'>id_circuit:</font>
	<input name='id_circuit' type='text' >";
Ceci dit, je présume ici que l'ID du circuit est un entier. Mais pourquoi un LIKE ? Peut-être que l'ID du circuit est alpha numérique:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
/**
 * Effectue la suppression d'un circuit
 * 
 * @param string $id_circuit Id du circuit à supprimer
 * @return bool
 */
public function supprimercircuit($id_circuit)
{
    $requete ="DELETE from circuit where id_circuit LIKE '%". mysql_real_escape_string($id_circuit)."%';";
    return @mysql_query($requete);
}
 
 
if(isset($_POST['supprimer']) && isset($_POST['id_circuit']))
{
    $ret = supprimercircuit($_POST['id_circuit']);
    echo 'Résultat = ' . ($ret ? 'Ok' : 'Erreur');
}
echo "<font color='white'>id_circuit:</font>
	<input name='id_circuit' type='text' >";
FMaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 11h35   #11
 
Femme rachida ben khlifa
Étudiant
Inscription : avril 2011
Messages : 30
Détails du profil
Informations personnelles :
Nom : Femme rachida ben khlifa
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 30
Points : -4
Points : -4
bonjour,
je vous remercie pour votre effort mais le code qui vous proposée ne fonctionne pas lorsque j'essaye de l'utiliser
cordialement
rachouda
rachouda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 13h37   #12
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Ooooooh "ne fonctionne pas" et "ne marche pas" sont les réponses que je préfère.
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h05.


 
 
 
 
Partenaires

Hébergement Web