[RESOLU] Le site fonctionne en local mais plus une fois en ligne

!Turlututu!
Invité n'ayant pas de compte PHPfrance

12 janv. 2013, 19:29

Bonjour à tous !

Je réalise un site pour un projet personnel étudiant (site amateur), et je me fais héberger par le serveur de mon école. Le serveur mis à ma disposition a les caractéristiques suivantes : Linux (CentOS 5.2), apache 2, php 5, mysql 5

Le site permet à des étudiants de proposer des offres de cours et à des lycéens/collégiens/leurs parents de choisir parmi ces offres. Seulement, la page qui répertorie les annonces fonctionne très bien en local mais beaucoup moins en ligne.

Le site en local
Image

Le site en ligne
Image

Voici tous mes problèmes :
  • Le pied de page se barre quand je clique sur "Rechercher"
  • Le bouton "Tout afficher" ne fonctionne pas en ligne
  • Le lien "Intéressé ?" n'apparaît pas (ce qui rend mon site inutile...)
Je vous joins également le code source de la page concernée :
<?php session_start(); ?>
<html>

<head>
	<title>Interm'aide</title>
	<link rel="stylesheet" href="design.css" type="text/css" />
	<link rel="icon" type="image/png" href="image/favicon.png" />
</head>

<body>

	<?php 
	if(isset($_SESSION['login'])){
	//L'UTILISATEUR EST CONNECTE
	include('enTeteConnecte.php');
	?>
	
		<section>
		<p>Bienvenue sur la page annonces !</p>
		<?php
		try
				{
					$bdd = new PDO('mysql:host=localhost;dbname=intermaide', 'login', 'mdp');
				}
				catch(Exception $e)
				{
						die('Erreur : '.$e->getMessage());
				}

		//FORMULAIRES DE RECHERCHE
		?>

		<form method="post" action="annonces.php">
		<p>
		<label for='matiereRecherche'>Matière recherchée :</label>
				<select name='matiereRecherche'>
						<option value='Mathématiques'>Mathématiques</option>
						<option value='Physique-Chimie'>Physique-Chimie</option>
						<option value='SVT'>SVT</option>
						<option value='Anglais'>Anglais</option>
						<option value='Allemand'>Allemand</option>
						<option value='Français'>Français</option>
						<option value='Histoire-Géographie'>Histoire-Géographie</option>
						<option value='Autres'>Autres</option>
				</select>
				<br/>
				<label for='niveauRecherche'>Niveau recherché :</label>
				<select name='niveauRecherche'>
						<option value='Collège'>Collège</option>
						<option value='Lycée'>Lycée</option>
				</select>
				<br/><br/>
		<input type='hidden' name='optionAffichage' value='afficherRecherche' size='10' /> 
		<input type='submit' value='Rechercher' class='boutonRecherche' />
		</form>
		<form method="post" action="annonces.php">
		<input type='hidden' name='optionAffichage' value='afficherTout' size='10' /> 
		<input type='submit' value='Tout afficher' class='boutonToutAfficher' />
		</p>
		</form>
		<?php
	
		//L'UTILISATEUR EST-IL UN TUTEUR ?
			$req = $bdd->prepare("SELECT login,statut FROM utilisateurs WHERE login=?");
			$req->execute(array($_SESSION['login']));
				
			$donnees=$req->fetch();

		if($_SESSION['login']==$donnees['login'] && $donnees['statut']=='prof')
			{
			//L'utilisateur est un tuteur, on peut lui proposer de poster une annonce
			?><p><a href='posterannonces.php'>Poster une annonce</a></p><?php
			}
		
		$req->closeCursor();
//////////////////////////////////////////////////////////////////////////
		//AFFICHAGE DES ANNONCES

		if(!isset($_POST['optionAffichage'])){ //Première arrivée sur la page
		$req = $bdd->query('SELECT * FROM annonces');
		}
		elseif($_POST['optionAffichage']=='afficherTout'){ //L'utilisateur a cliqué sur 'Tout afficher'
		$req = $bdd->query('SELECT * FROM annonces');
		}
		elseif($_POST['optionAffichage']=='afficherRecherche'){ //L'utilisateur a effectué une recherche
		$niveauRecherche=$_POST['niveauRecherche'];
		$matiereRecherche=$_POST['matiereRecherche'];
		$req = $bdd->prepare("SELECT * FROM annonces WHERE (matiere1=:matiereRecherche OR matiere2=:matiereRecherche) AND (niveau=:niveauRecherche OR niveau='Collège/Lycée') ORDER BY salaire DESC");
		$req->execute(array('matiereRecherche' => $matiereRecherche,
							'niveauRecherche' => $niveauRecherche));
		}
		
		
		?><ul><?php
		// On affiche toutes les annonces
		while ($donnees = $req->fetch())
		{
			if($donnees['publiable']!=0)
			{
		//On mémorise l'id de l'annonce pour pouvoir la transmettre si un élève est intéressé.
		$annonce=$donnees['id'];
		
		?>
	
		<li><?php echo $donnees['prenom']; ?> <?php echo $donnees['nom']; ?>, cours de <?php echo $donnees['matiere1']; ?>/<?php echo $donnees['matiere2']; ?>, niveau <?php echo $donnees['niveau']; ?>, pour <?php echo $donnees['salaire']; ?>€/h.
			
		<?php
			//L'UTILISATEUR EST-IL UN élève ?
			$req2 = $bdd->prepare("SELECT login,statut FROM utilisateurs WHERE login=?");
			$req2->execute(array($_SESSION['login']));	
			$donnees2=$req2->fetch();

			if($_SESSION['login']==$donnees2['login'] && $donnees2['statut']=='eleve')
				{
				//L'utilisateur est un élève, on peut lui demander s'il est intéressé
				?>
				<a href='detailsannonce.php?annonce=<?php echo $annonce; ?>'>Intéressé(e) ?</a>
				<?php
				}
			$req2->closeCursor();
			}
				
		}		//Fin de la boucle d'affichage des annonces
		?></li></ul><?php
		$req->closeCursor();
		////////////////////////////////////////////FIN DE L'AFFICHAGE DES ANNONCES
		?>
	</section>
	
	<?php
	} //Fin de la condition : Si l'utilisateur est connecté
	else{
	//L'UTILISATEUR N'EST PAS CONNECTE
	include('enTeteDeconnecte.php');
	?>
	
	<section>
		<p>Vous n'êtes pas connecté(e) !</p>
	</section>
	
	<?php 
	}
	
	include('piedDePage.php'); ?>


