Page 1 sur 1

header php incompréhensible...

Posté : 18 janv. 2012, 13:35
par Steph79
Bonjour, je redirige grâce à 'header' après des if imbriqués. Les deux premier if se déroulent correctement, mon soucis vient du troisième...

Dans le troisième je fais appel à une table Mysql. Si je mets mon paramètre en dur dans la fonction, pas de soucis, le header fonctionne correctement. Si j'utilise un paramètre de la fonction alors le header s'active quoiqu'il arrive!! Pour tant dans tous les cas et si je commenta la ligne header, le if fonctionne tout à fait correctement!

Là j'avoue que je suis plutôt perdu... PHP ne me renvoie, de plus, aucune erreur... Voici le code :

La fonction de lecture de la BD :

Code : Tout sélectionner

function ident_BD($utilisateur,$machine,$domaine) { global $bdd; $sql = "SELECT * FROM user WHERE User_login = '".$utilisateur."'"; //$sql = "SELECT * FROM user WHERE User_login = 'STMAI791'"; $result = $bdd->connexion->prepare($sql); $result->execute(); $result = $result->fetchAll(); if($result[0]['User_login'] != '') { foreach ($result as $row) { $bd['Utilisateur'] = $row['User_login']; $bd['Nom'] = $row['User_nom']; $bd['Prenom'] = $row['User_prenom']; $bd['Service'] = $row['User_service']; $bd['niveau'] = $row['Habil_id']; $bd['machine'] = $machine; $bd['domaine'] = $domaine; $bd['Valid'] = "ok"; return $bd; } } }
La page de code :

Code : Tout sélectionner

<div id="corps"> <?php if($_GET['appl']) { if(in_array(detect_NAV(),$liste)) { if(ident_NTLM()) { $tab = ident_NTLM(); $tab2 = ident_BD($tab['Utilisateur'],$tab['Machine'],$tab['Domaine']); $use = $tab2['Utilisateur']; if($use!='') { echo '<pre>'; print_r($tab2); echo '</pre>'; } // C'est celui ci qui me 'harcèle'... else{header("Location:./gestion/rapport_dir.php?err=bd");exit();} } else {header("Location:./gestion/rapport_dir.php?err=ntlm");exit();} } else { $nav = detect_NAV(); header("Location:./gestion/rapport_dir.php?err=nav&nav=$nav"); exit(); } } ?> </div>
Merci de me donner votre avis sur le sujet... :cry:

Amicalement, Stéphan

Re: header php incompréhensible...

Posté : 18 janv. 2012, 20:14
par moogli
salut,

deux choses :
- tu ne gère pas les cas où tu ne rentre pas dans la=es case (clairement que ce passe t'il s'il n'y a pas de gens correspondant ? y a pas de return $user === null reste a voir si null != '' (ce qui me parait plausible ;) ).
- Il ne doit pas y avoir d'affichage avant un header (a moins que tu utilise la buffeurisation de sortie, auquel cas je comprend que ton code puisse fonctionner ;) )

commente les exit(); et affiche le contenu des variables en ajoutant des var_dump() un peux partout histoire de suivre ton code ;)


@+

Re: header php incompréhensible...

Posté : 19 janv. 2012, 07:47
par Steph79
Salut Moogli, d’abord merci de ta réponse.

Pour ce qui est du cas 'null', il est traité mais pas dans le code fournit ici. Pour ce qui est des exit, ça a déjà été fait...

Il n'y a pas d'affichage avant les 'headers', là n'est pas mon soucis d'ailleurs... Je n'ai pas de soucis avec le 'header' à proprement parlé. :?

En fait, le code fonctionne correctement mais seulement si dans le code ci-dessous, je met en dur le user dans la requête utilisateur (Ligne commentée dans le code). Là le 'header' rentre en service uniquement si le user n'est pas le bon, sinon il affiche bien les data. A partir du moment ou j'utilise la variable dans la requête 'sql', le 'heade'r redirige quoi qu'il arrive... Précision, la fonction est dans un fichier séparé appelé par un 'require' en début de la page de traitement. :x

Code : Tout sélectionner

function ident_BD($utilisateur,$machine,$domaine) { global $bdd; $sql = "SELECT * FROM user WHERE User_login = '".$utilisateur."'"; //$sql = "SELECT * FROM user WHERE User_login = 'STMAI791'"; $result = $bdd->connexion->prepare($sql); $result->execute(); $result = $result->fetchAll();
Je ne comprend pas ta remarque sur l'affichage avant le 'header', il n'y en a dans mon code que si le 'header' n'est pas concerné... :?:

Je vais faire des tests ce matin, je posterai les résultats des 'var_dump()'.

Stéphan

Re: header php incompréhensible...

Posté : 19 janv. 2012, 10:03
par xTG
Ce que veux dire moogli c'est qu'un else ne s'exécute pas tout seul.
Donc c'est que ta condition travaille sur un jeu de données donnant ce résultat.
Et donc pour vérifier tu fais un echo différent pour chaque if/else et tu commentes les header() tout en affichant les données de la condition à respecter pour rentrer dans ce cas là.
Tu remarqueras tout de suite que la condition est bien validée (ou non dans le cas d'un else) mais l'affichage des données de comparaison te mettront sur la voie. :)

Re: header php incompréhensible...

Posté : 19 janv. 2012, 11:42
par Steph79
Bonjour, oui je sais bien qu'un 'else' ne s'exécute pas tout seul...

Voila, j'ai revu l'ensemble du code et toujours la même chose... Vraiment je suis à la ramasse sur ce coup... :oops:

Voici le code :

Le fichier général (Dans sa totalité) :

Code : Tout sélectionner

<!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8" /> <title>Essais</title> <meta name="author" content="Stéphan MAITRE"> </head> <?php require_once '../../auth/config/conf_inc.php'; require_once SECU.'kernel/fonctions.php'; ?> <body> <div id="conteneur"> <header><h2>Portail d'accés aux applications sécurisées</h2></header> <div id="corps"> <?php if(isset($_GET['appl'])) { if(in_array(detect_NAV(),$liste)) { // ici on passe bien, le navigateur est détecté et comparé à une liste blanche ($liste) if(ident_NTLM()) { // ici on passe bien, les valeurs NTLM sont bien retransmisent (Tableau) $tabNtlm = ident_NTLM(); // La fonction ident_BD() est située dans le fichier fonctions.php inclut en début de de ce fichier $tabBd = ident_BD($tabNtlm['Utilisateur'],$tabNtlm['Machine'],$tabNtlm['Domaine']); if($tabBd == null) { echo '<pre>'; echo 'KO<br />'; var_dump($tabBd); echo '</pre>'; // Si on commente le prochain header, tout se passe trés bien et les dump sont ok // Si on decommente (Et que l'on supprime les 4 lignes ci dessus...), on redirige quelque soit le retour de la fonction (tableau ou null!) !!! Les exit ne changent rien au problème... header("Location:./gestion/rapport_dir.php?err=bd");exit(); } elseif(is_array($tabBd)) { echo '<pre>'; echo 'OK<br />'; var_dump($tabBd); echo '</pre>'; } } else {header("Location:./gestion/rapport_dir.php?err=ntlm");exit();} } else { $nav = detect_NAV(); header("Location:./gestion/rapport_dir.php?err=nav&nav=$nav"); exit(); } } ?> </div> <footer>&copy; Stéphan MAITRE - 2012/2014</footer> </div> </body> </html>
La fonction :

Code : Tout sélectionner

function ident_BD($utilisateur,$machine,$domaine) { global $bdd; $sql = "SELECT * FROM user WHERE User_login = '".$utilisateur."'"; $result = $bdd->connexion->prepare($sql); $result->execute(); $result = $result->fetchAll(); if($result) { if($result[0]['User_login'] != '') { foreach ($result as $row) { $bd['Utilisateur'] = $row['User_login']; $bd['Nom'] = $row['User_nom']; $bd['Prenom'] = $row['User_prenom']; $bd['Service'] = $row['User_service']; $bd['niveau'] = $row['Habil_id']; $bd['machine'] = $machine; $bd['domaine'] = $domaine; $bd['Valid'] = "ok"; return $bd; } } else {return null;} } else {return null;} }
Dans l'attente... d'une :idea:

Re: header php incompréhensible...

Posté : 19 janv. 2012, 11:53
par Steph79
Voici les 'duump' (Sans le header):

En utilisant la variable issue de NTLM :
C'est Ok ! :)

Code : Tout sélectionner

OK array(8) { ["Utilisateur"]=> string(8) "STMAI791" ["Nom"]=> string(6) "MAITRE" ["Prenom"]=> string(7) "Stephan" ["Service"]=> string(12) "Informatique" ["niveau"]=> string(1) "0" ["machine"]=> string(8) "CS003791" ["domaine"]=> string(8) "DOMNA791" ["Valid"]=> string(2) "ok" }
En remplaçant la variable NTLM dans l'appel à la fonction soit par :
  • Une valeur vide
  • Une valeur erronée
Le résultat du dump est le même (Ce qui est normal) :)

Code : Tout sélectionner

KO NULL
Voila, voila... :cry:

Re: header php incompréhensible...

Posté : 19 janv. 2012, 12:52
par xTG
Essaies avec un triple égal pour la comparaison du null.

Et aussi dans ta fonction tu as un test qui n'a aucun sens :
if($result[0]['User_login'] != '')
Tu as vraiment un n-uplet user où le User_login est vide ?

Re: header php incompréhensible...

Posté : 19 janv. 2012, 13:30
par Steph79
Salut,

le triple '===' ne change rien au problème... :cry:

Oui je peux avoir un n-uplet vide, certain comptes ne sont pas des comptes utilisateurs. D’où le contrôle semblant inutile.

La ça marche :
if($tabBd === null)
{
	echo '<pre>';
		echo 'KO<br />';
		var_dump($tabBd);
	echo '</pre>';
}
La ça marche plus...
if($tabBd === null)
{
	header("Location:./gestion/rapport_dir.php?err=bd");exit();
}

Re: header php incompréhensible...

Posté : 19 janv. 2012, 14:55
par xTG
Quand tu dis que cela ne marche plus...
C'est la redirection qui ne se fait pas ou bien l'echo du else qui s'affiche ? :shock:

Re: header php incompréhensible...

Posté : 19 janv. 2012, 15:04
par Steph79
Pour faire simple, si je supprime le header, tout fonctionne! On affiche donc la partie voulue.
Par contre si je supprime la partie d'affichage la remplaçant par le header, la plus de condition... On redirige que la variable testée soit null ou non ...

Re: header php incompréhensible...

Posté : 19 janv. 2012, 15:52
par xTG
Cela n'a aucun sens, il doit y avoir un comportement que tu nous décris mal.
Ou bien une interaction extérieure que tu ne prends pas en compte. Ou même l'ordre de tes tests.
Ou une redirection de redirection ?
Remplaces tes redirections vers un nouveau fichier où tu fais juste un var_dump($_GET) ainsi pas possibilité de conflit externe.

Et au passage :
$sql = "SELECT * FROM user WHERE User_login = '".$utilisateur."'";
$result = $bdd->connexion->prepare($sql);   
$result->execute();
Une requête préparée dans ton cas ne sert à rien et de plus tu l'utilise mal.
$sql = "SELECT * FROM user WHERE User_login = ".$bdd->quote($utilisateur);
$result = $bdd->query($sql);
Conviendrait dans ton cas.

Et pour l'utilisation de requête préparée c'est comme ça :
$sql = "SELECT * FROM user WHERE User_login = ?";
$result = $bdd->connexion->prepare($sql);   
$result->execute(array($utilisateur));
Bon pis il y a encore l'histoire du SELECT * qui est mal...

Re: header php incompréhensible...

Posté : 19 janv. 2012, 16:08
par Steph79
Et bien si mon ami, cela a du sens!! =;
Cela dit tu n'avais pas toutes les données du problème....

En fait le code fourni ne pose aucun soucis... L'erreur venait du tableau fournit par l'authentification NTLM... :D

En dissociant cette fonction et en passant par deux fichiers séparés, plus de soucis tout est nickel!!
Pour ce qui est du SQL, le code posté n'est pas le code utilisé... Ne t'inquiète pas pour mes requêtes préparées, elles sont bonnes!! :langue:

Merci pour l'aide, à bientôt

Stéphan