[RESOLU] Erreur php que je comprends pas

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Erreur php que je comprends pas

Re: Erreur php que je comprends pas

par Carpediem » 19 janv. 2014, 01:14

Bonsoir,

Je reviens vous donner quelques nouvelles. J'ai abandonné la réalisation du compteur. J'ai opté pour une solution toute prête genre xiti. J'envoi la maj de mon site dans une semaine ou deux, je verrais bien si ces solutions sont viables.

A bientôt :D

Re: Erreur php que je comprends pas

par Carpediem » 13 janv. 2014, 18:23

Bonsoir,

Merci pour vos remarques, concernant le commentaire je l'ai mis vite fait pour que vous compreniez un peu ce que souhaite quand je post mes messages, ca reste mieux que erreur dans le formulaire =). J'ai regardé, je ne trouve vraiment pas. Je retransmets le code avec les petites modifs.

Cordialement
<?php

function get_ip() {

	// IP si internet partagé
	if (isset($_SERVER['HTTP_CLIENT_IP'])) {
		return $_SERVER['HTTP_CLIENT_IP'];
	}
	// IP derrière un proxy
	elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
		return $_SERVER['HTTP_X_FORWARDED_FOR'];
	}
	// Sinon : IP normale
	else {
		return (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '');
	}
}

// Si le script est lancé depuis index.php alors on continue
if ($_SERVER['PHP_SELF'] == 'index.php') {

$ip=get_ip();

$timestamp=time();

	// On initialise notre etat à erreur, il sera changé à "ok" si la vérification des variables est un succès, sinon il reste à erreur
	$etat = "erreur"; 

	// trim()  enlève les espaces en début et fin de chaine
	if (isset($ip)) 
  
  {
  
  $ip=trim(htmlspecialchars($ip));
  
  }
  
  if (isset($timestamp)) 
  
  {
  
  $timestamp=trim(htmlspecialchars($timestamp));
  
  } 

  // Test sur timestamp
  if (!is_numeric($timestamp)) { 
		// On met dans erreur le message qui sera affiché
		$erreur="Le timestamp ne contient pas que des chiffres..."; 
	}
  // On vérifie si l'adresse ip est sous la bonne forme
	elseif (!preg_match('#^([0-9]{1,3}\.){3}[0-9]{1,3}$#', $ip)){
    // On met dans erreur le message qui sera affiché 
		$erreur="Votre adresse ip n'est pas correct";
	}
	// Si toutes les vérifs sont valides, on change l'état à ok
	else { 
		$etat="ok";
    }
}


if ($etat=="ok"){ 
  
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

        $res = $bdd->query('SELECT * FROM total_visiteur WHERE ip = "'.$ip.'"');
        $requete = $res->fetch(PDO::FETCH_ASSOC);
        $return = $res->fetch();
        
if($return['timestamp']+ 86400 > $timestamp)
    {
     // Si le timestamp correspondant à l'adresse IP est dans la bdd depuis moins de 24h, on ne fait rien
    }
    
else {

    // Sinon quelque soit le résultat de la requête, on ajoute en bdd l'adresse ip ainsi que le timestamp actuel

    try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

$req = $bdd->prepare ('INSERT INTO total_visiteur(ID, ip, timestamp) VALUES(:ID, :ip, :timestamp)');
$req->execute(array(
    'ID' => NULL,
    'ip'=>$ip,
    'timestamp'=>$timestamp));
}    
    
    }
              
              
elseif ($etat=="erreur"){ 
		// On affiche le message correspondant à l'erreur mais sans concaténer toutes les erreurs relevés, seule une d'elle apparaitra
		echo "<h4>$erreur</h4>" ;
	}
  
else {
    // Suivant d'où vient le visiteur ou si une erreur s'est produite, on ne fait rien
}

	?>
Je continue à chercher et je vous tient au courant

Re: Erreur php que je comprends pas

par sirakawa » 13 janv. 2014, 10:29

