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 :

Plusieurs requêtes sur le même script


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2012
    Messages : 22
    Par défaut Plusieurs requêtes sur le même script
    Bonjour

    Mes scripts étant devenus âgés ceux-ci ont besoin d'être réactualisés. Mon idée passer aux PDO. Après avoir lu plusieurs documents, je me suis lancé. Mon idée mettre les requêtes INSERT et UPDATE sur le même script. J'ai commencé par refaire le script connexion à la BDD

    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
    <?php
    if ( ! function_exists('db_connexion')) {
       function db_connexion() {
     
          static $pdo;
     
          if ( ! ($pdo instanceof PDO)) {
     
             try {
                $pdo = new PDO('mysql:host=monhost;dbname=name;charset=utf8','base', 'passwort', [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES   => false
                ]);
             } 
             catch (PDOException $e) {
                throw new InvalidArgumentException('Erreur connexion à la base de données : '.$e->getMessage());
                exit;
             }
          }
     
          return $pdo;
       }
    }
    return db_connexion();
    ?>
    puis celui pour les requêtes, il y a deux solutions avec ou sans filtre, je ne sais pas bien laquelle serait plus idéale.

    Sans filtres
    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
    <?php
    $sql='SELECT *
    FROM car_tbl
    ORDER BY type, constructeur, modele, mes, exploitant, autres;';
    $type=array();
    $db = include 'dbbaseconnect.php'; 
    try{
       $stmt = $db->prepare($sql);
        $type='';
       $constructeur='';
       $modeles='';
       $mes='';
       $exploitant='';
       $autres='';
       $id_superieur_a=0;
       while($row= $stmt->fetch(PDO::FETCH_ASSOC)){
          $type[]=$row;
       }
       unset($db);
       //$data est complet
       if(count($type)>0){
          echo '<pre>';
          print_r($type);
          echo '</pre>';
       }
       else{
          echo 'Aucun resultat pour cette requete';
       }
    } 
    catch (Exception $e) {
       print "Erreur ! " . $e->getMessage() . "<br/>";
    }
    ?>
    avec filtre
    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
    $sql='INSERT INTO car_tbl (id, type, constructeur, modele, mes, exploitant) VALUES (NULL, ?, ?, ?, ?, ?)';
    $db = include 'db_mysql.php';
    try { 
       $stmt = $db->prepare($sql);
       $type='';
       $constructeur='';
       $models='';
       $mes='';
       $exploitant='';
       $autres='';
       $stmt->execute(array($type,$constructeur,$modeles,$mes,$exploitant,$autres)) ;
       $nb_insert = $stmt->rowCount();
       echo $nb_insert.' insertion effectuée<br/>';
       unset($db);
    } 
    catch (Exception $e) {
       print "Erreur ! " . $e->getMessage() . "<br/>";
    }
    Sur le même script, j'aimerais mettre aussi la requête UPDATE, voici le code qui a été placé en dessous de l'INSERT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $sql='UPDATE contact SET = ? WHERE car_tbl.type = ?;';
    $db = include 'db_mysql.php';
    try { 
       $stmt = $db->prepare($sql);
       $modeles='';
       $type=0;
       $stmt->execute(array($mail,$id)) ;
       $nb_update = $stmt->rowCount();
       echo $nb_update.' modif effectuée<br/>';
       unset($db);
    } catch (Exception $e) {
       print "Erreur ! " . $e->getMessage() . "<br/>";
    }
    ?>
    Pouvez me dire si le choix faire un script avec les deux requêtes est possible, ainsi que mes codes ont-ils beaucoup d'erreurs ?

    merci d'avance

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 815
    Billets dans le blog
    14
    Par défaut
    Concernant vos script...
    Sans filtres
    1) Il vaut mieux éviter la guerre des étoiles !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try{
       $stmt = $db->prepare($sql);
        $type='';
       $constructeur='';
       $modeles='';
       $mes='';
       $exploitant='';
       $autres='';
       $id_superieur_a=0;
       while($row= $stmt->fetch(PDO::FETCH_ASSOC)){
          $type[]=$row;
       }
    2) Sans filtre, il ne sert à rien de préparer la requête.

    3) Par contre, vous cherchez à lire le résultat de la requête sans la lancer !

    4) À quoi servent vos variables initialisées à vide ?

    5) Aérez votre code ! Il sera plus facile à lire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
    avec filtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql='INSERT INTO car_tbl (id, type, constructeur, modele, mes, exploitant) VALUES (NULL, ?, ?, ?, ?, ?)';
    6) Je préfère les paramètres nommés aux paramètres anonymes mais ça peut fonctionner ainsi.

    7)
    $type='';
    $constructeur='';
    $models='';
    $mes='';
    $exploitant='';
    $autres='';
    $stmt->execute(array($type,$constructeur,$modeles,$mes,$exploitant,$autres)) ;
    8) Vous lancez donc une requête paramétrée en lui passant des paramètres valorisés à vide. Vous allez donc enregistrer une ligne vide dans votre table !

    9) Attention ! Votre variable s'appelle $models et vous l'utilisez dans le lancement de la requête en tant que $modeles ; ce n'est pas la même variable.

    10) Si, comme j'ose l'espérer, votre modèle de données est correctement modélisé, les colonnes type, constructeur, modele et exploitant doivent être des entiers référençant les identifiants (de type entier) des tables où sont enregistrés les types, constructeurs, modèles et exploitants.
    Passez des valeurs correspondant au type de la colonne ! Pour enregistrer un entier, ne passez pas une variable de type chaîne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql='UPDATE contact SET = ? WHERE car_tbl.type = ?;';
    11) La bonne syntaxe d'une requête est la suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE la_table
    SET la_colonne = la_nouvelle_valeur
    WHERE condition
    Il manque le nom de la colonne à modifier dans votre requête.

    De plus, votre condition WHERE fait référence à une autre table donc ça ne fonctionnera pas.

    D'une manière générale, commencez par essayer vos requêtes sur une base de test directement dans le SGBD.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db = include 'db_mysql.php';
    12) Si j'ai bien compris, votre script UPDATE est dans le même fichier que le script INSERT. Vous avez donc déjà inclus db_mysql.php et il est inutile de l'inclure de nouveau.
    D'ailleurs, pour ne pas inclure plusieurs fois le même fichier, vous pouvez utiliser include_once.

    Pouvez me dire si le choix faire un script avec les deux requêtes est possible
    13) Oui, c'est possible, tel que vous l'avez fait. C'est comme si vous aviez deux fichiers php distincts appelés l'un derrière l'autre.

    Dans l'ensemble, il y a mieux comme programmation mais ça semble fonctionnel ainsi.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2012
    Messages : 22
    Par défaut
    J'ai fais les corrections (en espérant avoir rien oublier) ainsi que rajouter quelques champs à remplir oublier auparavant.
    Ce qui m'amène à une question. Sur ma table dans la BDD, j'ai mit des majuscules à mes nom de champ ainsi les mots type, constructeur, modele, exploitant, immatruclation et autre ont une majuscule au début et le mot mes et tout majuscule. Est-ce que je dois écrire sur le script exactement de la même façon que sur la BDD ?

    le code INSERT après correction

    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
    $sql='INSERT INTO car_tbl (id, Type, Constructeur, Modele, MES, Exploitant, Immatriculation, Autre) VALUES (NULL, ?, ?, ?, ?, ?, ?)';
    $db = include 'dbbaseconnect.php';
    try 
       { 
         $stmt = $db->prepare($sql);
         $type='';
         $constructeur='';
         $modele='';
         $mes='';
         $exploitant='';
         $immatriculation '';
         $autre='';
         $id_superieur_a=0;
         while($ = $stmt->fetch(PDO::FETCH_ASSOC))
    	  {
             $type[]=$row;
             $stmt->execute(array($type,$constructeur,$modele,$mes,$exploitant,$immatriculation, $autre)) ;
             $nb_insert = $stmt->rowCount();
                echo $nb_insert.' insertion effectuée<br/>';
                unset($db);
    } 
    catch (Exception $e) 
         {
           print "Erreur ! " . $e->getMessage() . "<br/>";
    }
    Pour la partie UPDATE, je séches sur comment ecrire après WHERE.

    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
    $sql='UPDATE car_tbl SET = id WHERE car_tbl. = ?;';
    $db = include_once
    try 
      { 
        $stmt = $db->prepare($sql);
        $exploitant='';
        $immatriculation='';
        $autre='';
        $stmt->execute(array($exploitant,$immatriculation,$autre)) ;
        $nb_update = $stmt->rowCount();
            echo $nb_update.' modif effectuée<br/>';
            unset($db);
      } 
          catch (Exception $e) 
    	  {
            print "Erreur ! " . $e->getMessage() . "<br/>";
          }

Discussions similaires

  1. [AC-2010] Requête sur le même champ plusieurs fois.
    Par Mickey7312 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 19/07/2014, 16h33
  2. [MySQL] Plusieurs requêtes sur la même page
    Par PHPulserz dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/12/2012, 16h44
  3. Réponses: 4
    Dernier message: 20/04/2012, 16h57
  4. Réponses: 2
    Dernier message: 31/01/2009, 20h49
  5. Réponses: 4
    Dernier message: 26/04/2006, 14h02

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