</body>

</html>
Le fait qu'il ne marche plus subitement lorsque je le mets en ligne est un mystère pour moi. J'espère ne pas avoir fait de doublons avec ce sujet, et je vous remercie d'avance pour vos lumières.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

12 janv. 2013, 20:15

Salut,

Regarde le code source html qui est généré il y a peut être une erreur que tu ne voie pas.


Qu'elles sont les différences de configuration entre les deux serveur ??(version de php, register_globals etc etc)


@+
Il en faut peu pour être heureux ......

!Turlututu!
Invité n'ayant pas de compte PHPfrance

14 janv. 2013, 18:02

Salut !

Quand je clique sur Tout Afficher, j'ai ceci :
<html>

<head>
	<title>Interm'aide</title>
	<link rel="stylesheet" href="design.css" type="text/css" />
	<link rel="icon" type="image/png" href="image/favicon.png" />
</head>

<body>

	<header>
<img src="image/banniereGauche.png" alt="banniereG" />
<img src="image/banniereDroite.png" alt="banniereD" class="banniereD" />
<nav>
	<ul>
		<li><a href='index.php'>Accueil</a></li>
		<li><a href='contact.php'>Contact</a></li>
		<li><a href='responsabilites.php'>Responsabilités</a></li>
		<li><a href='annonces.php'>Annonces</a></li>
	</ul>
</nav>
		
