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

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 : Page qui se recharge inopinément après une requête Sql

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

par Castor Gaspard » 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

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

par xTG » 27 avr. 2011, 09:00

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

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

par Castor Gaspard » 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

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

par devlop78 » 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 ...

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

par Castor Gaspard » 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