Problème de preg_match

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 : Problème de preg_match

par auclairp » 23 janv. 2007, 13:21

J'ai compris l'explication, mais pas réussi à l'intégré, et je t'avous, là avec ton ereg ca fonctionne, alors je veux pas tout mélanger. mais je vais essayer d'y travailler, c'es tjuste que je ne sais pa scomment et où l'intégré dans mon code (ex celui actuel)

Bon, voilà le résultat final qui fonctionne pour ceux que ca pourrais intéressé:
<?
$page = $_SERVER['PHP_SELF']; 
$ip = $_SERVER['REMOTE_ADDR'];
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$urlfrom = $_SERVER["HTTP_REFERER"];

$annee = date("Y",mktime(date("H")-5, date("i"), date("s"), date("m") , date("d"), date("Y") ) );
$mois = date("m",mktime(date("H")-5, date("i"), date("s"), date("m") , date("d"), date("Y") ) );
$jour = date("d",mktime(date("H")-5, date("i"), date("s"), date("m") , date("d"), date("Y") ) );
$heure = date("H:i:s",mktime(date("H")-5, date("i"), date("s") ) );	 
$date= date(U);
		
	$time = date('U');
	$timeout = date('U') - 10;   // délais de 5 minutes (60 secondes * 5 = 5 minutes 
	
	// Voir si l'IP existe dans la Bdd
	$ip_exist= "SELECT * FROM ip_no WHERE ip='$ip' AND block='yes' ";	
	$ip_exist2 = mysql_query($ip_exist);
	
	// Voir si l'IP n'a pas déjà été enregistrer dans les dernières 5 minutes.	
	$ip_timeout= "SELECT * FROM logs WHERE page='$page' AND ip='$ip' AND date>'".$timeout."'";	
	$ip_timeout2 = mysql_query($ip_timeout);
	
	// Voir s'il y a une entrée dans la Bdd qui correspond avec l'adresse HOST du client
	$host_existe = mysql_query("SELECT * FROM ip_no WHERE block='yes' "); // Requête SQL 
	while ($host_existe1 = mysql_fetch_array($host_existe) )
		{
			if (ereg($host_existe1['bddhost'], $host)) 
			{$host_found = true;}
		}
		
if (mysql_num_rows($ip_exist2) >= 1)
{
//echo 'IP bloquée';
}		
elseif (mysql_num_rows($ip_timeout2) >= 1)
{
//echo 'Délais trop court';
}
elseif(isset($host_found))
{	
//echo 'Host bloqué';
}
else
{
//echo  'Données inscrite dans la Bdd';
	mysql_query('INSERT INTO logs VALUES(	"", 
											"'.$page.'", 
											"'.$ip.'",
											"'.$host.'", 
											"'.$annee.'",
											"'.$mois.'", 
											"'.$jour.'", 
											"'.$heure.'",
											"'.$time.'", 
											"'.$urlfrom.'",
											"'.$maillist.'")')or die(mysql_error());
}?>
Merci de ton aide,

par Ryle » 23 janv. 2007, 12:25

La dernière remarque était juste liée à de l'optimisation :)

Lorsque tu fais un "SELECT *" en sql, tu vas rammener tous les champs de la table qui correspondent aux critères spécifiés. Si la seule chose qui t'intéresse est de savoir si oui ou non tu as des résultats, ou bien seulement d'en connaître le nombre, il n'est pas utile de rammener toutes ces données.

Supposons que j'ai une table avec 30 champs textes contenant quelques 50ko chacun, si je fais un "SELECT *", ma requête va remonter 1.5Mo de données dont je n'ai que faire car tout ce qui m'interesse c'est de savoir que j'ai une ligne qui correspond :)

La fonction COUNT() permet de compter le nombre d'enregistrements sans avoir à les récupérer. Il est donc beaucoup plus efficace de l'utiliser, d'autant qu'elle est (en générale) la fonction la plus optimisée en sql.
$sql = "SELECT COUNT(*) AS nb FROM ma_table WHERE ...";
$result = mysql_query($sql); // execute la requête
$row = mysql_fetch_assoc($result); // associe la ligne de résultat
echo $row['nb']; // nombre de ligne trouvé.
D'une manière générale, il est de toute façon peu recommandé de faire un "SELECT *", on préfère en général lister tous les champs. C'est plus long, mais plus précis également. D'une part, parce que du coup tu ne récupères que les colonnes dont tu as besoin, d'autre part ça te donne une idée des index disponibles, et surtout tu sais dans quel ordre sont retournées les champs, ce qui peut avoir son utilité également.