<div id='menuMembre'>
	<form method="post" action="deconnexion.php" class='connexionMembre'>
		<p>Vous êtes connecté(e), eleve. <input type='submit' value='Deconnexion' /></p>
	</form>
</div>
	
</header>
	
		<section>
		<p>Bienvenue sur la page annonces !</p>
		
		<form method="post" action="annonces.php">
		<p>
		<label for='matiereRecherche'>Matière recherchée :</label>
				<select name='matiereRecherche'>
						<option value='Mathématiques'>Mathématiques</option>
						<option value='Physique-Chimie'>Physique-Chimie</option>
						<option value='SVT'>SVT</option>
						<option value='Anglais'>Anglais</option>
						<option value='Allemand'>Allemand</option>
						<option value='Français'>Français</option>
						<option value='Histoire-Géographie'>Histoire-Géographie</option>
						<option value='Autres'>Autres</option>
				</select>
				<br/>
				<label for='niveauRecherche'>Niveau recherché :</label>
				<select name='niveauRecherche'>
						<option value='Collège'>Collège</option>
						<option value='Lycée'>Lycée</option>
				</select>
				<br/><br/>
		<input type='hidden' name='optionAffichage' value='afficherRecherche' size='10' /> 
		<input type='submit' value='Rechercher' class='boutonRecherche' />
		</form>
		<form method="post" action="annonces.php">
		<input type='hidden' name='optionAffichage' value='afficherTout' size='10' /> 
		<input type='submit' value='Tout afficher' class='boutonToutAfficher' />
		</p>
		</form>
		<ul></li></ul>	</section>
	
	 <footer>
	<p>
		Projet personnel INSA<br/>
		INTERM'AIDE<br/>
	</p>
</footer>

</body>

</html>
Et quand je clique sur Rechercher, j'ai ceci :
<html>

<head>
	<title>Interm'aide</title>
	<link rel="stylesheet" href="design.css" type="text/css" />
	<link rel="icon" type="image/png" href="image/favicon.png" />
</head>

<body>

	<header>
<img src="image/banniereGauche.png" alt="banniereG" />
<img src="image/banniereDroite.png" alt="banniereD" class="banniereD" />
<nav>
	<ul>
		<li><a href='index.php'>Accueil</a></li>
		<li><a href='contact.php'>Contact</a></li>
		<li><a href='responsabilites.php'>Responsabilit�s</a></li>
		<li><a href='annonces.php'>Annonces</a></li>
	</ul>
</nav>
		
<div id='menuMembre'>
	<form method="post" action="deconnexion.php" class='connexionMembre'>
		<p>Vous �tes connect�(e), eleve. <input type='submit' value='Deconnexion' /></p>
	</form>
</div>
	
</header>
	
		<section>
		<p>Bienvenue sur la page annonces !</p>
		
		<form method="post" action="annonces.php">
		<p>
		<label for='matiereRecherche'>Mati�re recherch�e :</label>
				<select name='matiereRecherche'>
						<option value='Math�matiques'>Math�matiques</option>
						<option value='Physique-Chimie'>Physique-Chimie</option>
						<option value='SVT'>SVT</option>
						<option value='Anglais'>Anglais</option>
						<option value='Allemand'>Allemand</option>
						<option value='Fran�ais'>Fran�ais</option>
						<option value='Histoire-G�ographie'>Histoire-G�ographie</option>
						<option value='Autres'>Autres</option>
				</select>
				<br/>
				<label for='niveauRecherche'>Niveau recherch� :</label>
				<select name='niveauRecherche'>
						<option value='Coll�ge'>Coll�ge</option>
						<option value='Lyc�e'>Lyc�e</option>
				</select>
				<br/><br/>
		<input type='hidden' name='optionAffichage' value='afficherRecherche' size='10' /> 
		<input type='submit' value='Rechercher' class='boutonRecherche' />
		</form>
		<form method="post" action="annonces.php">
		<input type='hidden' name='optionAffichage' value='afficherTout' size='10' /> 
		<input type='submit' value='Tout afficher' class='boutonToutAfficher' />
		</p>
		</form>
		<ul>	
		<li>Nicolas Romanzin, cours de Physique-Chimie/Math�matiques, niveau Coll�ge/Lyc�e, pour 15�/h.
			
		
