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 :

Ma requête fonctionne avec des valeurs mais ni avec des paramètres ni avec des variables [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut Ma requête fonctionne avec des valeurs mais ni avec des paramètres ni avec des variables
    Bonjour à tous et joyeuses fêtes.

    J'ai une clause WHERE qui ne fonctionne pas avec des paramètres ou des variables. Si je remplace mes variables par leurs valeurs (var_dump de la ligne 4), la requête fonctionne.
    Avec les valeurs en dur, j'obtiens deux lignes de base de données, avec les variables ma requête ne retourne aucune ligne (test lignes 15 à 18).
    Voici mon code:
    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
    37
    function searchFathers($childId, $childName='', $childBirthdate=null, $fatherMinAge=null, $fatherMaxAge=null) {
    	global $db;
    	//if (! isset($fatherMinAge, $fatherMaxAge) return false;
    	var_dump($childId, $childName, $childBirthdate, $fatherMinAge, $fatherMaxAge);
     
    	$where = [];
    	$where[] = "id_abo=:id_abo AND id!=:id AND gender='M'";
    	$where[] = "((death_date > :childBirthdate - INTERVAL 11 MONTH) OR death_date IS NULL)";
    	if (isset($fatherMinAge, $fatherMaxAge))
    		$where[] = "birth_date BETWEEN (:childBirthdate - INTERVAL :fatherMaxAge YEAR) AND (:childBirthdate - INTERVAL :fatherMinAge YEAR)";
    	if ($childName)
    		$where[] = "last_name=:last_name";
    	$strWhere = implode(" AND ", $where);
    	$strWhere = "WHERE $strWhere";
    	// Pour test :
    	//$strWhere = "WHERE id_abo=1 AND id!=$childId AND gender='M' AND ((death_date > '$childBirthdate' - INTERVAL 11 MONTH) OR death_date IS NULL) AND birth_date BETWEEN ('$childBirthdate' - INTERVAL $fatherMaxAge YEAR) AND ('$childBirthdate' - INTERVAL $fatherMinAge YEAR) AND last_name='$childName'";
    	$strWhere = "WHERE id_abo=1 AND id!=88 AND gender='M' AND ((death_date > '2000-01-01' - INTERVAL 11 MONTH) OR death_date IS NULL) AND birth_date BETWEEN ('2000-01-01' - INTERVAL 55 YEAR) AND ('2000-01-01' - INTERVAL 19 YEAR) AND last_name='Démo'";
    	var_dump($strWhere);
     
    	$query = "
    		SELECT id, last_name, first_name, middle_name, birth_date, death_date
    		FROM dat_persons
    		$strWhere
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id_abo', $_SESSION['user']['id_abo']);
    	$result->bindParam('id', $childId);
    	$result->bindParam('childBirthdate', $childBirthdate);
    	if ($childName)
    		$result->bindParam('last_name', $childName);
    	if (isset($fatherMinAge, $fatherMaxAge)) {
    		$result->bindParam('fatherMinAge', $fatherMinAge);
    		$result->bindParam('fatherMaxAge', $fatherMaxAge);
    	}
    	$result->execute();
    	return $result->fetchAll();
    }
    Pour info, il s'agit dans une application de généalogie de rechercher les pères probables en fonction de différents paramètres dont leur âge à la naissance de l'enfant.

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

    1- Les "placeholders ont des ":" ( ... = :id_abo ).
    Il faut en faire autant pour les bindParam : (pas forcément obligatoire, mais assurément plus "propre" / clair)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$result->bindParam(':id_abo', ...);

    2- On peut en effet omettre les accolades pour un if (avec une seule instruction).
    Mais il est préférable de TOUJOURS les mettre si on ne veut pas de mauvaise surprise...

    3-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		$where[] = "((death_date > :childBirthdate - INTERVAL 11 MONTH) OR death_date IS NULL)";
     
    		$where[] = "birth_date BETWEEN (:childBirthdate - INTERVAL :fatherMaxAge YEAR) AND (:childBirthdate - INTERVAL :fatherMinAge YEAR)";
    Tu as 3 fois :childBirthdate.
    Je ne suis pas sûr que ça puisse fonctionner : il faut les différencier (:childBirthdate / :childBirthdate2 par exemple)
    A VERIFIER ! (possible que ça fonctionne quand même)

    4- Si ça ne marche pas avec les variables.... VERIFIE les variables !
    Dernière modification par Invité ; 31/03/2018 à 17h22.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Rien à dire sur tes points 1 et 2.
    Pour le point 3, ça marche après correction du point 4
    Pour le point 4, j'ai effectivement une erreur sur les variables de date au format européen au lieu du format SQL.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/03/2018, 12h16
  2. Réponses: 2
    Dernier message: 19/09/2016, 22h40
  3. [XL-2010] Calcul recherchev avec petite.valeur mais sans #N/A
    Par chipster62 dans le forum Excel
    Réponses: 5
    Dernier message: 20/06/2016, 12h00
  4. [PHP 5.3] Boucle avec 6 valeurs mais 2 identiques maximum
    Par Dsphinx dans le forum Langage
    Réponses: 2
    Dernier message: 20/12/2011, 15h10
  5. Réponses: 0
    Dernier message: 20/07/2010, 11h11

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