Menu

Requête non prise en compte dans une page orpheline [Résolu]

Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
- - Dernière réponse : Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
- 10 févr. 2019 à 13:53
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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
24593
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 février 2019
1849
1
Merci
Bonjour
Et le include de ta connexion ??

Au passage.. applique ceci:
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 57187 internautes nous ont dit merci ce mois-ci

Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
15 -
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.
Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
15 -
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.
jordane45
Messages postés
24593
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 février 2019
1849 > Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
-
Ben ...il n'est pas dans le code que tu nous montres....
Donnes ton code COMPLET
Commenter la réponse de jordane45
Messages postés
6329
Date d'inscription
mardi 15 mai 2012
Dernière intervention
17 février 2019
972
1
Merci
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 ?

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 57187 internautes nous ont dit merci ce mois-ci

le père.
Messages postés
6329
Date d'inscription
mardi 15 mai 2012
Dernière intervention
17 février 2019
972 -
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 ?
Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
15 -
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 ?
jordane45
Messages postés
24593
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 février 2019
1849 > Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
-
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);
le père.
Messages postés
6329
Date d'inscription
mardi 15 mai 2012
Dernière intervention
17 février 2019
972 > Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
-
"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".
Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
15 -
Je reconnais mes bêtises, je reconnais tout ce que tu as dis et confirme tout ce que tu as dis.
Commenter la réponse de le père.
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
15
0
Merci
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

?>
jordane45
Messages postés
24593
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 février 2019
1849 -
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 ...
Commenter la réponse de Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
15
0
Merci
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.
Commenter la réponse de Sinistrus
Messages postés
955
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
10 février 2019
15
0
Merci
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 !
Commenter la réponse de Sinistrus