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 recherche d'un enregistrement ne donne pas le résultat attendu


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Ma recherche d'un enregistrement ne donne pas le résultat attendu
    Bonjour,

    J'ai la fonction suivante:
    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
    function getDefaultPersonId(int $userId): false|array
    {
    	$db = dbConnect();
    	var_dump($userId);		// 2
     
    	$sql = <<<SQL
    SELECT a.id
    FROM dat_addresses a
    	INNER JOIN dat_families f
    		ON a.id=f.id_address
    WHERE id_user=:userId AND relation=0
    ORDER BY f.familyname, f.firstname
    LIMIT 1
    SQL;
    	$stmt = $db->prepare($sql);
    	$stmt->execute([':userId'=>$userId]);
    	return $stmt->fetch();
    }
    Cette fonction me renvoie le tout premier enregistrement de la table (avec a.id =1) comme si la clause ORDER BY n'existait pas.
    Si dans Wampserver, je fais la même requête en remplaçant uniquement le paramètre par sa valeur c'est à dire WHERE id_user=:userId AND relation=0 par WHERE id_user=2 AND relation=0, j'obtiens bien la réponse attendue, c'est à dire l'id de l'enregistrement dont le nom et le prénom sont les premiers dans l'ordre alphabétique. Si je fais la même chose dans ma fonction, j'obtiens toujours 1 au lieu de l'id voulu.
    J'ai aussi essayé de préciser l'ordre de tri comme ceci: ORDER BY f.familyname ASC, f.firstname ASC mais la réponse reste la même c.à.d 1.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 338
    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 338
    Billets dans le blog
    17
    Par défaut
    Je ne repère pas de problème évident ici.

    Montre-nous comment tu utilises getDefaultPersonId()

    Et donne-nous le retour exact de var_dump($userId);


    ----

    PS : si tu utilises des alias de table, utilise-les systématiquement pour toutes tes colonnes, autrement ton code risque d'être instable en cas d'évolution de ton schéma

    Ex. (sûrement à corriger) :

    WHERE f.id_user=:userId AND a.relation=0

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

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Appel de la fonction getDefaultPersonId:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $id = $_GET['idMain'] ?? getDefaultPersonId($_SESSION['user']['id']);
    $id = (int) $id;
    var_dump($id);					// retourne int 1
    var_dump($_SESSION['user']['id']);		// retourne int 2
    La clause WHERE devient: WHERE a.id_user=:userId AND f.relation=0. Cette correction ne modifie pas le retour et le problème reste inchangé.
    Petite question: quel code utilises-tu pour encadrer une ligne?

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 338
    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 338
    Billets dans le blog
    17
    Par défaut
    Par défaut PDOStatement::fetch() retourne un tableau ou false.

    $id = $_GET['idMain'] ?? getDefaultPersonId($_SESSION['user']['id']);
    $id = (int) $id;
    Ici tu convertis l'éventuel retour de getDefaultPersonId() (tableau ou false) en int.

    Il faut que tu simplifies ton script et que tu vérifies étape par étape.

    Pour l'encadré il faut utiliser le bbcode pre (préformatage)

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

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci. Effectivement, s'agissant d'un tableau (int) renvoie 1. Je ne vois pas à quoi correspond ce 1 (je pense que c'est l'équivalent booléen d'existence du tableau).
    J'ai remplacé mon code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if( $default = getDefaultPersonId($_SESSION['user']['id']) )
    	$id = $_GET['idMain'] ?? $default['id'];
    else
    	// redirection vers création d'un premier enregistrement
    	header('Location: index.php');		// LIGNE A TERMINER AVEC ?page=...
    $id = (int) $id;

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 338
    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 338
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par moimp Voir le message
    Effectivement, s'agissant d'un tableau (int) renvoie 1. Je ne vois pas à quoi correspond ce 1 (je pense que c'est l'équivalent booléen d'existence du tableau).
    Cela revient à faire (int)['foo'] => 1 (int)
    J'observe que (int)[] => 0 (int)

    Mais concernant le transtypage vers du int la doc dit pour les tableaux (entre autres) :

    From other types ¶
    Caution
    The behaviour of converting to int is undefined for other types. Do not rely on any observed behaviour, as it can change without notice.
    https://www.php.net/manual/en/langua...nteger.casting

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

Discussions similaires

  1. un left join ne me donne pas le résultat attendu
    Par kikidrome dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 05/12/2008, 16h58
  2. [If] Test de condition ne donne pas le résultat attendu
    Par Moktar19 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2008, 14h52
  3. Réponses: 2
    Dernier message: 11/12/2006, 19h46
  4. Réponses: 5
    Dernier message: 03/11/2006, 13h23
  5. Concaténation ne donne pas le résultat attendu
    Par artotal dans le forum Langage
    Réponses: 4
    Dernier message: 12/05/2006, 01h37

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