Petits problèmes de mise en ligne chez OVH

Eléphant du PHP | 57 Messages

24 mai 2011, 10:04

Bonjour à tous,

Alors voilà, je viens de terminer le site pour ma boîte, enfin terminer, presque.
J'ai quelques soucis quant à sa mise en ligne chez OVH.

Tout d'abord, le site dispose d'un système de blog qui peut être alimenté à partir de la partie admin grâce à un formulaire d'ajout d'article. Celui-ci dispose d'un upload de photo qui est par la suite redimensionnée et déplacée. Or, là ca coince, puisque je ne connais pas l'emplacement du dossier tmp chez OVH ( et mon script de redimensionnement le nécéssite).

Deuxième problème, impossible d'accèder à ma partie admin. Mon code qui marchait scrupuleusement bien jusqu'à maintenant en local, plante complètement à la connexion. Voici le code de mon index (page d'accueil de la partie administrateur avec formulaire de connexion), puis d'indexamin (page sur laquelle est redirigé l'utilisateur si la connexion est ok) :
<?php

	require_once('includes/connexion.php');
	echo '<div id="content">';
	include('includes/header.php');

// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
	if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

		// on teste si une entrée de la base contient ce couple login / pass
		$sql = 'SELECT count(*) FROM users WHERE loginUser="'.mysql_escape_string($_POST['login']).'" AND pwdUser="'.mysql_escape_string(md5($_POST['pass'])).'"';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		$data = mysql_fetch_array($req);

		mysql_free_result($req);
		mysql_close();

		// si on obtient une réponse, alors l'utilisateur est un membre
		if ($data[0] == 1) {
			session_start();
			$_SESSION['login'] = $_POST['login'];
			header('Location: indexadmin.php');
			exit();
		}
		// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
		elseif ($data[0] == 0) {
			echo '<div class="echec"><p>Les informations sont erronées.</p></div>';
		}
		// sinon, alors la, il y a un gros problème
		else {
			echo '<div class="echec"><p>Problème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.</p></div>';
		}
	}
	else {
		echo  '<div class="echec"><p>Au moins un des champs est vide.</p></div>';
	}
}
	include("includes/form_connexion.html");
		echo '<br/>';
    include('includes/footer.php');
    echo '</div>';

?>
<?php
	session_start();
	if (!isset($_SESSION['login']))
	{
		header ('Location: index.php');
		exit();
	}
	echo '<div id="content">';
	include('includes/header.php');
	echo '<p> Bonjour <strong> ' .$_SESSION['login']. '</strong> !<br/> Que souhaitez-vous faire ?</p>';
?>

	<div id="bloc">
		</div>
			<ul>
				<li><a href="http://localhost/smtk/admtool/edition/ajoutarticle.php">Ajouter un article</a></li>
				<li><a href="http://localhost/smtk/admtool/edition/editerarticle.php">Editer les articles </a></li>
				<li><a href="http://localhost/smtk/admtool/edition/supprimerarticle.php">Supprimer les articles </a></li>
			</ul>
		</div>
	</div>

	<br/>

<?php
	include('includes/footer.php');
	echo '</div>'
?>
Je n'ai pas trouvé quelque chose de valable ou fonctionnel sur Internet au niveau de ces deux questions, j'espère donc que vous saurez me répondre.
Merci d'avance,
Pauline.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 mai 2011, 12:35

Pour le 1er soucis, sur tout serveur le dossier temporaire est toujours /tmp.
Mais, dans $_FILES, pour chaque fichier, tu as une entrée "tmp_name" qui contient le chemin complet (voir ici). Je ne comprend donc pas pourquoi tu as besoin de cette information :-k

Pour le second problème, il faudrait commencer par nous dire quel est le plantage ... :roll:
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

Eléphant du PHP | 57 Messages

27 mai 2011, 11:20

Bonjour et merci de ta réponse.
Désolé du manque de précisions mais j'avais écris ce message un peu dans la hâte.

Voici donc le problème que j'obtiens lorsque je souhaite me connecter :

