Page qui se recharge inopinément après une requête Sql

Eléphant du PHP | 256 Messages

26 avr. 2011, 23:12

Bonjour,

Je veux enregistrer dans une page l'activité "illégale" d'un visiteur en notant son adresse Ip, afin de le bannir.

Le but est d'empêcher le Flood, car l'une de mes pages s'affiche avec une variable GET.

Plutôt que copier ici une dizaines de lignes de code, je vous explique ma démarche :

1. Au chargement de la page, je contrôle que l'adresse Ip n'est pas présente dans la table "banni".

2. Si oui, j'affiche un message d'erreur.

3. Si non, le script s'exécute... Je vérifie le contenu de la variable GET demandée. Si elle est fantaisiste, j'ajoute l'adresse Ip du vilain à ma table "banni". Je le préviens par un message, car je suis un garçon poli. :)

Le hic se situe à ce niveau. Quand j'ajoute l'adresse Ip, la page semble se recharger. L'utilisateur voit alors le message d'erreur, pas le message d'avertissement : ce comportement me paraît fâcheux.

Voici le code...
$ip = $_SERVER['REMOTE_ADDR'];
try 
{
	$dbh = new PDO($database, $database_user, $database_password);
	$dbh->beginTransaction();
	$table_forbidden = $dbh->quote('forbidden_clients');
	$sth = $dbh->prepare('SELECT ip FROM '.$table_forbidden.' WHERE ip = ?');
	$sth->execute(array($ip));
	$query_forbidden_ip = $sth->fetch(PDO::FETCH_ASSOC);
	$sth->closeCursor();
}
catch(PDOException $e)
{
	echo $e->getMessage(). "\n";
	echo $e->getCode();
}
if (!(empty($query_forbidden_ip['ip'])))
{
	$unauthorized = true;
}
if (!(isset($unauthorized)))
{ 
// le contenu habituel s'affiche, notamment...
	if (isset($_GET['id']))
	{
		try 
		{
			$dbh = new PDO($database, $database_user, $database_password);
			$dbh->beginTransaction();
			$table_visitor = $dbh->quote('visitor');
			$sth = $dbh->prepare('SELECT foo FROM '.$table_visitor.' WHERE id = ?');
			$sth->execute(array($_GET['id']));
			$query_id = $sth->fetch(PDO::FETCH_ASSOC);
			$sth->closeCursor();
		}
		catch(PDOException $e)
		{
			echo $e->getMessage(). "\n";
			echo $e->getCode();
		}
		if (empty($query_id['id']))
		{
			$forbidden = true;
			try 
			{
				$dbh = new PDO($database, $database_user, $database_password);
				$dbh->beginTransaction();
				$table_forbidden = $dbh->quote('forbidden_clients');
				$sth = $dbh->prepare('INSERT INTO '.$table_forbidden.' (ip, time) VALUES (?, ?)');
				$sth->execute(array($ip, $time));
				$dbh->commit();
				$sth->closeCursor();
			}
			catch(PDOException $e)
			{
				echo $e->getMessage(). "\n";
				echo $e->getCode();
			}
		}
	}
}
else
{
// le message de banissement s'affiche
}
De plus, ma page se comporte différemment selon les navigateurs : sous Chrome, l'opération se déroule comme attendu, mais pas sous Firefox, avec Ubuntu (je ne n'utilise Windows).

Auriez-vous une idée lumineuse à me soumettre ? :mrgreen:

Comme je ne sais pas comment formuler brièvement le problème, notre ami Google m'est inutile.

Merci pour votre aide.

Cordialement,

Gaspard

devlop78
Invité n'ayant pas de compte PHPfrance

27 avr. 2011, 00:50

Je ne sais pas mais il y a un moment tu démarres une transaction mais tu ne la commit pas. Peut etre que PDO FETCH le fait lui-même mais certains bugs bêtes et casses-têtes viennent souvent de simples erreurs ...

Eléphant du PHP | 256 Messages

27 avr. 2011, 08:44

Bonjour,

Merci de ta réponse, Devlop 78. :mrgreen:

Mai, ôte-moi un doute : pour un select, commit est indispensable ?

Merci !

Cordialement,

Gaspard

ViPHP
xTG
ViPHP | 7331 Messages

27 avr. 2011, 09:00

C'est pas que le commit soit indispensable c'est qu'une transaction pour un select soit inutile. ;)

Eléphant du PHP | 256 Messages

27 avr. 2011, 09:54

Bonjour,

Merci, xTG, tu as diablement raison, maintenant que j'y pense. :D

Mais, je dois t'avouer que j'ai jamais compris grand chose à query versus exec, et que les résulats de query m'ont toujours semblé inattendus.

Mais je vais y retravailler.

Cordialement,

Gaspard