je n'aime pas ces if sans délimiteurs:
if (isset($timestamp)) $timestamp=trim(htmlspecialchars($timestamp));
Je trouve que c'est plus clair ainsi;
if (isset($timestamp)) 
{
     $timestamp=trim(htmlspecialchars($timestamp));
}
D'accord ça ne résoud rien.
L'erreur est avant le moment où elle est signalée
au passage, les tests sur le timestamp sont totalement inutiles.
N'y aurait-il pas une accolade en trop?
Il seait plus simple de mettre le test sur l'ip dans la fonction et de retourner un array("ip"=>$ip, "valide" => TRUE);
enfin étonnant message:
$erreur="Votre adresse ip n'est pas correct, elle doit être sous la forme 127.0.0.1";
Je suppose que ça veut dire que le script est appelé à partir d'une adresse non autorisée; dans ce cas il ne faut pas signaler comment on devrait avoir fait mais simplement qu'on n'a rien à faire ici.

Re: Erreur php que je comprends pas

par Carpediem » 12 janv. 2014, 23:47

Bonsoir,

Merci pour la petite erreur de syntaxe relevée =). Malgré tout mon code ne fonctionne pas. Je l'ai refais en un peu plus propre car j'avais trouvé des incohérences et puis je n'avais changé les commentaires vu que le script vient d'un de mes formulaires. Pour apporter un peu plus de précision à mon problème, l'erreur se situe ligne 34 et j'ai beau changé mon code faire des retours à la ligne dans le code ou se que vous voulez, l'erreur est toujours ligne 34. Dans le code ci dessous la ligne 34 c'est le commentaire //test sur timestamp, je comprends vraiment pas, merci encore à ceux qui peuvent m'aider.
<?php

// Si le script est lancé depuis index.php alors on continue
if ($_SERVER['PHP_SELF'] == 'index.php') {

function get_ip() {

	// IP si internet partagé
	if (isset($_SERVER['HTTP_CLIENT_IP'])) {
		return $_SERVER['HTTP_CLIENT_IP'];
	}
	// IP derrière un proxy
	elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
		return $_SERVER['HTTP_X_FORWARDED_FOR'];
	}
	// Sinon : IP normale
	else {
		return (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '');
	}
}

$ip=get_ip();

$timestamp=time();

	// On initialise notre etat à erreur, il sera changé à "ok" si la vérification des variables est un succès, sinon il reste à erreur
	$etat = "erreur"; 

	// trim()  enlève les espaces en début et fin de chaine
	if (isset($ip)) $ip=trim(htmlspecialchars($ip));
  
  if (isset($timestamp)) $timestamp=trim(htmlspecialchars($timestamp)); 

  // Test sur timestamp
  if (!is_numeric($timestamp)) { 
		// On met dans erreur le message qui sera affiché
		$erreur="Le timestamp ne contient pas que des chiffres..."; 
	}
  // On vérifie si l'adresse ip est sous la bonne forme
	elseif (!preg_match('#^([0-9]{1,3}\.){3}[0-9]{1,3}$#', $ip)){
    // On met dans erreur le message qui sera affiché 
		$erreur="Votre adresse ip n'est pas correct, elle doit être sous la forme 127.0.0.1";
	}
	// Si toutes les vérifs sont valides, on change l'état à ok
	else { 
		$etat="ok";
    }
}


if ($etat=="ok"){ 
  
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

        $res = $bdd->query('SELECT * FROM total_visiteur WHERE ip = "'.$ip.'"');
        $requete = $res->fetch(PDO::FETCH_ASSOC);
        $return = $res->fetch();
        
if($return['timestamp']+ 86400 > $timestamp)
    {
     // Si le timestamp correspondant à l'adresse IP est dans la bdd depuis moins de 24h, on ne fait rien
    }
    
else {

    // Sinon quelque soit le résultat de la requête, on ajoute en bdd l'adresse ip ainsi que le timestamp actuel

    try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

$req = $bdd->prepare ('INSERT INTO total_visiteur(ID, ip, timestamp) VALUES(:ID, :ip, :timestamp)');
$req->execute(array(
    'ID' => NULL,
    'ip'=>$ip,
    'timestamp'=>$timestamp));
}    
    
    }
              
              