Code : Tout sélectionner

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /homez.23/smtkcomm/www/admtool/index.php:1) in /homez.23/smtkcomm/www/admtool/index.php on line 21 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /homez.23/smtkcomm/www/admtool/index.php:1) in /homez.23/smtkcomm/www/admtool/index.php on line 21 Warning: Cannot modify header information - headers already sent by (output started at /homez.23/smtkcomm/www/admtool/index.php:1) in /homez.23/smtkcomm/www/admtool/index.php on line 23
Alors qu'en local cela fonctionne très bien. J'ai lu sur internet qu'il ne devait y avoir aucun espace entre php et session_start(), chose que j'ai faite mais qui n'a rien arrangé.

Voici le code de la page qui est censée s'afficher à le place des message d'erreurs :
<?php
	session_start();
	if (!isset($_SESSION['login']))
	{
		header ('Location: index.php');
		exit();
	}
	echo '<div id="content">';
	include('includes/header.php');
	echo '<p> Bonjour <strong> ' .$_SESSION['login']. '</strong> !<br/> Que souhaitez-vous faire ?</p>';
?>

	<div id="bloc">
		</div>
			<ul>
				<li><a href="http://localhost/smtk/admtool/edition/ajoutarticle.php">Ajouter un article</a></li>
				<li><a href="http://localhost/smtk/admtool/edition/editerarticle.php">Editer les articles </a></li>
				<li><a href="http://localhost/smtk/admtool/edition/supprimerarticle.php">Supprimer les articles </a></li>
			</ul>
		</div>
	</div>

	<br/>

<?php
	include('includes/footer.php');
	echo '</div>'
?>
J'espère donc que vous pourrez m'aider, parce que là je ne vois vraiment pas qu'elle peut être la cause de ce problème.

Concernant mon second petit souci, j'ai en fait le code suivant pour mon upload d'images :
                $nomOrigine = $_FILES['photoArticle']['name'];
		$repertoireOrigine = "c:/wamp/tmp/";
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		$repertoireDestination = "c:/wamp/www/smtk/photos/";
		$nomDestination = "photo".date("YmdHis").".".$extensionFichier;
                [...]
J'ai donc besoin de connaitre l'emplacement du fichier tmp afin de donner une valeur à ma variable $repertoireOrigine.
Cependant,est-ce que je peux mettre à la place :

Code : Tout sélectionner

$_FILES['photoArticle']['tmp_name'];
?

Merci d'avance :mrgreen:

Eléphant du PHP | 57 Messages

27 mai 2011, 12:19

A priori, ce serait ce script qui pose problème :
<?php
	require_once('includes/connexion.php');
	echo '<div id="content">';
	include('includes/header.php');

// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
	if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

		// on teste si une entrée de la base contient ce couple login / pass
		$sql = 'SELECT count(*) FROM users WHERE loginUser="'.mysql_escape_string($_POST['login']).'" AND pwdUser="'.mysql_escape_string(md5($_POST['pass'])).'"';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		$data = mysql_fetch_array($req);

		mysql_free_result($req);
		mysql_close();

		// si on obtient une réponse, alors l'utilisateur est un membre
		if ($data[0] == 1) {
			session_start();
			$_SESSION['login'] = $_POST['login'];
			header('Location: indexadmin.php');
			exit();
		}
		// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
		elseif ($data[0] == 0) {
			echo '<div class="echec"><p>Les informations sont erronées.</p></div>';
		}
		// sinon, alors la, il y a un gros problème
		else {
			echo '<div class="echec"><p>Problème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.</p></div>';
		}
	}
	else {
		echo  '<div class="echec"><p>Au moins un des champs est vide.</p></div>';
	}
}
	include("includes/form_connexion.html");
		echo '<br/>';
    include('includes/footer.php');
    echo '</div>';

?>
Aux lignes 20 et 22, c'est-à-dire les 2 lignes suivantes :

Code : Tout sélectionner

session_start(); header('Location: indexadmin.php');