Je ne comprends pas pourquoi une partie de mon code disparaît.
Au niveau des versions de PHP, j'ai
Linux (CentOS 5.2), apache 2, php 5, mysql 5
du côté du serveur (ce sont les seules informations qui m'ont été communiquées pour l'instant. En local j'ai les mêmes versions (apache 2.x, php 5.x et mysql 5.x). Je ne vois pas comment faire pour savoir quels sont les statuts des register_globals en local, et ils ne m'ont pas été communiqués pour le serveur.

Merci d'avance pour votre aide.

ViPHP
xTG
ViPHP | 7331 Messages

14 janv. 2013, 21:35

Actives la gestion des erreurs de PDO et fais un echo de l'exception dans le catch pour avoir plus d'informations.
Le register_global ne maltraitera pas le script que tu nous as montré car tu utilises bien l'array $_POST et qu'il ne semble pas y avoir de paramètre en GET.
Le risque de trouver les mêmes index en session me semble nul, et encore plus pour les cookies.

Vu le code retourné l'erreur se trouve au niveau de cette requête :
//L'UTILISATEUR EST-IL UN élève ?
                        $req2 = $bdd->prepare("SELECT login,statut FROM utilisateurs WHERE login=?");
                        $req2->execute(array($_SESSION['login']));     
                        $donnees2=$req2->fetch();
Donc à vérifier que la table existe avec ces deux champs.
Et que la session comporte bien un index login.
Et enfin que la requête retourne un résultat (car un fetch sur du vide ça plante ;) ).

!Turlututu!
Invité n'ayant pas de compte PHPfrance

14 janv. 2013, 22:33

J'ai modifié ma connexion à la base de données grâce à cette page : http://php.net/manual/fr/pdo.error-handling.php
Ca donne ça du coup :
try
				{
					$bdd = new PDO('mysql:host=localhost;dbname=intermaide', 'login', 'mdp');
					$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
				}
		catch (PDOException $e) {
					echo 'Échec lors de la connexion : ' . $e->getMessage();
				}
Seulement rien n'est affiché. Est-ce que j'ai bien activé la gestion des erreurs ?

Pour ce qui est de la table "utilisateurs" j'ai bien vérifié, tout y est. Voici ma base sur le serveur :
Image

J'ai fait un echo du $_SESSION['login'] et il me retourne bien le nom de l'utilisateur connecté, pas de souci avec ça.

Je ne vois pas très bien comment faire pour vérifier que la requête que tu m'as cité retourne un résultat, comment le vérifier ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 janv. 2013, 23:29

salut,

récupérer les infos de la requête :
<?php
$result = $req2->execute(array($_SESSION['login']));
$donnees2=$result->fetch();

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

15 janv. 2013, 01:42

Mon problème initial est résolu !
Je pense que ma deuxième requête ne passait pas car elle était contenue dans la boucle du fetch() de ma première requête. J'ai résolu le problème en supprimant cette deuxième requête et en la remplaçant par une condition simple.

