PHP - MySQL - JavaScript - AJAX : Problèmes

Résolu/Fermé
Signaler
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
-
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
-
Bonjour,
je suis en stage actuellement, et je dois réaliser un formulaire en php (application Web).
Aillant pratiquement fini l'application, je me suis tourné vers la résolution des problèmes, mais je bloque sur 4 d'entre eux.

1- Dans un formulaire, j'utilise une liste remplis dynamiquement par ma DB, elle marche très bien, mais elle pose problème au niveau de l'affichage des accents, ceux-ci sont remplacé par un ? Ma DB et mes pages ont le même charset (UTF-8), mon navigateur est aussi en UTF-8. De plus, je ne rencontre ce problème que pour ma liste, sinon, les accents apparaissent normalement.

2- Je rencontre un autre problème avec cette liste. C'est en fait une liste liée en AJAX, la première liste est directement codé sur la page, quand à la deuxième c'est celle qui est remplis dynamiquement par ma DB. Jusque la, tout va bien. C'est après où ça merde. En effet, je peux faire un choix dans la première liste, et la deuxième affiche les choix disponible par rapport à la première. Mais si je change le choix de la première, la deuxième merde. Je me retrouve avec une liste ne proposant qu'une ligne blanche (un exemple pour vous éclairer => https://i55.servimg.com/u/f55/11/55/60/96/exempl10.jpg

3- Dans une page où je fais un récapitulatif des données de la DB, je fais une alerte JavaScript qui récapitule tout ce que contient la ligne choisi. Mais cette alerte est complété avec le résultat d'une requète MySQL, cependant certains résultats contiennent des quotes, donc je cherche un moyen pour les echapper, car elles empèchent l'affichage de l'alerte. (Elle marche très bien dans les cas où il n'y a pas de quotes dans le résultat de la requète.

4- Le récapitulatif est présenté sous forme de tableau. Sur la page, j'ai un menu à gauche (celui-ci à la propriété position: fixed; en CSS) et le tableau à droite donc. Mais il dépasse de la page, donc pour voir les données en dehors de la page, il faut le faire défiler de droite à gauche. Cependant il passe au-dessus du menu. Je cherche donc un moyen pour qu'il sois délimité par le menu. (En gros, je souhaite que le bord gauche du tableau disparraise lorsqu'il dépasse une certaine zone) J'avais pensé aux frames HTML et aux pseudo-frames PHP, mais ça n'a pas marché (ou c'est moi qui suis pas doué)

Voila, en espérant avoir une solution ^^

19 réponses

Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
CSS Tu met:
.menu
{
	width: 180px;
	position: fixed;
	top: 0px;
	left: 0px;
	height: 100%;
	background-color: #FDEDC1;
	z-index: 2;
}

.sMenu
{
	margin-left: 19px;
	margin-top: 54px;
}

HTML tu met:
<div class="menu">
	<div class="sMenu">
	<p id="mtitle">Menu</p>
	<p><a href="formulaire.php?id_eleve=0&modification=0">Ajouter un nouvel inscrit</a><br><br>
	<a href="export.php">Exporter</a></p>
	</div>
</div>


Si j'ai bien compris le 2/ n'est pas réglé?
2
Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
document.getElementById('diplome').innerHTML = di;
=>
document.getElementById('diplomeDiv').innerHTML = di;

Et

<div id='diplome' style='display:inline'>
=>
<div id='diplomeDiv' style='display:inline'>


Au premier essaie, il va ecrire le select, dans le "truc" qui porte l'id "diplome", donc pas de soucis, il met le select dans le div.
Mais après, quand tu changes, il veut écrire le select dans le "truc" qui porte l'id "diplome" mais le problème c'est que le div a cette id, mais le select mis précédemment aussi, donc il ne sait pas le quel choisir!
2
Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
1- Essaie de mettre, au moment où tu remplis la liste, un utf8_encode() ou decode si cela ne marche pas
2- J'aimerais bien voir le code pour t'aider..
3- addslashes() en php
4- J'aimerais bien voir la page également ;o
0
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Alors le code de la page formulaire.php (je l'ai épuré de tout ce qui ne touchais pas au problème.)

<?
include 'connect.inc';
echo "<html>
<head>
       <link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" title=\"style\" href=\"style.css\" />
	   <script type='text/javascript'>
			function getXhr(){
				var xhr = null;
					if(window.XMLHttpRequest){
						xhr = new XMLHttpRequest();
					}
					else if(window.ActiveXObject){
						try {
							xhr = new ActiveXObject(\"Msxml2.XMLHTTP\");
						} catch (e) {
							xhr = new ActiveXObject(\"Microsoft.XMLHTTP\");
						}
					}
					else {
						alert(\"Navigateur inapte\");
						xhr = false;
					}
				return xhr;
			}
			//Fonction du bouton
			function change(){
				var xhr = getXhr();
				//Action défini par la réponse
				xhr.onreadystatechange = function(){
					//alert(xhr.readyState);
					//Si tout OK
					if(xhr.readyState == 4 && xhr.status == 200){
						//alert(xhr.responseText);
						di = xhr.responseText;
						document.getElementById('diplome').innerHTML = di;
					}
				}
				//Methode POST
				xhr.open(\"POST\",\"diplomeselect.php\",true);
				//à ne pas oublier
				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
				//ne pas oublier de poster les arguments (ici domaine/discipline/niveau (ddn))
				code_ddn = document.getElementById('ddn').options[document.getElementById('ddn').selectedIndex].value;
				xhr.send(\"code_Ddn=\"+code_ddn);
				//alert(code_ddn);
			}
		</script>
</head>
<body>
	<div id=\"formulaire\">
	<fieldset class=\"form\">
		<legend>Saisie des étudiants pour les salons</legend>
		<form method=\"post\" action=\"#\" name=\"tata\" id=\"tata\">
			<p><label for=\"souhait\">Choix des études suivis : (Domaine-Discipline-Niveau)</label><br>
				<select name='ddn' id='ddn' onchange='change()'>
					<optgroup label=\"Droit, Economie, Gestion\">
						<optgroup label=\">Droit, Sciences Politiques\">
							<option value=\"101L\">Licence</option>
							<option value=\"101M\">Master</option>
							<option value=\"101D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Sciences Economiques - Gestion (hors AES)\">
							<option value=\"102L\">Licence</option>
							<option value=\"102M\">Master</option>
							<option value=\"102D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Administration Economique et Social (AES)\">
							<option value=\"103L\">Licence</option>
							<option value=\"103M\">Master</option>
							<option value=\"103D\">Doctorat</option>
						</optgroup>
					</optgroup>
					<optgroup label=\"Arts, Lettres, Langues\">
						<optgroup label=\">Lettres - Sciences du langage - Arts\">
							<option value=\"204L\">Licence</option>
							<option value=\"204M\">Master</option>
							<option value=\"204D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Langues\">
							<option value=\"205L\">Licence</option>
							<option value=\"205M\">Master</option>
							<option value=\"205D\">Doctorat</option>
						</optgroup>
					</optgroup>
					<optgroup label=\"Sciences, Technologie, Santé\">
						<optgroup label=\">Sciences et Structures de la Matière (SSM)\">
							<option value=\"307L\">Licence</option>
							<option value=\"307M\">Master</option>
							<option value=\"307D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Sciences et Technologie/ Sciences pour l'Ingénieur (SPI)\">
							<option value=\"308L\">Licence</option>
							<option value=\"308M\">Master</option>
							<option value=\"308D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Sciences de la Nature et de la Vie (SNV)\">
							<option value=\"309L\">Licence</option>
							<option value=\"309M\">Master</option>
							<option value=\"309D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Médecine\">
							<option value=\"311L\">Licence</option>
							<option value=\"311M\">Master</option>
							<option value=\"311D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Odontologie\">
							<option value=\"312L\">Licence</option>
							<option value=\"312M\">Master</option>
							<option value=\"312D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Pharmacie\">
							<option value=\"313L\">Licence</option>
							<option value=\"313M\">Master</option>
							<option value=\"313D\">Doctorat</option>
						</optgroup>
					</optgroup>
					<optgroup label=\"Sciences Humaines et Sociales\">
						<optgroup label=\">Sciences Humaines et Sociales (SHS)\">
							<option value=\"406L\">Licence</option>
							<option value=\"406M\">Master</option>
							<option value=\"406D\">Doctorat</option>
						</optgroup>
						<optgroup label=\">Sciences et Techniques des Activités Physiques et Sportives (STAPS)\">
							<option value=\"410L\">Licence</option>
							<option value=\"410M\">Master</option>
							<option value=\"410D\">Doctorat</option>
						</optgroup>
					</optgroup>
				</select>
				<br />
				<div id='diplome' style='display:inline'>
				</div>
			</p>
			<input type=\"submit\" class=\"submit\" value=\"Envoyer\" />
		</form>
	</fieldset>
	</div>
	</body>
</html>";
?>


Et le code de la page diplomeselect.php:

<?php
	echo "<select name='diplome' id='diplome'>";
	if(isset($_REQUEST["code_Ddn"])){
		mysql_connect("localhost","root","");
		mysql_select_db("salon");
		$res = mysql_query("SELECT code_diplome,libelle FROM diplome_info WHERE code_ddn='".$_REQUEST["code_Ddn"]."' ORDER BY code_ddn");
		if (mysql_num_rows($res)>0)
		{
			echo "<option value='-1'>Choix du diplome</option>";
			while($row = mysql_fetch_assoc($res)){
					echo "<option value='".$row["code_diplome"]."'>".$row["libelle"]."</option>";
			}
		}
		else
		{
			echo "<option value='-1'>Faîtes un choix.</option>";
		}
	}
	echo "</select>";
?>


Je te fais un deuxième post pour le 4, histoire que ce soit claire.
Sinon, j'avais essayé encode, mais ça n'avais rien changé, je vais essayer decode pour voir.
Et sinon, j'avais pas du tout pensé a addslashes() ^^"
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Voici la page du recapitulatif.

<?
include 'connect.inc';
$affichage = "SELECT id_eleve, nom, prenom, date_naissance, email, universite, libelle FROM eleve NATURAL JOIN diplome_info ORDER BY id_eleve DESC";
$result_table = mysql_query($affichage);
//echo $result_table;
$nlignes = mysql_num_rows($result_table);
//echo $nlignes;

echo "<html><head>
       <link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" title=\"style\" href=\"style.css\" />
</head><body>

<script language=\"javascript\">
code = prompt('Entrez le mot de passe. Vous avez 1 seul essais... Attention, respecter les majuscules et les minuscules','Entrer le mot de passe ici');
if (code != \"test\")//Mot de passe
{
location.href=\"formulaire.php\";//redirection en cas de mauvais mot de passe.
}
</script>

<div class=\"menu\">
<p id=\"mtitle\">Menu</p>
<p><a href=\"formulaire.php?id_eleve=0&modification=0\">Ajouter un nouvel inscrit</a><br><br>
<a href=\"export.php\">Exporter</a></p>
</div>
<br>
<div class=\"tableaureca\">
<fieldset id=\"recap\">
	<legend>Tableau des inscrits aux salons</legend>
	<table border=\"1\" id=\"table\">\n
	<tr id=\"headt\">
		<td>Nom</td>
		<td>Prenom</td>
		<td>Date de naissance</td>
		<td>Email</td>
		<td>Détail</td>
		<td>Modifier</td>
		<td>Supprimer</td>
	</tr>";
	for($i=0;$i<$nlignes;$i++)
		{
			echo "<tr>";
			$ligne = mysql_fetch_row($result_table);
			echo "<td>{$ligne[1]}</td>
				<td>{$ligne[2]}</td>
				<td>{$ligne[3]}</td>
				<td>{$ligne[4]}</td>
				<td><button type=\"button\" onclick=\"JavaScript: alert(";
				echo "'Nom : ".$ligne[1]." \\nPrénom : ".$ligne[2]." \\nDate de naissance : ".$ligne[3]." \\nEmail : ".$ligne[4]." \\nUniversité actuelle : ".$ligne[5]." \\nDiplôme souhaité : ".$ligne[6]."'";
				echo ")\"><img src=\"little-loupe.png\" alt=\"Détail\" border=\"0\"/></button></td>
				<td><a href=\"formulaire.php?id_eleve=$ligne[0]&modification=1\" class=\"buttonform\"><img src=\"little-modifier.png\" alt=\"Modifier\" border=\"0\"/></a></td>
				<td><a href=\"formulaire.php?id_eleve=$ligne[0]&modification=2\" class=\"buttonform\"><img src=\"little-supprimer.png\" alt=\"Supprimer\" border=\"0\"/></a></td>";
			echo "</tr>\n";
		}
	echo "</table>
</fieldset>
</div>
</body>
</html>";
?>


et le css qui est lié au positionnement...:

.menu
{
	width: 180px;
	position: fixed;
	top: 54px;
	left: 19px;
}

#mtitle
{
	font-size: large;
	text-decoration: underline;
	font-weight: bolder;
}

.tableaureca
{
	width: 600px;
	position: absolute;
	top: 30px;
	left: 240px;
}

#recap
{
	width: 590px;
}

#table
{
	text-align: center;
	margin: 10px;
	font-weight: bold;
	color: #AD592C;
	font-size: 15px;
}
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Triple post tant qu'à faire...

Donc j'ai essayer avec decode, ça me mettais une erreur.
Mais j'ai un collègue qui m'as trouvé une solution avec encode et manip dans la DB, ce qui marche pour l'instant.


Et pour les addslashes, ça marche du tonnerre ^^

En espérant que tu puisse m'aider pour la suite.

Merci Tiller et merci d'avance au cas où ;)
-1
Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
Euuuh, y'aurais moyen de voir les pages en ligne (Pour le 4)? ^^''
Voir la page pour voir le bug au moins, j'arrive pas trop a imaginé.
Pour le 2:
Remplace tes $_REQUEST["code_Ddn"] par $_POST["code_Ddn"]
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Hum, le problème, c'est qu'elles sont pas en lignes. C'est une applacation PHP sur clé USB...

Je vais voir si je peux en faire une archive et te l'envoyer ce soir.


En attendant, je vais faire la modif (j'avais récupérer un script avec REQUEST, ça marchais, j'ai pas modifié ^^)

EDIT: pas de différence visible...
-1
Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
Ok merci, t'as cas me l'envoyer en PV
Quelques conseils:
<?php
[...]
echo "<html><head>
[...]
[...]
</html>";
?>

Tu te fais super chier comme sa, tu dois faire gaffe aux accents etc.. le mieu:
<?php
[...]
?>
<html><head>
[...]
[...]
</html>
<?php
[...]
?>


Ensuite:
if (code != \"test\")//Mot de passe

N'importe qui (ou presque) peut casser cette vérification... c'est vraiment sécurité 0
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Pour le premier, je sais que c'est super chiant, mais j'avais commencé comme ça, car c'était une petite application à la base (environ 300 lignes de code) mais mon chef me donnait le travail par petit bout, et j'ai utilisé l'application comme base.
Au final, j'ai pris l'habitude pour cette appli de faire attention au code, donc je continu comme ça.


Pour le mot de passe, pour ce qu'il sert c'est largement suffisant. Même sans, l'application serais livrable, c'est une petite sécutité pour faire "beau".
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Merci, ça marche.

Sinon, effectivement, le 2 n'est pas réglé.
J'ai essayé en modifiant divers morceaux de codes, mais rien n'a changé (sauf en pire).

Mais c'est pas grave si tu ne peux pas m'aider, j'ai encore jusqu'au 2 septembre pour trouver la solution ^^
-1
Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
//alert(xhr.responseText);

Décommente cette ligne
Remplace ta page PHP par sa:
<?php
foreach ($_POST as $k -> $v)
{
    echo $k.' => '.$v."\r\n";
}
?>

Sa alert quoi sur la page? Tu la vois ta variable?
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Voila l'alerte

<br />
<b>Fatal error</b>: Cannot access empty property in <b>E:\_web.zmwsc\Salon\diplomeselect.php</b> on line <b>2</b><br />


Sur la page, c'est exactement la même chose que l'alerte...
-1
Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
ok, le probleme vient donc de ton AJAX qui n'envoi pas la variable.
Je me demande si ce n'est pas:
xhr.send(\"?code_Ddn=\"+code_ddn);
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Pourtant, lorsque je fais un choix, une première fois, ma deuxième liste s'affiche correctement.
Mais si je modifie le choix de la première liste, c'est la où ma deuxième liste foire. Donc il doit bien y avoir un envoi de variable.
J'ai bien supposé que ma liste envoyai la variable une première fois, mais la deuxième, elle renvoyais une erreur, mais j'ai pas trouvé comment cela était possible... Et encore moins comment résoudre le problème.
-1
Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
Huuum, c'est bizarre, chez moi le code marche bien...
http://tillersama.hd.free.fr/CCM/azertyuiop/f.php
-1
Messages postés
781
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
14 septembre 2008
213
Aaaaaaaahhhh mon dieu qu'on est con.

J'aurais du le voir dessuite -_-
Tu innerHTML, dans le div qui a pour id "diplome" OR, le select que tu récupères en ajax, son id, bah c'est aussi "diplome"..
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
Euh, oui, la je dois être très con ^^,
car moi je vois pas l'erreur, ou du moins, quoi changer :(
-1
Messages postés
553
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
6 août 2010
42
God save The Tiller

ça marche impec', vraiment, merci ^^
Tu es vraiment d'une grande aide ;)

Bon, bha maintenant je me retrouve au chômage technique, jusqu'au retour de mon chef :D
-1