Code : Tout sélectionner

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /homez.23/smtkcomm/www/admtool/index.php:1) in /homez.23/smtkcomm/www/admtool/index.php on line 20 Warning: Cannot modify header information - headers already sent by (output started at /homez.23/smtkcomm/www/admtool/index.php:1) in /homez.23/smtkcomm/www/admtool/index.php on line 22

ViPHP
ViPHP | 3607 Messages

27 mai 2011, 15:24

Et bien tout est dit!
output started at /homez.23/smtkcomm/www/admtool/index.php:1
Donc ton fichier index.php n'est pas vide de tout espace avant la balise <?php
Pour ce faire si tu es en utf8, tu dois enregistrer tout tes fichiers en utf8 "sans BOM"...
Je te laisse faire des recherches là-dessus ;)

Eléphant du PHP | 57 Messages

31 mai 2011, 11:35

Merci de ta réponse Jojolapine.
J'ai donc bien converti toutes les pages de ma partie administrateur en UTF8 sans BOM.
Le problème ? Maintenant, j'obtiens une erreur en ligne 1 de mon fichier index.php.
J'ai envie de dire... WTF ? :mrgreen:

Code : Tout sélectionner

Parse error: syntax error, unexpected T_REQUIRE_ONCE in /homez.23/smtkcomm/www/admtool/index.php on line 1
Alors que jusqu'à maintenant tout allait très bien. Voici le code de mon index, au cas où :
<?php
	require_once('includes/connexion.php');
	echo '<div id="content">';
	include('includes/header.php');

// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
	if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

		// on teste si une entrée de la base contient ce couple login / pass
		$sql = 'SELECT count(*) FROM users WHERE loginUser="'.mysql_escape_string($_POST['login']).'" AND pwdUser="'.mysql_escape_string(md5($_POST['pass'])).'"';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		$data = mysql_fetch_array($req);

		mysql_free_result($req);
		mysql_close();

		// si on obtient une réponse, alors l'utilisateur est un membre
		if ($data[0] == 1) {
			session_start();
			$_SESSION['login'] = $_POST['login'];
			header('Location: indexadmin.php');
			exit();
		}
		// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
		elseif ($data[0] == 0) {
			echo '<div class="echec"><p>Les informations sont erronées.</p></div>';
		}
		// sinon, alors la, il y a un gros problème
		else {
			echo '<div class="echec"><p>Problème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.</p></div>';
		}
	}
	else {
		echo  '<div class="echec"><p>Au moins un des champs est vide.</p></div>';
	}
}
	include("includes/form_connexion.html");
		echo '<br/>';
    include('includes/footer.php');
    echo '</div>';

?>
Merci d'avance pour ton aide, çà me désespère :|

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

31 mai 2011, 21:44

Salut,


tu doit avoir un caractère qui ne s'affiche pas avant le require_once, supprime les espaces pour voir, sinon utilise un éditeur hexa pour regarder (notepad ++ à un plug in pour cela par exemple).


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

Eléphant du PHP | 57 Messages

01 juin 2011, 13:26

Mince, je ne sais pas ce que j'ai fais, mais maintenant je me retrouve avec les mêmes messages qu'au début, à savoir :

Code : Tout sélectionner

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /homez.23/smtk/www/admin/includes/header.php:7) in /homez.23/smtkcomm/www/admtool/index.php on line 18 Warning: Cannot modify header information - headers already sent by (output started at /homez.23/smtk/www/admin/includes/header.php:7) in /homez.23/smtk/www/admin/index.php on line 20
Cà commence à être vraiment embêtant là.

En fait j'utilise Text Wrangler là, et tout le site à été codé avec Notepad++ et PHPEdit. Est-ce qu'il peut y avoir un problème de compatibilité lié à çà ?

Parce que Text Wrangler me propose trois listes :
  • - Choisir le langage utilisé : par défaut, toutes les pages que j'ouvrais était sur HTML et j'ai tout passé à PHP
  • - Choisir l'encodage : j'ai tout passé de UTF8 à UTF8 sans BOM
  • - Choisir... euh autre chose, à savoir : Classic Mac (CR), Unix (LF), Windows (CRLF) ou Unicode
