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

Langage PHP Discussion :

Récupération de value de select pour traitement SQL


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Eternel étudiant
    Inscrit en
    Octobre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Eternel étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 34
    Points : 18
    Points
    18
    Par défaut Récupération de value de select pour traitement SQL
    Bonjour,

    Me voilà au 1er épisode de la saison 2 !
    (Suite de cette discussion)

    Je récupère bien un array de $_POST([]) avec des mes champs de mes select que cela soit dans le fichier php qui traitera mes résultats de ma requête sql. Je l'ai bien jusque dans mon model.

    Mais au passage de mes paramètres pour la requête j'obtiens l'erreur suivante :

    PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in pieceModel.php on line 311
    Cette ligne correspond à la ligne : $specificProfessionalPieces->execute([]); du code ci-dessous :
    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
    static function getSpecificProfessionalActivePieces() {
     
        global $bdd;
     
        if (!empty($_POST['placeChoice'] && (isset($_POST['placeChoice']) || (!empty($_POST['gaugeChoice'] && (iseet($_POST['gaugeChoice']) || (!empty($_POST['duration_choice'] && (iseet($_POST['duration_choice']) || (!empty($_POST['audience_choice'] && (iseet($_POST['audience_choice'])))))))))))))
     
        $specificProfessionalPieces = $bdd->prepare(
                'SELECT p.id, p.flyer, p.piece_name, p.max_gauge, p.duration, p.audience, pu.universe_id
                FROM piece p
                INNER JOIN universe u
                INNER JOIN piece_universe pu
                 ON pu.piece_id = p.id
                 AND u.id = pu.universe_id
                INNER JOIN troop t
                INNER JOIN piece_troop pt
                 ON t.id = pt.troop_id
                 AND p.id = pt.piece_id             
                WHERE pt.troop_id LIKE 1
                 AND p.situation LIKE "Actif"
                 AND p.max_gauge = :gaugeChoice
                 AND p.duration = :durationChoice
                 AND p.audience = :audienceChoice
                 AND pu.universe_id = :placeChoice');
            $specificProfessionalPieces = $bdd->prepare($sql);
            $specificProfessionalPieces->bindValue(':placeChoice', intVal($_POST['placeChoice']));
            $specificProfessionalPieces->bindValue(':gaugeChoice', strVal($_POST['gaugeChoice']));
            $specificProfessionalPieces->bindValue(':durationChoice', strVal($_POST['durationChoice']));
            $specificProfessionalPieces->bindValue(':audienceChoice', strVal($_POST['audienceChoice']));
     
            $specificProfessionalPieces->execute([]);
            return $specificProfessionalPieces->fetchAll();
        }
    Merci pour votre aide, car je n'y comprends plus rien !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1-
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
            $specificProfessionalPieces->execute();

    2-
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            $specificProfessionalPieces->bindValue(':placeChoice', $_POST['placeChoice'], PDO::PARAM_INT);
            $specificProfessionalPieces->bindValue(':gaugeChoice', $_POST['gaugeChoice'], PDO::PARAM_STR);
            $specificProfessionalPieces->bindValue(':durationChoice', $_POST['durationChoice'], PDO::PARAM_STR);
            $specificProfessionalPieces->bindValue(':audienceChoice', $_POST['audienceChoice'], PDO::PARAM_STR);

  3. #3
    Membre à l'essai
    Homme Profil pro
    Eternel étudiant
    Inscrit en
    Octobre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Eternel étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Super, Merci : effectivement je n'ai plus l'erreur. Mais après quelques essais, mon affichage reste vide.

    Je pense que mon problème est désormais que les éléments que je renvois dans les valeurs par défaut de mes select ("") n'est pas bon ou alors, je le traite mal.
    Vaut-il mieux que je renvois null plutôt que "" ? Ou quelle est la meilleure méthode pour traiter 3 select vides ?

    Merci !

  4. #4
    Invité
    Invité(e)
    Par défaut

    Regarde surtout la fabrication de la clause WHERE : $clause_WHERE.
    Et tu n'as pas forcément besoin de $_SESSION['recherche'].

    Il te suffit d'adapter à tes 3 <select> :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // -------------
    if( !empty($_POST['critere1']) )
    {
    	switch( $_POST['critere1'] ){
    		case -99:	// Tous
    			// $sql_where : (rien)
    			break;
    		default:
    			$sql_where[] = " (colonne1 = :critere1) ";
    			$sql_param[':critere1'] = $_POST['critere1'];
    	}
    }
    // -------------
    Dernière modification par Invité ; 13/11/2019 à 14h50.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Eternel étudiant
    Inscrit en
    Octobre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Eternel étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Merci pour le message d'hier et félicitations pour cet article : au delà d'y avoir trouvé des infos pour ma situation, j'ai compris certains mécanismes que j'ignorais !

    Je me suis donc penché sur le rédaction des éléments et des paramètres pour pouvoir les concaténer (j'avais essayé cette solution avant mais sans succès car les premières étapes n'étaient pas bonnes). J'ai pu corriger les erreurs courantes. En revanche, j'ai encore des difficultés à concaténer le bind de paramètres. Et du coup je suis bloqé avec l'erreur suivante :
    Call to a member function bindValue() on string in C:\wamp\www\...\pieceModel.php on line 309" (309, ce qui correspond au 1er bind)
    je pense que cela vient du fait que j'ai essayé la concaténation avec des variables juste après la définition de $clauseXxx pour les valeurs de mes select. Finalement, j'ai tenté ma chance en les sortant des If/Switch/Case mais sans plus de résultat.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    // php - Model
     
    static function getSpecificProfessionalActivePieces() {
     
        global $bdd;
     
        var_dump($_POST);
        $specificProfessionalPieces ="";
     
        $clausePlace = "";
        $clauseGauge = "";
        $clauseDuration = "";
        $clauseAudience = "";
     
        //$placeParam = "";
        //$gaugeParam = "";
        //$durationParam = "";
        //$audienceParam = "";
     
        $sqlSelect = "SELECT p.id, p.flyer, p.piece_name FROM piece p INNER JOIN universe u INNER JOIN piece_universe pu ON pu.piece_id = p.id  AND u.id = pu.universe_id INNER JOIN troop t INNER JOIN piece_troop pt ON t.id = pt.troop_id AND p.id = pt.piece_id WHERE pt.troop_id LIKE 1  AND p.situation LIKE `Actif`";
     
        if (!empty($_POST))
        {
            switch ($_POST['placeChoice']) {
                case "":
                    $clausePlace = "";
                    $specificProfessionalPieces = "";
                    break;
                default :
                    $clausePlace = "pu.universe_id = :placeChoice";
                    $specificProfessionalPieces -> bindValue(':placeChoice', $_POST['placeChoice'], PDO::PARAM_STR);
                    break;
            }
            switch ($_POST['gaugeChoice']) {
                case "":
                    $clauseGauge = "";
                    $specificProfessionalPieces = "";
                    break;
                default :
                    $clauseGauge = "max_gauge = :gaugeChoice";
                    $specificProfessionalPieces -> bindValue(':gaugeChoice', $_POST['gaugeChoice'], PDO::PARAM_STR);
                    break;
            }
            switch ($_POST['durationChoice']) {
                case "":
                    $clauseDuration ="";
                    $specificProfessionalPieces = "";
                    break;
                default :
                    $clauseDuration = "duration = :durationChoice";
                    $specificProfessionalPieces -> bindValue(':durationChoice', $_POST['durationChoice'], PDO::PARAM_STR);
            }
            switch ($_POST['audienceChoice']) {
                case "":
                    $clauseAudience ="";
                    $specificProfessionalPieces = "";
                    break;
                default :
                    $clauseAudience = "audienceChoice = :audienceChoice";
                    $specificProfessionalPieces -> bindValue(':audienceChoice', $_POST['audienceChoice'], PDO::PARAM_STR);
            }
        }
     
        $clauseWhere = "AND " . $clausePlace . " AND " . $clauseGauge . " AND " . $clauseDuration . " AND " . $clauseAudience;
     
        $req = $sqlSelect . $clauseWhere . ";";
     
        $specificProfessionalPieces = $bdd->prepare($req);
     
        //$specificProfessionalPieces->bindValue($placeParam, PDO::PARAM_INT);
        //$specificProfessionalPieces->bindValue($gaugeParam, PDO::PARAM_STR);
        //$specificProfessionalPieces->bindValue($durationParam, PDO::PARAM_STR);
        //$specificProfessionalPieces->bindValue($audienceParam, PDO::PARAM_STR);
     
        $specificProfessionalPieces->execute();
        return $specificProfessionalPieces->fetchAll();
    }
    J'ai laissé les parties commentées au cas où ...

    Merci encore.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    non, tu n'as pas compris le principe.

    Code php : 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
    // -------------
    // Construction de la clause WHERE
    // Initialisation
    $sql_where = [];	// array qui contiendra les bouts de code SQL, à partir des critères de recherche
    $sql_param = [];	// array des paramètres à transmettre à execute(...)
    $clause_WHERE = ''; // clause " WHERE... AND...", qui sera construite "à la volée"$sql_where = [];
    // -------------
    $sql_where[] = " (pt.troop_id LIKE 1) ";
    $sql_where[] = " (p.situation LIKE `Actif`) ";
    // -------------
    if( !empty($_POST['placeChoice']) )
    {
    	$sql_where[] = " (pu.universe_id = :placeChoice) ";
    	$sql_param[':placeChoice'] = $_POST['placeChoice'];
    }
    // -------------
    if( !empty($_POST['gaugeChoice']) )
    {
    	$sql_where[] = " (p.max_gauge = :gaugeChoice) ";
    	$sql_param[':gaugeChoice'] = $_POST['gaugeChoice'];
    }
    // -------------
    if( !empty($_POST['durationChoice']) )
    {
    	$sql_where[] = " (p.duration = :durationChoice) ";
    	$sql_param[':durationChoice'] = $_POST['durationChoice'];
    }
    // -------------
    if( !empty($_POST['audienceChoice']) )
    {
    	$sql_where[] = " (p.audience = :audienceChoice) ";
    	$sql_param[':audienceChoice'] = $_POST['audienceChoice'];
    }
    // -------------
    // On construit la chaine :  "WHERE .... AND .... AND .... "
    $clause_WHERE = ( !empty($sql_where) )? " WHERE " . implode(" AND ", $sql_where) : "";
    Code php : 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
    // -------------
    // Requete SQL
    $req = "SELECT p.id, p.flyer, p.piece_name 
    		FROM piece p INNER JOIN universe u 
    		INNER JOIN piece_universe pu 
    			ON pu.piece_id = p.id  AND u.id = pu.universe_id 
    		INNER JOIN troop t INNER JOIN piece_troop pt 
    			ON t.id = pt.troop_id AND p.id = pt.piece_id ".
    		$clause_WHERE.
    		";";
    // -------------
    $specificProfessionalPieces = $bdd->prepare($req);
    foreach( $sql_param as $param_name => $param_value )
    {
    	$specificProfessionalPieces->bindValue($param_name, $param_value);
    }
    $specificProfessionalPieces->execute();
    return $specificProfessionalPieces->fetchAll();
    // -------------

    Fais un echo $clause_WHERE pour voir ce qu'il contient.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Eternel étudiant
    Inscrit en
    Octobre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Eternel étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Bonjour (ou Re-bonjour d'ailleurs),

    Merci. En fait j'ai bien compris le principe de la concaténation et de l'enrichissement par étape de la variable $clause_WHERE.
    C'est en fait la méthode de construction avec laquelle j'ai des problèmes.

    Par exemple, je ne comprends pas la construction de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $clause_WHERE = (!empty($sql_where) )? " WHERE " . implode(" AND ", $sql_where) : "";
    Le ? après les parenthèses est un vrai mystère pour moi.

    Pour la construction des paramètres, je pensais pouvoir m'abstenir de passer par un foreach, mais j'avais tort !

    Le echo de $clause_WHERE renvoi bien une chaîne de ce type en fonction des critères choisis : WHERE (pt.troop_id LIKE 1) AND (p.situation LIKE `Actif`) AND (pu.universe_id = :placeChoice).

    Un grand Merci !!

    Je vais prendre le temps de la relecture et de la digestion de tout cela ce soir .... avant de passer à la suite.

  8. #8
    Invité
    Invité(e)
    Par défaut
    1-
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $clause_WHERE = (!empty($sql_where) )? " WHERE " . implode(" AND ", $sql_where) : "";

    Il s'agit de l'opérateur ternaire.
    • (condition) ? (action si vrai) : (action si faux)

    Ici, c'est équivalent à :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(!empty($sql_where) )
    {
       $clause_WHERE = " WHERE " . implode(" AND ", $sql_where);
    } else {
       $clause_WHERE = "";
    }

    2-
    Pour la construction des paramètres, je pensais pouvoir m'abstenir de passer par un foreach...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // -------------
    $specificProfessionalPieces = $bdd->prepare($req);
    foreach( $sql_param as $param_name => $param_value )
    {
    	$specificProfessionalPieces->bindValue($param_name, $param_value);
    }
    $specificProfessionalPieces->execute();
    return $specificProfessionalPieces->fetchAll();
    // -------------

    Oui, on peut, en passant l'array des paramètres directement dans le execute() :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // -------------
    $specificProfessionalPieces = $bdd->prepare($req);
    $specificProfessionalPieces->execute( $sql_param );
    return $specificProfessionalPieces->fetchAll();
    // -------------

  9. #9
    Membre à l'essai
    Homme Profil pro
    Eternel étudiant
    Inscrit en
    Octobre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Eternel étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Euh, en fait, quelques heures de sommeil et un peu de relecture ce matin et c'est résolu : problème de "" et de '' et de `` dans la rédaction de la requête.

    Merci ! Merci !!

    Et bonne journée !!!

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 14/11/2019, 09h23
  2. Réponses: 3
    Dernier message: 23/12/2013, 20h39
  3. pb de date jj/mm mm/jj en vba pour traitement sql
    Par bossLINDROS dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/06/2008, 10h39
  4. [SQL] Récupération éventuelle d'une variable pour faire des tests
    Par mougeole dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/05/2006, 13h56
  5. [VB.NET] [SQL] Retour d'un SELECT pour un IF/ELSE
    Par nys_00 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 17/03/2005, 12h50

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