AJAX : problème envoie de variable à PHP

Tyeserel
Invité n'ayant pas de compte PHPfrance

28 janv. 2010, 11:35

Bonjour,

Cela commence à faire un bon moment que je suis dessus.
J'ai créé un code javascript me permettant d'utiliser ajax grace à la classe XMLHttpRequest.

Mon seul problème est que mon code php ne recois pas les variable POST que je lui envoie.
J'ai pensé à une erreur de ma part dans mon code javascript, cependant, Firebug détecte bien l'envoie de mes variables par la méthode POST vers mon script php. De plus, le code php marchais avant que je veuille passer par ajax.

Après avoir chercher toute la journée d'hier, je ne vois vraiment pas d'où pourrait venir mon erreur...


La mini librairy que je me suis créé (lib/javascript.js):
function getXmlHttpRequest () {
	var xhr;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest();
		if (xhr.overrideMineType) {
			xhr.overrideMineType('text/html');
		}
	} else {
		if (window.ActiveXObject) {
			try {
				xhr = new ActiveXObjetct('Msxml2.XMLHTTP');
			} catch(e) {
				try {
					xhr = new ActiveXObjetct('Microsoft.XMLHTTP');
				} catch(e) {
					xhr = null;
				}
			}
		}
	}
	return xhr;
}
function sendRequest(url, data, id) {
	var xhr = getXmlHttpRequest();
	if (xhr != null) {
		xhr.open('POST', url, true);
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-unlencoded');
		xhr.send(data);
		xhr.onreadystatechange = function() {
			try {
				if (xhr.readyState == 4) {
					if (xhr.status == 200) {
						document.getElementById(id).innerHTML = xhr.responseText;
						alert(url + ' --- ' + data + ' --- ' + id);
					} else {
						alert('Ajax error ' + xhr.status);
					}
				}
			} catch(e) {
				alert('Une execption s\'est produite ' + e.description);
			}
		};
	} else {
		alert('La version de votre navigateur ne supporte pas les outils de la technologie Ajax. Veuillez le mettre à jour.');
	}
}

Ma page de login (login.php) :
<?php session_start(); if (isset($_SESSION['utilisateur'])) { header('location:index.php'); } ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
	<head>
		<title> Guyader Intranet - Connexion </title>
		<noscript> <meta http-equiv="refresh" content="0;url=nojavascript.php"> </noscript>
		<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
		<link rel="stylesheet" type="text/css" href="design/login.css"/>
		<link rel="icon" type="image/png" href="image/logo/icon.png"/>
		<script type="text/javascript" src="lib/javascript.js"> </script>
		<script type="text/javascript">
			function sendLoginRequest() {
				sendRequest(
					'exe/login.php',
					'id=' + document.getElementById('id-input').value + '&password=' + document.getElementById('password-input').value,
					'login-result'
				);
				if (document.getElementById('login-result').value == '') {
					window.location.replace('index.php');
				}
			}
			function sendLoginRequestOnKeyUp(event) {
				if (event.keyCode == 13) {
					sendLoginRequest();
				}
			}
		</script>
	</head>
	<body>
		<div id="container">
			<div id="guyader-intranet-logo"> </div>
			<form id="identification">
				<div align="center"> Utilisateur </div>
				<div align="center" > <input class="text-align-center" id="id-input" type="text" onkeyup="javascript:sendLoginRequestOnKeyUp(event);"/> </div>
				<div align="center"> Mot de passe </div>
				<div align="center"> <input class="text-align-center" id="password-input" type="password" onkeyup="javascript:sendLoginRequestOnKeyUp(event);"/> </div>
				<div align="center" class="espace"> </div>
				<div align="center"> <input type="button" value="Connexion" onclick="javascript:sendLoginRequest();"/> </div>
				<div align="center" class="espace"> </div>
				<div align="center" id="login-result"> </div>
			</form>
		</div>
	</body>
</html>
Et finalement ma page de code php qui s'occupe de la connexion de l'utilisateur si son login et password sont valide (exe/login.php), j'y ai rajouté un test pour voir s'il la variable $_POST['id'] existe :
<?php
	//header('Cache-Control: no-cache, must-revalidate');
	//header('content-type:text/plain;charset=utf-8');
	$id = $_POST['id'];
	if (!isset($_POST['id'])) {  // Toujours vrai, d'où mon problème...
		echo 'Variable POST non recu';
	} else {
		$id = $_POST['id'];
		$password = $_POST['password'];
		if ($id == '' || $password == '') {
			$html =  'Veuillez remplir les deux champs pour vous authentifier';
		} else {
			require_once('connexion_db.php');
			$sql_result = mysql_query ('
				SELECT nom, prenom, libelle
				FROM utilisateur, groupe
				WHERE utilisateur.id_groupe = groupe.id
				AND utilisateur.id = "'.$id.'"
				AND mdp = "'.$password.'";
			') or die ('Erreur SQL : ' . mysql_error());
			mysql_close();
			if (mysql_num_rows($sql_result) == 1) {
				require_once('../class/utilisateur.php');
				$fetch_result = mysql_fetch_row($sql_result);
				session_start();
				$_SESSION['sessionId'] = session_id();
				$_SESSION['utilisateur'] = new Utilisateur($id,$fetch_result[1],$fetch_result[2],$fetch_result[3]);
			} else {
				$html = 'Erreur d\'authentification';
			}
		}
		echo $html;
	}
?>
En gros ca me retourne toujours le message "Variable POST non recu".

Je n'utilise pas de librairy javascript style jQuery, Prototype ou autre car j'aimerai savoir faire ca moi même en comprenant mon code à 100%.

Merci d'avance.
Modifié en dernier par Tyeserel le 28 janv. 2010, 15:39, modifié 1 fois.

Mammouth du PHP | 661 Messages

28 janv. 2010, 13:49

fait un test :

avant les header et autre place
echo "tableau _POST :";
print_r($_POST);
echo "\n tableau _GET :";
print_r($_GET);
die();
coté requete, dès la reception des données fait alert(xhr.responseText); ...

et regarde déja si il se passe quelque chose

Tyeserel
Invité n'ayant pas de compte PHPfrance

28 janv. 2010, 15:25

Merci pour cette réponse plutôt rapide.

J'ai fait ce que tu m'a dit. Cela me rend deux tableaux vides :

Tableau POST : Array()
Tableau GET : Array()

Ça confirme bien que je ne reçois rien, cependant je le répète, l'envoie en POST semble avoir été effectué (bisarre me direz vous...).

Rapport de Firebug :
POST http://localhost/[...]/exe/login.php 200 OK 44ms
Sources : id=test_id&password=test_password
Je travail avec un XAMPPLITE et Firefox 3.6 si ca a de l'importance.
Je commence à me demander si c'est pas dû à la configuration du serveur. Serait-ce possible ?

Edit: j'ai essayé sur WAMP ca marche pas non plus... faut avouer que c'était une tentative désespéré.

Tyeserel
Invité n'ayant pas de compte PHPfrance

28 janv. 2010, 18:35

Je suis dégouté, c'était un problème de cache du navigateur...

Le code est bon.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

01 févr. 2010, 14:09

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton Image en haut à droite de la réponse qui te semble la plus pertinente.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer