Requête non prise en compte dans une page orpheline

Résolu
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -  
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

Le titre peut paraître bizarre mais bon, je suis face a une situation qui fonctionne en lien direct mais ne fonctionne pas lors d'un appel d'un site extérieur.

Je m'explique :
Un site extérieur fait appel à une page de mon site
ipn.php
dans laquelle j'ai des fonctions PHP.
Dans une des fonctions, je fais appel à un
include("_mail.php");
. Cette page est bien lue lors de la vérification du site extérieur.
Seulement, dans cette page j'ai ceci :
<?php 
$MY_REFR = "BC007";
$Stat = $pdo->query("SELECT 
		R.NIC_Handle,
      		R.Reference,
		U.NIC_Handle,
		U.Phone_1
FROM 		tb_shop_recap R
LEFT JOIN 	tb_user U ON U.NIC_Handle = R.NIC_Handle 
WHERE R.Reference='".$MY_REFR."' "); while($data = $Stat->fetch(PDO::FETCH_ASSOC)){
?>
...
<?php echo $data["Email"]; ?>
...
<?php } ?>

J'ai mis des espions partout, dans la page
ipn.php
et dans la page
_mail.php

Le script est lu et s'arrête "dans" le
while
, là où il doit afficher
echo $data["Email"]
.
Donc tout ce qui est dans le
while
est obsolète.

Je n'arrive pas a comprendre pourquoi, et même lorsque je faire un
try{}
je n'obtiens aucune erreur SQL.

Cependant, si je lance directement la page
_mail.php
dans mon navigateur, le
while
est lu.

Pouvez-vous me conseiller svp ?
Merci d'avance

Configuration: Windows / Firefox 65.0

