IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Insertion dans une table des résultats d'une requete [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 45
    Points : 20
    Points
    20
    Par défaut Insertion dans une table des résultats d'une requete
    Bonjour, maintenant que je pense ne plus avoir d'erreur d'ordre SQL, ça doit être du coté PHP.
    Je veux insérer dans une table les résultats d'une requête :
    J'ai fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    		$requete = "SELECT date_fin, Table1.num_contrat, Table2.nom_du_contact, Table1.num_client, email_du_contact
    					FROM Table1, Table2 
    					WHERE Table1.num_contrat = Table2.num_contrat
    					AND  TO_DAYS(`date_fin`) - TO_DAYS(NOW()) <=60;";
     		$resultat = mysql_query($requete) or die(mysql_error());
    		if (mysql_num_rows($resultat) == 0) {
    			   echo "Aucune ligne trouvée, rien à afficher.";
    			   exit;		
    		}
    		else {
    			$num_rows = mysql_num_rows($resultat);
    			echo "$num_rows ligne(s) trouvée(s)\n";
    		}
    		while ($row = mysql_fetch_assoc($resultat)) {
    			    $contrat = $row["num_contrat"];
    				$nom = $row["nom_du_contact"];
    				$client = $row["num_client"];
    				$date = $row["date_fin"];
    				$mailaddress = $row["email_du_contact"];
    		}
    $sql1 = "SELECT TO_DAYS(`date_fin`) - TO_DAYS(NOW())
    		FROM Table1";
    		echo $sql1;
    $res1 = mysql_query($sql1) or die(mysql_error());
    switch ($res1) {
    	case 60 :
    		$req2 = "INSERT INTO emailenvoyes (`num_contrat`, `num_client`, `dateenvoi`,`email`, `email_envoye60`) 
     					 VALUES ($contrat, $client, NOW(), '$mailaddress', 1)";
    		echo $req2;
    		mysql_query($req2) or die(mysql_error());
    		break;
    	case 30 :
    		$req2 = "INSERT INTO emailenvoyes (`num_contrat`, `num_client`, `dateenvoi`,`email`, `email_envoye30`) 
     					 VALUES ($contrat, $client, NOW(), '$mailaddress', 1)";
    		echo $req2,"<br />";
    		mysql_query($req2) or die(mysql_error());
    		break;
    	case 15 :
    		$req2 = "INSERT INTO emailenvoyes (`num_contrat`, `num_client`, `dateenvoi`,`email`, `email_envoye15`) 
     					 VALUES ($contrat, $client, NOW(), '$mailaddress', 1)";
    		echo $req2,"<br />";
    		mysql_query($req2) or die(mysql_error());
    		break;
    	case 7 :
    		$req2 = "INSERT INTO emailenvoyes (`num_contrat`, `num_client`, `dateenvoi`,`email`, `email_envoye7`) 
     					 VALUES ($contrat, $client, NOW(), '$mailaddress', 1)";
    		echo $req2,"<br />";
    		mysql_query($req2) or die(mysql_error());
    		break;
    }
    On dirait qu'il n'entre jamais dans mon switch, pourtant j'ai des données dans ma base.
    Si quelqu'un pouvait m'éclairer

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Déjà, le résultat renvoyé par mysql_query est une ressource et non un entier. Tu dois impérativement aller chercher les résultats avec mysql_fetch_*.

    Ensuite, tu n'as pas besoin de faire ce traitement au niveau de PHP, tu peux le faire en une seule requête en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table1 (...) SELECT ... FROM table2
    Enfin, mysq_query(...) or die est une très mauvaise habitude que tu dois oublier tout de suite !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 45
    Points : 20
    Points
    20
    Par défaut
    Enfin, mysq_query(...) or die est une très mauvaise habitude que tu dois oublier tout de suite !
    Pourquoi donc ?

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Est-ce que le script doit se terminer brutalement si une seule requête échoue ?
    Est-ce que l'utilisateur à quelque chose à faire des messages d'erreur de MySQL ?
    Est-ce que les informations fournies dans l'erreur MySQL pourrait servir à un attaquant pour comprendre comment fonctionne ton application ?
    N'est-il pas préférable de sortir proprement une page d'erreur avec le bon code HTTP (500 par exemple) et un message utilisateur suivi d'un lien ?
    Est-ce que l'administrateur du site ne préférerait pas avoir une entrée de log avec des messages d'erreur clairs pour pouvoir corriger rapidement les erreurs ?

    Mets toi deux minutes dans les bottes de l'utilisateur de ton service et tu comprendra pourquoi il vaut mieux gêrer correctement les erreurs. C'est pas une application C que tu écris, tu dois considérer que même en production, y'aura potentiellement des bugs et que donc, tu dois au maximum protéger l'utilisateur et le service.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 45
    Points : 20
    Points
    20
    Par défaut
    D'accord merci pour ces détails, mais concernant votre première réponse, je dois laisser un switch ? je comprends pas vraiment

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu peux laisser ton switch, mais tu dois extraire l'information dont tu as besoin de la ressource, de la même façon que tu l'as fait juste avant avec $row = mysql_fetch_assoc($resultat.

    Pour nuancer le propos de Benjamin, je dirais que la structure mysql_query($req2) or die(mysql_error()); est bien utile en développement mais ne doit pas surtout pas rester dans le code final, de la même façon que tu ne vas pas laisser les echo $req2; qui parsèment ton code

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je pense au contraire que c'est prendre le risque d'oublier quelques or die en prod. Quand on veut savoir ce qui se passe lors du runtime en développement, on active le reporting d'erreur au maximum, on mets des logs et on utilise éventuellement un débogueur, on ne modifie pas le programme pour ajouter des traces.

    Enfin, c'est mon avis.

  8. #8
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Points : 107
    Points
    107
    Par défaut
    Salut,
    Je me permets de donner quelques avis sur ce script, indépendamment du débat de gestion d'erreurs. Ca pourra peut-être aider.

    En faisant une requête sur plusieurs table, il faut veiller à bien préciser la table pour chaque champs (il n'y en a pas pour date_fin ni email_du_contact).

    Je ne comprends pas comment tu peux faire un "while" et nommer des variables ! Si tu as plusieurs lignes, tu va changer de valeurs pour $contrat... autant de fois et ne garder que les valeurs de la dernière ligne !

    Si tu t'attends à n'avoir qu'une seule ligne, autant le dire dans la requête SQL avec un "LIMIT 1" et juste faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list($contrat,$nom,$client,$date,$mailaddress) = mysql_fetch_assoc($resultat)
    Enfin, comme dit Benjamin, il doit y avoir plus pratique qu'une requête pour le nombre de jours + un switch pour un petite différence d'un champ. Certainement tu peux avoir une seule colonne email_envoye et y mettre tes 60, 30, 15 au lieu de '1'.

    Voilà, espérant aider un peu.

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    N'oubliez pas de sécuriser quand vous utilisez des listes, rien ne garantis que votre tableau contiens suffisamment d'entrées.
    Pour être certain de rester E_STRICT safe, utilisez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list($a,$b,$c) = $tab + array(null, null, null);
    Dans cet exemple, même si $tab contiens moins de 3 éléments, des valeurs nulles seront mises dans $a,$b ou $c et aucune erreur ne sera émise.

    N'oubliez pas non plus que list se sert des index numériques de 0 à n, les tableaux indexés par clés alphanumériques (comme ceux produits par mysql_fetch_assoc) sont donc innapropriés (il vaut mieux utiliser mysql_fetch_array ou array_values).

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 45
    Points : 20
    Points
    20
    Par défaut
    Merci à vous pour ces réponses
    et comme l'a dit Celira, je ne compte pas laisser les echo $req2 et or die(mysql_error()) sur le code final.

  11. #11
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Points : 107
    Points
    107
    Par défaut
    le plus simple étant de conserver le format "tableau" et le même nom de clé que les champs, ça simplifie la vie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableau = mysql_fetch_assoc($resultat)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/06/2010, 03h18
  2. Calcul d'une valeur pour insertion dans la table des faits
    Par moheissenger dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 24/02/2010, 01h02
  3. [Modèle Relationnel] Faire une table par type ou une table des types ?
    Par jax54000 dans le forum Schéma
    Réponses: 12
    Dernier message: 18/11/2009, 11h43
  4. [MySQL] Affichage trié des résultats d'une table
    Par baggie dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/11/2009, 11h27
  5. Réponses: 2
    Dernier message: 29/09/2009, 00h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo