Aller au contenu

Besoin d'un code pour vérifier une info dans la BDD


Sujets conseillés

Posté

Bonjour à tous,

Mes membres étant victimes de spammers, j'essaye d'empécher les visiteurs de mon site d'utiliser la fonction "Contacter le membre" plus d'une fois toutes les dix minutes en utilisant leur IP et l'heure de leur dernier message envoyé.

J'arrive à enregistré ces données dans la BDD, mais je n'arrive pas à créer le code qui permet de vérifier dans la BDD si les dix minutes se sont bien écoulées pour l'IP de la personne qui souhaite utiliser la fonction "Contacter le membre".

Est-ce que l'un d'entre vous saurait m'expliquer comment faire ?

Voici la partie de code que j'ai ajouté à mon fichier contact.php pour stocker les infos de la personne qui contact un membre

$time_interval = 600;

$time_last_contacted = time();

$contact_time = $time_last_contacted + $time_interval;

$lipaddress = getRemoteIP();

mysql_query("INSERT INTO phpclass_stop_spam (id, lContactEmail, lipaddress, time_interval, contact_time, time_last_contacted) VALUES ('', '$lContactEmail', '$lipaddress', '$time_interval', '$contact_time', '$time_last_contacted')")or die(mysql_error());

Voici le fichier contact.php avec le code précédent déjà intégré

<?
session_start();
include_once("admin/inc.php");
$tplContact=new TplLoad;
$tplContact->assign("phpself",$_SERVER['PHP_SELF']);
if ($set_contact_login_need)
check_valid_user("");

// Refereer information
$legal = 0;
$lServerRef = explode("/",getenv("HTTP_REFERER"));
$lUserid=getParam("user_id","");
$tplContact->assign("ad_owner",getParam("ad_owner",""));
$tplContact->assign("id",getParam("id",""));
$tplContact->assign("user_id",getParam("user_id",""));
if ($set_img_validation==1)
$tplContact->assign("image_validation",1);

if (getParam("submit",""))
{
$errorStr="";

$tplContact->assign("contact_name",getParam("contact_name",""));
$tplContact->assign("contact_email",getParam("contact_email",""));
$tplContact->assign("contact_message",strip_tags(getParam("contact_message","")));

if (empty($lUserid))
$errorStr.="<li>".LA_ERROR_MSG5."</li>";

if (!validEmail(getParam("contact_email","")))
$errorStr.="<li>".LA_ERROR_MSG21."</li>";

if (getParam("contact_email","")=="")
$errorStr.="<li>".LA_ERROR_MSG8."</li>";

if (getParam("contact_name","")=="")
$errorStr.="<li>".LA_ERROR_MSG5."</li>";

if (!empty($set_ref) && !eregi("$set_ref",".$lServerRef[2]."))
$errorStr.="<li>".LA_REF_FAILED."</li>";

if (getParam("contact_message","")=="")
$errorStr.="<li>".LA_ERROR_MSG88."</li>";

if ($_SESSION["validate_sign_session"] <> $_REQUEST["validate_sign"] && $set_img_validation)
$errorStr.="<li>".LA_IMG_VER_FAILED."</li>";

if (empty($errorStr))
{
$sql = "select ad_owner,user_name,user_email from $ads_tbl,$usr_tbl where ad_owner=user_id AND user_id = $lUserid limit 1";
$sql_resultads = q($sql);
$row=mysql_fetch_array($sql_resultads);
$lRecieveEmail = $row["user_email"];
$lRecieveName = $row["user_name"];

$lContactMessage=strip_tags(getParam("contact_message",""));
$lContactName=strip_tags(getParam("contact_name",""));
$lContactEmail=strip_tags(getParam("contact_email",""));

$sql="select ad_title,ad_id from $ads_tbl where ad_id='".getParam("id","")."'";
$res_title=q($sql);
$row_title=mysql_fetch_array($res_title);
$lAdTitle=$row_title["ad_title"];

$lAdID=$row_title["ad_id"];

$lEmailBody=formatString(LA_EMAIL_BODY,array(getParam("ad_owner",""), "$lContactName","$lContactMessage","$lContactEmail",getRemoteIp(), "$lAdTitle","$lAdID","$name_of_site","$url"));
$lEmailTitle=formatString(LA_EMAIL,array(getParam("ad_owner",""), "$lContactName","$lContactMessage","$lContactEmail",getRemoteIp(), "$lAdTitle","$lAdID","$name_of_site","$url"));

// mod to stop spam
$time_interval = 600;
$time_last_contacted = time();
$contact_time = $time_last_contacted + $time_interval;
$lipaddress = getRemoteIP();
mysql_query("INSERT INTO phpclass_stop_spam (id, lContactEmail, lipaddress, time_interval, contact_time, time_last_contacted) VALUES ('', '$lContactEmail', '$lipaddress', '$time_interval', '$contact_time', '$time_last_contacted')")or die(mysql_error());
//--- end stop spam ---
$tplContact->assign("message_sent",formatString(LA_SENT_MESSAGE,array("$lRecieveName")));
sendEmail($lRecieveEmail,$lContactEmail,$lEmailTitle,$lEmailBody);
$tplContact->assign("contact_ok",1);
$sql_2 = "update $usr_tbl set user_contacted = user_contacted + 1 where user_id = $lUserid";
$sql_resultupd = q ($sql_2);
addToHistory(2,$lUserid,"","");

}
else
{
$tplContact->assign("contact_fail",$errorStr);
}

}