elseif ($etat=="erreur"){ 
		// On affiche le message correspondant à l'erreur mais sans concaténer toutes les erreurs relevés, seule une d'elle apparaitra
		echo "<h4>$erreur</h4>" ;
	}
  
else {
    // Suivant d'où vient le visiteur ou si une erreur s'est produite, on ne fait rien
}

	?>
Cordialement

Re: Erreur php que je comprends pas

par moogli » 12 janv. 2014, 22:57

salut,

tu as une erreur de syntaxe ligne 28 un ] à la place d'une )

if (isset($ip]) => if (isset($ip))

@+

Erreur php que je comprends pas

par Carpediem » 12 janv. 2014, 20:22

Bonjour et bonne et heureuse nouvelle année à toute et à tous,

Voici mon souci, j'ai ce message d'erreur qui s'affiche : Parse error: syntax error, unexpected T_TRY in C:\wamp\www etc......

à cause de ce code :
<?php

// Si le script est lancé depuis index.php alors on continue
if ($_SERVER['PHP_SELF'] == 'index.php') {

function get_ip() {

	// IP si internet partagé
	if (isset($_SERVER['HTTP_CLIENT_IP'])) {
		return $_SERVER['HTTP_CLIENT_IP'];
	}
	// IP derrière un proxy
	elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
		return $_SERVER['HTTP_X_FORWARDED_FOR'];
	}
	// Sinon : IP normale
	else {
		return (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '');
	}
}

$ip=get_ip();

$timestamp=time();

	// On initialise notre etat à erreur, il sera changé à "ok" si la vérification du formulaire est un succès, sinon il reste à erreur
	$etat = "erreur"; 
	// On récupère les champs du formulaire, et on arrange leur mise en forme
	// trim()  enlève les espaces en début et fin de chaine
	if (isset($ip])) $ip=trim(htmlspecialchars($ip));
  
  if (isset($timestamp)) $timestamp=trim(htmlspecialchars($timestamp)); 

	// Après la mise en forme, on vérifie la validité des champs
  // reception date
  if (is_numeric($timestamp)) { 
		// On met dans erreur le message qui sera affiché
		$erreur="Le timestamp ne contient pas que des chiffres..."; 
	}
  // On vérifie si l'adresse ip est sous la bonne forme
	elseif (!preg_match('#^([0-9]{1,3}\.){3}[0-9]{1,3}$#', $ip)){ 
		$erreur="Votre adresse ip n'est pas correct, elle doit être sous la forme 127.0.0.1";
	}
	// Si tous les champs sont valides, on change l'état à ok
	else { 
		$etat="ok";
    }
}


if ($etat=="ok"){ 
	// Cas où le formulaire a été soumis mais il y a des erreurs
  
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

        $res = $bdd->query('SELECT * FROM total_visiteur WHERE ip = "'.$ip.'"');
        $requete = $res->fetch(PDO::FETCH_ASSOC);
        $return = $res->fetch();
        
if($return['timestamp']+ 86400 > $timestamp)
    {
    
    }
elseif($return['timestamp']+ 86400 < $timestamp)  
    {
        try
{
    $bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
    $bdd->query("SET NAMES UTF8"); 
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

$req = $bdd->prepare ('INSERT INTO total_visiteur(ID, ip, timestamp) VALUES(:ID, :ip, :timestamp)');
$req->execute(array(
    'ID' => NULL,
    'ip'=>$ip,
    'timestamp'=>$timestamp));
     
    }
    
else {
    header('Location: index.php');
}    
    
    }
              
              
elseif ($etat=="erreur"){ 
		// On affiche le message correspondant à l'erreur
		echo "<h4>$erreur</h4>" ;
	}
  
else {
    header('Location: index.php');
}

	?>
Pour la petite explication, c'est un compteur de visite total. Une adresse ip est comparé à ma bdd, si elle existe mais depuis plus de 24 heures, je considère que c'est une nouvelle visite alors j'ajoute en bdd sinon si elle existe depuis moins de 24 heures, je ne fais rien sinon j'ajoute en bdd. C'est à priori une erreur de synthaxe d'après ce que j'ai pu voir sur google

Merci à celles et ceux qui pourront m'aider

Cordialement