Quels paramètre dois-je sélectionner pour cette dernière liste ?

Merci d'avance.

Petit edit : Vous trouverez le code mon index.php ci-dessus, et voici le code mon header :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//FR"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<link rel="stylesheet" href="http://www.monsite/admin/style/style.css" media="screen" type="text/css" />
		<!--[if IE]> <link rel="stylesheet" href="www.monsite/admin/style/ie.css" type="text/css" media="screen" /> <![endif]-->
		<title> SMTK - Administration du site</title>
	</head>
	<body>
	<div id="main">
		<div id="header">
		<br/>
			<div id="logo">
				<a name="top"href="http://www.monsite/admin/indexadmin.php">
					<img src="http://www.monsite/admin/style/images/logo.png" alt="logo smtk"></img>
                                        <!-- ici un commentaire -->
				</a>
			</div>
			<div id="menupage">
				<ul>
					<li><a href="http://www.monsite/admin/indexadmin.php">Accueil</a></li>
					<li><a href="http://www.monsite/admin/deconnexion.php">Deconnexion</a></li>
				</ul>
			</div>
		</div>
	<div class="clear"></div> <!-- Annule l'effet flotant -->
Comme vous pouvez le constater, je n'envoie pas les headers HTTP sur mon include "header" puisque celui-ci ne contient que du HTML. Je n'y comprend rien.

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

02 juin 2011, 00:14

heu comment dire ?
- ligne 2 de l'index : echo '<div id="content">'; <= ça c'est du html donc envoi de l’entête au navigateur et début d'affichage
- ligne 3 de l'index : include('includes/header.php'); <= ça, ça inclus une tonne de html
- ligne je sais pas combien de l'index (enfin après l'include header.php) : session_start() <= ouch ça coince entête partie Ligne 2 ....

J'ajouterais qu'au vu des messages d'erreurs les codes fournis ne sont pas complet ;)


si non, avec ton code, c'est normal qu'il y ai des erreurs :mrgreen:


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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

02 juin 2011, 10:45

Bon, plutôt que de rentrer dans de la fustigation de code, surtout que Pauloscorps est visiblement quelqu'un qui n'a pas une grande expérience en PHP, je trouve qu'il serait plus constructif de lui expliquer ce qui ne va pas et comment le corriger.

Donc, Pauloscorps, tu viens de tomber dans un des énormes problèmes de la conf de PHP : sur ton environnement de développement, tu as l'output buffering qui est activé. Ce qui fait que même si tu fait des echo ou que tu as du HTML affiché, il est mis en mémoire tampon et envoyé juste à la fin de l'exécution, ce qui permet de mettre un session_start() après.
Visiblement, chez OVH, l'output buffering est désactivé, et tu vois apparaitre ces erreurs.

La solution de facilité serait de chercher comment le réactiver chez OVH, ça t'éviterais de devoir recoder la moitié de ton site, mais ça reste crade comme solution.
La solution la plus pérenne serait de recoder ce qui ne marche pas en suivant les bonnes pratiques de codage (et donc désactiver l'output buffering sur ton environnement de développement, le temps de les comprendre)
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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

02 juin 2011, 10:48

Ah oui, j'oubliais de répondre à ça :
J'ai donc besoin de connaitre l'emplacement du fichier tmp afin de donner une valeur à ma variable $repertoireOrigine.
Cependant,est-ce que je peux mettre à la place :

Code : Tout sélectionner

$_FILES['photoArticle']['tmp_name'];
?
Tu as tout compris, il est inutile de recréer le chemin là où se trouve ton fichier uploadé, puisque $_FILE['photoArticle']['tmp_name'] contient déjà cette information.
Et c'est même plus sûr puisqu'il est possible de configurer PHP pour que le chemin d'upload ne soit pas /tmp
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