else
{

$sql_eier = "select user_name from $usr_tbl where user_id = $lUserid";
$result = q ($sql_eier);
$row_contact = mysql_fetch_array($result);
$tplContact->assign("ad_owner",$row_contact["user_name"]);
$tplContact->assign("contact_name",$_SESSION["user_name"]);
$tplContact->assign("contact_email", $_SESSION["user_email"]);
}
$tplContact->display("contact.tpl");
?>

Et voici les fichiers du script dont j'essaye de m'inspirer et qui permet de lancer un script seulement si le délai minimum est passé.

<?php
include_once("functions.php");
include_once($installed_config_file);
db_connect();
$time_and_window = time() + TIME_WINDOW;
$query="select * from scheduler
WHERE fire_time <= $time_and_window";
$result = mysql_query($query);
$scripts_to_run = array();
if (mysql_num_rows($result)) // check has got some
{
$i = 0;
while ($i < mysql_num_rows($result))
{
$id=mysql_result($result,$i, 'id');
$scriptpath=mysql_result($result,$i, 'scriptpath');
$time_interval=mysql_result($result,$i, 'time_interval');
$fire_time=mysql_result($result,$i, 'fire_time');
$time_last_fired=mysql_result($result,$i, 'time_last_fired');
$fire_time_new = $fire_time + $time_interval;
$scripts_to_run[$i]="$scriptpath";
$query="UPDATE scheduler
SET
fire_time='$fire_time_new',
time_last_fired='$fire_time'
WHERE id='$id'";
mysql_query($query);
$i++;
}
}
db_close();

// run the scheduled scripts
for ($i = 0; $i < count($scripts_to_run); $i++) include($scripts_to_run[$i]);
?>

son fichier function.php

<?php
$installed_config_file = "config.inc.php";

function time_unit($time_interval)
{
global $app_name;

$unit = array(0, 'type');
//check if its hours
if ($time_interval <= (23 * 3600))
{
$unit[0]=$time_interval/3600;
$unit[1]="<font color=\"#ff0000\">hours</font>";
}
else
{
// check if its days
if ($time_interval <= (6 * 86400))
{
$unit[0]=$time_interval/86400;
$unit[1]="<font color=\"#FF8000\">days</font>";
}
else
{
$unit[0]=$time_interval/604800;
$unit[1]="<font color=\"#C00000\">weeks</font>";
}
}
$thedomain = $_SERVER['HTTP_HOST'];
return $unit;
}

function db_connect()
{
global $db_link;
@$db_link = mysql_connect(DBHOST, DBUSER, DBPASS);
if ($db_link) _AT_mysql_select_db(DBNAME);
return $db_link;
}

function db_close()
{
global $db_link;
if ($db_link) $result = mysql_close($db_link);
return $result;
}

function js_msg($msg)
{
echo "<script language=\"JavaScript\"><!--\n alert(\"$msg\");\n// --></script>";
}
?>

Avant que le visiteur puisse avoir accès à la fonction "Contacter le membre" j'aimerai pouvoir vérifier dans la BDD si il y a droit, et si ce n'est pas le cas lui afficher un message d'information lui disant qu'il doit patienter dix minutes avant de pouvoir contacter de nouveau quelqu'un.

Merci d'avance à ceux qui voudront bien m'éclairer.

Posté

Pourquoi tu n'essayerais pas avec une session ? tu stockes la date de premier envoi, puis tu compares sur toutes les pages avec le now() : je te conseille de passer par Timestamp qui te retourne un chiffre plus facile à manipuler : il s'affiche en secondes, tu n'as plus quà retirer -600 pour dix minutes à ton timestamp stocké en session. Après, des conditions avec des if/elseif en assignant une variable $off = 1 ou off = 0

Une piste :)

Posté

Salut Tribords et merci pour ton indication.

En fait je suis pas aussi bon que tu le crois, je suis juste un bidouilleur :)

Posté

Un peu rapidemennt :

<?php 
session_start();
$timer = time();
if (empty($_SESSION['maintenant'])){
$_SESSION['maintenant'] = $timer;}
else
{};
if ($_SESSION['maintenant'] > ($timer+600))
{$off = 0}
else
{$off = 1};

?>

Posté

J'ai essayé ta solution en remplacant avec ton code la deuxième ligne de contact.php mais çà provoquait des erreurs

session_start();

j'ai donc un peu modifié et remplacé par celles-ci

<?
session_start();
$timer = time();
if (empty($_SESSION['maintenant']))
{
$_SESSION['maintenant'] = $timer;
}
elseif ($_SESSION['maintenant'] > ($timer + 600))
{
$off = 0;
}
else
{
$off = 1;
}

include_once("admin/inc.php");

Dans la template j'ai mis pour tester ces quelques lignes

{if $off==0}

afficher "contacter le membre"

{/if}

{if $off==1}

cacher "contacter le membre"

{/if}

mais la fonction "contacter le membre" est toujours affichée même si le temps n'est pas écoulé...

puis tu compares sur toutes les pages avec le now()

comment je fais pour comparer ? c'est un code à afficher dans la template ?

Posté

En fait il faudrait créer la session uniquement quand on poste le formulaire, au moment du POST. Enfin le principe y est. Désolé je n'ai pas beaucoup de tempes pour me pencher là dessus :(

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...