Requête non prise en compte dans une page orpheline

Résolu/Fermé
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 - 8 févr. 2019 à 13:00
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 - 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
A voir également:

5 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
8 févr. 2019 à 13:03
Bonjour
Et le include de ta connexion ??

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

1
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
8 févr. 2019 à 13:09
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
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
8 févr. 2019 à 13:12
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023
8 févr. 2019 à 13:51
Ben ...il n'est pas dans le code que tu nous montres....
Donnes ton code COMPLET
0
Utilisateur anonyme
10 févr. 2019 à 10:18
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
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
Utilisateur anonyme
10 févr. 2019 à 10:40
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
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
10 févr. 2019 à 11:36
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023
10 févr. 2019 à 11:43
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
Utilisateur anonyme > Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023
10 févr. 2019 à 12:27
"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
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
8 févr. 2019 à 13:56
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
8 févr. 2019 à 16:14
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
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
Modifié le 8 févr. 2019 à 23:14
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
10 févr. 2019 à 00:41
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