J'ai aussi modifié les requêtes :
$req = $bdd->query('SELECT * FROM annonces');
en
$req = $bdd->prepare('SELECT * FROM annonces');
$req->execute();
ce qui a réglé le problème du bouton 'Tout afficher' et de la première arrivée sur la page (qui devait aussi permettre d'afficher toutes les annonces).

Le problème maintenant, c'est que la fonction "Rechercher" ne fonctionne plus ! En effet, les annonces sont systématiquement toutes affichées, peu importe ce que je rentre dans mon formulaire de recherche !

Le plus étonnant, c'est que dans le code suivant :
<?php                //AFFICHAGE DES ANNONCES
				
                if(!isset($_POST['optionAffichage'])){ //Première arrivée sur la page
                $req = $bdd->prepare('SELECT * FROM annonces');
				$req->execute();
                }
                elseif($_POST['optionAffichage']=='afficherTout'){ //L'utilisateur a cliqué sur 'Tout afficher'
                $req = $bdd->prepare('SELECT * FROM annonces');
				$req->execute();
                }
                elseif($_POST['optionAffichage']=='afficherRecherche'){ //L'utilisateur a effectué une recherche
                $niveauRecherche=$_POST['niveauRecherche'];
                $matiereRecherche=$_POST['matiereRecherche'];
                $req = $bdd->prepare("SELECT * FROM annonces WHERE (matiere1=:matiereRecherche OR matiere2=:matiereRecherche) AND (niveau=:niveauRecherche OR niveau='Collège/Lycée') ORDER BY salaire DESC");
                $req->execute(array('matiereRecherche' => $matiereRecherche,
                                    'niveauRecherche' => $niveauRecherche));
				echo "RECHERCHE niveau : " .$niveauRecherche. " matiere : ".$matiereRecherche;
                }
				
                ?><ul><?php
                // On affiche toutes les annonces
                while ($donnees = $req->fetch())
                {
                        if($donnees['publiable']!=0)
                        {
                //On mémorise l'id de l'annonce pour pouvoir la transmettre si un élève est intéressé.
                $annonce=$donnees['id'];
                ?>
  
                <li><?php echo $donnees['prenom']; ?> <?php echo $donnees['nom']; ?>, cours de <?php echo $donnees['matiere1']; ?>/<?php echo $donnees['matiere2']; ?>, niveau <?php echo $donnees['niveau']; ?>, pour <?php echo $donnees['salaire']; ?>€/h.
                        
                <?php
                        if($statut=='eleve')
                                {
                                //L'utilisateur est un élève, on peut lui demander s'il est intéressé
                                ?>
                                <a href='detailsannonce.php?annonce=<?php echo $annonce; ?>'>Intéressé(e) ?</a>
                                <?php
                                }
                    }               
                }               //Fin de la boucle d'affichage des annonces
                ?></li></ul><?php
                $req->closeCursor(); 
                ?>
                ////////////////////////////////////////////FIN DE L'AFFICHAGE DES ANNONCES
La ligne où j'affiche $matiereRecherche et $niveauRecherche fonctionne parfaitement et se modifie en fonction de ce que je rentre dans mon formulaire. L'erreur étant toujours aussi mystérieuse que la précédente, j'en appelle encore à vous :priere:
Pour moi, mon code devrait marcher à merveilles, sachant que la table annonces contient bien tous les champs nécessaires (id, matiere1, matiere2, niveau, salaire...)

ViPHP
xTG
ViPHP | 7331 Messages

15 janv. 2013, 09:37

Tentes d'exécuter la requête dans phpmyadmin en remplaçant les variables par les valeurs affichées par ton echo.
Et voir si la requête renvoie bien ce que tu souhaites.

Petit nouveau ! | 3 Messages

15 janv. 2013, 14:33

En effet, la requête renvoie bien ce que je veux, quand je l'exécute directement sur phpMyAdmin.

ViPHP
xTG
ViPHP | 7331 Messages

15 janv. 2013, 15:54

Donc cela peut venir d'un souci avec PDO.
Tentes au lieu d'un execute un simple query() en mettant les variable dedans (PDO::quote pour la protection contre l'injection).

Petit nouveau ! | 3 Messages

15 janv. 2013, 17:31

En fait, en remplaçant le "prepare" par "query", j'ai le même problème que précédemment, tout ce qui est après l'instruction fetch() disparaît.

Le problème a été résolu en modifiant les :$variable dans mon instruction par des ? et en listant simplement les variables à remplacer dans le execute().

Merci à tous pour votre aide ! :D

PS : J'ai posté ce sujet en étant déconnecté, comment le marquer comme résolu ? Sinon, laissons juste le sujet couler :P