Ps : et ton preg_match alors ? c'en est où ? :)

par Invité » 23 janv. 2007, 12:06

Concernant ton expression régulière, je rappelle que le $ a une toute autre signification dans les expreg puisqu'il correspond à la fin de la chaine...

Si tu veux utiliser une variable php à l'intérieur d'une expression, le mieux est de la sortir de la chaine. Et si ton test a seulement pour but de savoir si une chaine est comprise dans une autre, la fonction ereg() serait peut être plus simple à utiliser :)
if (ereg($host_existe1['bddhost'], $host))  
Edit : juste une petite remarque concernant ton code, il n'y a pas d'intérêt de faire des "SELECT *" si le seul usage que tu en as derrière est de compter le nombre de ligne. Un "SELECT COUNT(*)" sera beaucoup plus adapté, plus rapide et plus optimisé ;)
Très heureux de ta dernière remarque mais pas certain de comprendre.... peux tu pousser unpeu

Désolé pour le titre.

par Ryle » 23 janv. 2007, 10:52

Concernant ton expression régulière, je rappelle que le $ a une toute autre signification dans les expreg puisqu'il correspond à la fin de la chaine...

Si tu veux utiliser une variable php à l'intérieur d'une expression, le mieux est de la sortir de la chaine. Et si ton test a seulement pour but de savoir si une chaine est comprise dans une autre, la fonction ereg() serait peut être plus simple à utiliser :)
if (ereg($host_existe1['bddhost'], $host))  
Edit : juste une petite remarque concernant ton code, il n'y a pas d'intérêt de faire des "SELECT *" si le seul usage que tu en as derrière est de compter le nombre de ligne. Un "SELECT COUNT(*)" sera beaucoup plus adapté, plus rapide et plus optimisé ;)

par Ryle » 23 janv. 2007, 10:47

Modération :
Merci d'utiliser un titre clair et qui correspond bien à ta demande.
Les titres contenant "HELP", "Aidez-moi !" n'apportent rien à la compréhension de ton problème.
Par ailleurs, nous savons déjà par ton message que tu as besoin d'aide.

Merci de prendre le temps de lire les règlements.

Problème de preg_match

par auclairp » 23 janv. 2007, 09:39

Trouvez l'erreur, je suis même pas certain si c'est possible ( tout mon problème est dan sla section concernant le preg_match et avec le if plus bas)

Si vous avec une meilleur solution, faite moi le savoir
	// Voir si l'IP existe dans la Bdd
	$ip_exist= "SELECT * FROM ip_no WHERE ip='$ip' AND block='yes' ";	
	$ip_exist2 = mysql_query($ip_exist);
	
	// Voir si l'IP n'a pas déjà été enregistrer dans les dernières 5 minutes.	
	$ip_timeout= "SELECT * FROM logs WHERE page='$page' AND ip='$ip' AND date>'".$timeout."'";	
	$ip_timeout2 = mysql_query($ip_timeout);
	
	// Voir s'il y a une entrée dans la Bdd qui correspond avec l'adresse HOST du client
	$host_existe = mysql_query("SELECT * FROM ip_no WHERE block='yes'"); // Requête SQL 
	while ($host_existe1 = mysql_fetch_array($host_existe) )
		{
			if (preg_match("/$host_existe1[bddhost]/", $host)) 
			{
			$host_found = true;
			}
			else {}
		}

	
		
if (mysql_num_rows($ip_exist2) >= 1)
{
echo = "IP Existe";
}		
elseif (mysql_num_rows($ip_timeout2) >= 1)
{
echo = "TimeOut";
}
elseif ($host_found == true))
{
echo = "Host found";
}
else
{
echo = "insert";
	mysql_query('INSERT INTO logs VALUES(	"", 
											"'.$page.'", 
											"'.$ip.'",
											"'.$host.'", 
											"'.$annee.'",
											"'.$mois.'", 
											"'.$jour.'", 
											"'.$heure.'",
											"'.$time.'", 
											"'.$urlfrom.'")')or die(mysql_error());
}?>