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 :

requête SQL conditionnée en PHP


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 183
    Par défaut requête SQL conditionnée en PHP
    Bonjour,

    Je cherche à condenser l'écriture de multiples requêtes SQL UPDATE en PHP.

    Exemple :

    J'ai un formulaire avec plusieurs champs : reference, texte, date

    Actuellement, j'ai les fichiers PHP qui mettent chacun des champs, dans une application frontend (soit updateReference.php, updateTexte.php et updateDate.php)

    L'idée est qu'on ait ces trois fichiers dans un seul, et plus précisément sous la forme d'une seule fonction et du côté d'une API.

    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
     
        private $conn;
    function update(){
     
    $query .= "
    UPDATE
    schema.table
    SET";
    if (isset($_REQUEST['reference']) && ($_REQUEST['reference'] != null))
    $query .= "reference = :reference,";
    if (isset($_REQUEST['texte']) && ($_REQUEST['texte'] != null))
    $query .= "texte = :texte,";
    $query .= "
    modification=now(),
    maj_utilisateur = :utilisateur	
    WHERE
    id=:id";
    }
     
     
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam('id', $this->id, PDO::PARAM_INT);
            $stmt->bindParam('utilisateur', $this->utilisateur, PDO::PARAM_STR);
            $stmt->bindParam('reference', $this->reference, PDO::PARAM_STR);
            $stmt->bindParam('texte', $this->texte, PDO::PARAM_STR);
     
     
    $this->utilisateur = $_REQUEST['utilisateur'];
    $this->id = $_REQUEST['id'];
    $this->reference = $_REQUEST['reference'];
    $this->texte = $_REQUEST['texte']
    Premièrement, le code au-dessus ne fonctionne pas. J'ai aussi testé avec un switch mais cela ne fonctionne pas. Pour un seul champ, bien sûr ça fonctionne, mais ça se complique après quand il y en a plusieurs.

    Dans la requête d'API, j'aimerais qu'on ait pour mettre à jour uniquement le champ texte :
    "https://api.monapi.fr/api_test/update?id=58&texte=Mon super texte&utilisateur=sylvain"

    et pour le champ reference :
    "https://api.monapi.fr/api_test/update?id=58&reference=REF25&utilisateur=sylvain"

    Comment je peux adapter mon code pour que l'on ait plus qu'une seule fonction, une seule requête condensée ?

    Merci pour vos retours

    Sylvain

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 589
    Par défaut
    qu'est ce que vous voulez dire par "ne fonctionne pas" ?
    montrez nous le débugage et le résultat souhaité.

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    SET";
    if (isset($_REQUEST['reference']) && ($_REQUEST['reference'] != null))
    $query .= "reference = :reference,";
    Regarde la requête générée, la syntaxe est incorrecte, elle est de la forme :

    SETreference = :reference

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Par défaut
    Bonjour

    Tu peux créer une fonctions avec des paramètres du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Function MalChamp($nomCham, $valChamp, $idCle){
    $msqsl="";
    $msql="UPDATE maTable SET ".$nomCham."=". $valChamp." WHERE id=".$idCle;
    }

  5. #5
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 589
    Par défaut
    DMboup, il n'est pas conseillé de mettre les valeurs dans la construction de la requête, il vaut mieux utiliser une requête préparée :
    https://www.php.net/manual/fr/pdo.pr...statements.php

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Par défaut
    Bien sur que c'est pas conseillé.
    J'ai juste donné une piste qui peut trés bien être adapter au PDO.

    Exemple
    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
     
    Function MalChamp($nomChamp, $valChamp, $idCle){
        if ($nomChamp="reference"){
            $query="UPDATE maTable SET reference =:valChamp WHERE id =:idCle;
        }elseif ($nomChamp="texte"){
            $query="UPDATE maTable SET texte =:valChamp WHERE id =:idCle;
        }
     
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(':idCle', $idCle, PDO::PARAM_INT);
        $stmt->bindParam(':valChamp', $valChamp, PDO::PARAM_STR);
     
        $stmt->execute();
    }
     
    -- Récupération des variable
    $id = $_REQUEST['id'];
    $nomChamp="";
    $valChamp="";
     
    if (isset($_REQUEST['reference']) && ($_REQUEST['reference'] != null)){
        $valChamp = $_REQUEST['reference'];
        $nomChamp="reference";
    }
     
    if (isset($_REQUEST['texte']) && ($_REQUEST['texte'] != null)){
        $valChamp = $_REQUEST['reference'];
        $nomChamp="texte";
    }
     
    -- Appel de la fonction
    $makOk=MalChamp($nomChamp, $valChamp, $id);

Discussions similaires

  1. [MySQL-5.0] Requête sql conditionné
    Par pierre.itch dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/04/2013, 13h59
  2. [MySQL] Exécuter deux requêtes sql différentes en php
    Par gholaff dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/06/2011, 21h35
  3. Pb avec sys_guid() requête sql distante en php
    Par mcgiant dans le forum SQL
    Réponses: 1
    Dernier message: 15/04/2010, 14h53
  4. [MySQL] Résultat de requête SQL différent entre PHP et phpMyAdmin
    Par djsid dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/12/2009, 11h22
  5. [MySQL] [Requête SQL] Question Fonctions PHP
    Par Paul75 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/09/2008, 09h05

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