5 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    Bonjour
    Et le include de ta connexion ??

    Au passage.. applique ceci:
    https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

    1
    1. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
       
      Bonjour Jordane,

      le include de ma connexion est correct.
      Lorsque je lance la page depuis le navigateur, il affiche bien la valeur souhaitée.
      Je regarde ton lien.
      0
    2. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
       
      Je n'ai pas de changement a faire au niveau de la récupération des erreurs, tout va bien de ce côté, le
      try{}
      est bien mis en place sur ma page.
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831 > Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention  
         
        Ben ...il n'est pas dans le code que tu nous montres....
        Donnes ton code COMPLET
        0
  2. Utilisateur anonyme
     
    Bonjour

    Ta requête n'est pas vraiment une requête préparée : le bindParam que tu fais est bidon, puisque le :MY_REFR n'apparaît nulle part dans ta requête. Mais ça m'étonnerait que ce soit la cause du problème.

    Tu parles de résultats différents donnés par ton site et par un "site extérieur". Il faudrait préciser certaines choses. D'abord, tu te plains au départ de _mail.php dont le comportement diffère selon la manière de l'appeler, mais le code que tu donnes est celui de _sms_echec.php. C'est le même problème ?
    Je suppose que le ipn.php est la partie de ton site qui appelle ce fichier : peux-tu donner la partie du code du site extérieur qui fait appel à ce même fichier ?
    1
    1. Utilisateur anonyme
       
      Au passage
      "aucun code omis"
      Ce n'est pas vrai. Dans le code que tu montres, la fonction transactionGeneralFailure n'est jamais appelée. On ne peut donc pas voir l'affichage de "Échec de transaction générale". Si tu donnes des informations inexactes, tu ne risques pas d'avoir de bonnes réponses.
      0
    2. Utilisateur anonyme
       
      En relisant ma réponse…

      Te rends-tu compte que ton include("_sms_echec.php"); dans lequel tu fais ton SELECT vient APRES l'effacement (ligne 16 de ipn.php) ? Tu cherches des informations dans un enregistrement que tu viens d'effacer ?
      Et ça marche quand tu fais ça depuis ton site ?
      0
    3. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
       
      Bonjour le père,

      - Aucun code omis utile à mon problème parce que de ce côté là tout va bien.
      - le problème du SELECT a résolu le problème. je faisais la suppression et tentais de récupérer les valeurs... tu as mis dans le mie.
      Je crois que j'ai vraiment besoin de congés...

      Merci à Jordans45 et à toi le père pour votre aide.

      Je n'avais jamais fais de requête préparée pour le SELECT auparavant, tu dis que le code est bidon, pourquoi ?
      0
    4. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831 > Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention  
       
      Par ce qu'il faut utiliser une variable nommée ( avec les : devant ) et pas directement la variable php.
      Comme ceci :
      SELECT 
      R.NIC_Handle, R.Reference, 
      U.NIC_Handle, U.Email, U.Nom, U.Prenoms, U.Civilite 
      FROM tb_shop_recap R 
      LEFT JOIN tb_user U ON U.NIC_Handle = R.NIC_Handle 
      WHERE R.Reference= :MY_REFR ";
      ");
      $Stat->bindParam(':MY_REFR', $MY_REFR);
      $Stat->execute();
      $data_rep = $Stat->fetch(PDO::FETCH_ASSOC);
      
      0
    5. Utilisateur anonyme > Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention  
       
      "Aucun code omis utile à mon problème" Ça n'est pas la même chose que "Aucun code omis" tout court. Et comme tu ne comprends pas d'où vient ton problème, comment sais-tu que ce que tu ne mets pas n'a pas de rapport avec ton problème ?
      Jordane t'a montré comment il fallait vraiment faire la requête préparée.
      Ne me demande pas pourquoi j'ai écrit que ton bind_param, relis ce que j'avais écrit en te le disant. Il n'y a pas de :MY_REFR dans ta requête : à quoi peut bien servir un bind_param sur :MY_REFR ? Et que ce soit une requête SELECT ou pas n'a aucun rapport : le rôle de bind_param reste exactement le même. Et tu en as déjà fait.
      J'ai l'impression que tu l'as rajouté uniquement parce que Jordane t'a recommandé d'utiliser des requêtes préparées et que le bind_param, ça fait "requête préparée".
      0
  3. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    Voici ma page config.php
    <?php
    define("MYSQL_HOST", "***");
    define("MYSQL_BASE", "***");
    define("MYSQL_USER", "***");
    define("MYSQL_PASS", "***");
    define("MYSQL_PORT", "***");
    // Connexion PDO
    try
    	{
    	$pdo = new PDO('mysql:host='.MYSQL_HOST.';port='.MYSQL_PORT.';dbname='.MYSQL_BASE, MYSQL_USER, MYSQL_PASS);
    	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    	$pdo->exec("SET CHARACTER SET utf8");
    	}
    
    catch(PDOException $e){echo "<div class='alert alert-warning'>".$e->getMessage()."</div>";	die();}
    
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    ?>


    Et voici la page en question :
    <?php
    include_once($_SERVER['DOCUMENT_ROOT']."/includes/config.php");
    
    // Espion lu
    
    try{$Stat = $pdo->query("SELECT 
    		R.NIC_Handle,
          		R.Reference,
    		U.NIC_Handle,
    		U.Phone_1
    FROM 		tb_shop_recap R
    LEFT JOIN 	tb_user U ON U.NIC_Handle = R.NIC_Handle 
    WHERE R.Reference='".$MY_REFR."' ");
    
    // Espion lu
    
    while($data = $Stat->fetch(PDO::FETCH_ASSOC)){
    
    	// Espion non lu											 
    
    }}catch(PDOException $e){echo "<div class='alert alert-danger'>".$e->getMessage()."</div>";}
    
    // Espion lu
    
    ?>
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
       
      Donc
      A la place d'un INCLUDE .. utilises un REQUIRE_ONCE

      A la place d'un $pdo->query
      utilise des requêtes préparées

      Si le souci persiste... reviens nous voir avec les éventuels messages d'erreur.....

      Bien entendu tu auras également activé l'affichage des erreurs PHP ...
      0
  4. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    J'ai mis un
    require_once
    , j'ai fais une
    requête préparée
    , j'ai ajouté les
    erreurs PHP
    :
    <?php
    ini_set('display_errors', 1);
    ini_set('log_errors', 1);
    ini_set('error_log', dirname(__FILE__) . '/log_error_php.txt');
    error_reporting(E_ALL);
    
    try{$Stat = $pdo->prepare("SELECT R.NIC_Handle, R.Reference, U.NIC_Handle, U.Email FROM tb_shop_recap R LEFT JOIN tb_user U ON U.NIC_Handle = R.NIC_Handle WHERE R.Reference='".$MY_REFR."'");
    $Stat->bindParam(':NIC_Handle', $NIC_Handle);
    $Stat->bindParam(':Email', $Email);
    $Stat->execute();
    $data = $Stat->fetch(PDO::FETCH_ASSOC);
    
    echo $data["NIC_Handle"]."<br>";
    echo $data["Email"]."<br>";
    echo $MY_REFR."<br>";
    
    }catch(PDOException $e){echo $e->getMessage(); print_r($data);}
    ?>


    Je n'ai aucun message d'erreur, sauf que sur cette page, je n'ai aucun résultat (c'est vide) :
    echo $data["NIC_Handle"]."<br>";
    echo $data["Email"]."<br>";
    echo $MY_REFR."<br>";


    Pourtant sur cette même page, si je l'ouvre avec le navigateur, j'ai un résultat.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
     
    Rrrrraaaahhhh ! ça me prends la tête !!!

    ipn.php
    <?php
    require_once($_SERVER['DOCUMENT_ROOT']."/includes/config.php");
    require_once($_SERVER['DOCUMENT_ROOT']."/modules/sms/smsenvoi.php");
    
    ini_set('display_errors', 1);
    ini_set('log_errors', 1);
    ini_set('error_log', dirname(__FILE__) . '/log_error_php.txt');
    error_reporting(E_ALL);
    
    function transactionGeneralFailure($pdo, $data) {
    $MY_REFR = $data->Reference;
    $MY_NUMB = $data->MSISDN;
    $MY_AMNT = $data->Amount;
    
    // Ici le code fonctionne depuis l'appel du site extérieur
    $Fact_SU = $pdo->exec("DELETE FROM tb_shop_recap WHERE Reference='".$MY_REFR."' ");
    $Fact_BC = $pdo->exec("INSERT INTO tb_shop_BC (NIC_Handle, Libelle_TAG, Quantite) SELECT NIC_Handle, Libelle_TAG, Quantite FROM tb_shop_FA WHERE tb_shop_FA.Reference = '".$MY_REFR."' ");
    $Fact_FA = $pdo->exec("DELETE FROM tb_shop_FA WHERE Reference='".$MY_REFR."' ");
    
    echo "Échec de transaction générale";
    include("_sms_echec.php");
    }

    _sms_echec.php
    <?php
    $user  = NULL;
    
    try{$Stat = $pdo->prepare("
    SELECT 
    R.NIC_Handle, R.Reference, 
    U.NIC_Handle, U.Email, U.Nom, U.Prenoms, U.Civilite 
    FROM tb_shop_recap R 
    LEFT JOIN tb_user U ON U.NIC_Handle = R.NIC_Handle 
    WHERE R.Reference='".$MY_REFR."'
    ");
    $Stat->bindParam(':MY_REFR', $MY_REFR);
    $Stat->execute();
    $data_rep = $Stat->fetch(PDO::FETCH_ASSOC);
    
    if($data_rep["Civilite"] == "Masculin") {$user = "M. ".$data_rep["Nom"]." ".$data_rep["Prenoms"];}
    if($data_rep["Civilite"] == "Féminin") {$user = "Mme ".$data_rep["Nom"]." ".$data_rep["Prenoms"];}
    if($data_rep["Civilite"] == "Male") {$user = "Mr ".$data_rep["Nom"]." ".$data_rep["Prenoms"];}
    if($data_rep["Civilite"] == "Female") {$user = "Mrs ".$data_rep["Nom"]." ".$data_rep["Prenoms"];}
    
    echo "[".$data_rep["NIC_Handle"]."]";
    echo "(".$data_rep["Email"].")";
    echo "{".$MY_REFR."}";
    echo "/".$user."/";
    
    }catch(PDOException $e){echo "<div class='alert alert-danger'>".$e->getMessage()."</div>"; print_r($data_rep);}
    ?>

    Résultat donné par le site extérieur :
    Échec de transaction générale[](){BC19000043}//


    Test de la requête dans phpmyadmin :
    NIC_Handle 	Reference 	NIC_Handle 	Email 	Nom 	Prenoms 	Civilite
    AA32938 BC19000041 AA32938 email@yahoo.fr SNOW John Masculin


    Test de l'ouverture de la page _sms_echec.php depuis mon site :
    [AA32938](email@yahoo.fr){BC19000043}/M. SNOW John/

    Voici tout ce que contient mes pages... aucun code omis.
    Je ne comprends toujours pas pourquoi il n'affiche rien !
    0