• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
redirect هوشمند php
#1
سلام به يك كد پي اچ پي نياز دارم كه شكل زير عمل كنه:
به فرض يك فايل به نام
redirect.php
داريم كه در روز يك كاربر 2 بار ازش بازديد مي كنه
من ميخوام كدي در اين صفحه قرار بدم كه بر اساس آي پي كاربر رو شناسايي كنه و اگر كاربر براي بار اول از اين صفحه بازديد كرد اين صفحه كاربر رو ريدايركت كنه به صفحه زير:
bazdid1.html
واگر براي بار دوم با گذشت كمتر از
24 ساعت
اين صفحه رو بازكرد هدايت كنه به صفحه
bazdid2.html
ممنون ميشم كدش رو يكي از دوستان لطف كنه واسم بنويسه خيلي مهم هست واسم
  پاسخ
تشکر شده توسط :
#2
نمیخوام off و اسپم بزنم ولی:
نقل قول:كدش رو يكي از دوستان لطف كنه واسم بنويسه خيلي مهم هست واسم
اینطور کدنویسی هارو معمولاً هیچ انجمنی و هیچ جایی انجام نمیدن، بلکه بی جواب میزارن یا فقط راهنمایی می کنن

پیشنهاد میکنم کار رو همیشه تیکه تیکه و ریز ریز کنی، بعد انجامشون بدی، بعد به هم بچسبونیشون. در آخر هم می تونی بهینه سازی، اصولی و تر تمیزش کنی
مثلاً این می تونه یه راهنما باشه:
یه کد ساده برای redirect بنویس (یا گیر بیار)
یه کد ساده برای cookie/session بنویس (یا گیر بیار) که اگر کاربر به صفحه رجوع کرد مقدارش 1 بشه
حالا یه شرط ساده بنویس اگر اون session/cookie ت مقدار نداشت، توسط کد redirect ت بره به bazdid1.html اگر مقدارش 1 بود بره به bazdid2.html
در آخر، به اون session/cookie ت زمان ویزیت رو هم اضافه کن. بعد به اون شرطت ماو تفاوت زمان حال و زمان ثبت شده در session/cookie رو هم اضافه کن. (1 روز برابره با 24 ساعت یا 1440 دقیقه یا 86400 ثانیه یا 8.64e+7 میل ثانیه)
وبلاگ: Yousha.Blog.ir


کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بیشتر => نگهداری بهتر
  پاسخ
تشکر شده توسط : chardivari Alaa sara147
#3
کد پی‌اچ‌پی:
<?php 
$ip
=$_SERVER['REMOTE_ADDR'];
$servername 'localhost';
$dbname 'android';
$password '';
$username 'root';
$dns "mysql:host=$servername;dbname=$dbname";
try{
    
$connect = new pdo($dns,$username,$password);
}catch(
PDOException $error){
    echo 
"error in connect to database! : ".$error->getMessage();
}
$sql "SELECT COUNT(*) FROM `bazdid` WHERE `ip`=?";
$result $connect -> prepare($sql);
$result -> bindValue(1,$ip);
$result -> execute();
$num $result-> fetchColumn();
if (
$num 0) {
    
$sql "SELECT * FROM `bazdid` WHERE ip =$ip";
    
$result $connect -> query($sql);
    foreach (
$result as $rows) {
        if((
time() - $rows['time']) > 60*60*24){
            
$sql 'UPDATE `bazdid` SET `time`=? WHERE `ip`=?';
            
$result $connect -> prepare($sql);
            
$result -> bindValue(1,time());
            
$result -> bindValue(2,$ip);
            
$result -> execute();
            
header('location:bazdid1.php');
            exit();
        } else{
            
header('location:bazdid2.php');
            exit();        
        }
    }
}else{
    
$sql='INSERT INTO `bazdid` (ip,time) VALUES(:ip,:time)';
    
$result $connect-> prepare($sql);
    
$result -> bindParam(":ip",$ip);
    
$result -> bindParam(":time",time());
    
$query $result -> execute();
    if (
$query) {
        
header('location: bazdid1.php');
        exit();
    }else{echo 
"error in INSERT INTO bazdid";}
    
}
?>
تشکر یادت نرهBig Grin
  پاسخ
تشکر شده توسط : chardivari
#4
(۱۳۹۴ خرداد ۲۵, ۰۶:۰۱ ب.ظ)mortaza نوشته: تشکر یادت نرهBig Grin
سلام خيلي ممنون كه لطف كرديد در حق بنده
  پاسخ
تشکر شده توسط :
#5
(۱۳۹۴ خرداد ۲۵, ۰۶:۰۱ ب.ظ)mortaza نوشته:
کد پی‌اچ‌پی:
<?php 
$ip
=$_SERVER['REMOTE_ADDR'];
$servername 'localhost';
$dbname 'android';
$password '';
$username 'root';
$dns "mysql:host=$servername;dbname=$dbname";
try{
    
$connect = new pdo($dns,$username,$password);
}catch(
PDOException $error){
    echo 
"error in connect to database! : ".$error->getMessage();
}
$sql "SELECT COUNT(*) FROM `bazdid` WHERE `ip`=?";
$result $connect -> prepare($sql);
$result -> bindValue(1,$ip);
$result -> execute();
$num $result-> fetchColumn();
if (
$num 0) {
    
$sql "SELECT * FROM `bazdid` WHERE ip =$ip";
    
$result $connect -> query($sql);
    foreach (
$result as $rows) {
        if((
time() - $rows['time']) > 60*60*24){
            
$sql 'UPDATE `bazdid` SET `time`=? WHERE `ip`=?';
            
$result $connect -> prepare($sql);
            
$result -> bindValue(1,time());
            
$result -> bindValue(2,$ip);
            
$result -> execute();
            
header('location:bazdid1.php');
            exit();
        } else{
            
header('location:bazdid2.php');
            exit();        
        }
    }
}else{
    
$sql='INSERT INTO `bazdid` (ip,time) VALUES(:ip,:time)';
    
$result $connect-> prepare($sql);
    
$result -> bindParam(":ip",$ip);
    
$result -> bindParam(":time",time());
    
$query $result -> execute();
    if (
$query) {
        
header('location: bazdid1.php');
        exit();
    }else{echo 
"error in INSERT INTO bazdid";}
    
}
?>
تشکر یادت نرهBig Grin

جدول رو با دستور sql زير ساختم
کد پی‌اچ‌پی:
CREATE TABLE IF NOT EXISTS `bazdid` (
`
idint(10NOT NULL,
`
timeint(10NOT NULL,
`
ipvarchar(15NOT NULL
ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `bazdidADD PRIMARY KEY (`id`);
ALTER TABLE `bazdidMODIFY `idint(10NOT NULL AUTO_INCREMENT
اطلاعات ديتابيس رو هم درست وارد كردم در اسكريپت اما كد مثل اينكه مشكل داره بار اول كه بازديد مي كنيم ريداركت مي كنه به
bazdid1.php اما بار دوم كه بازديد مي كنيم صفحه خالي مياره فكر كنم كد مشكلي داره به نظرتون مشكلش چيه؟
  پاسخ
تشکر شده توسط :
#6
بار اول این کد اجرا میشه
کد پی‌اچ‌پی:
$sql='INSERT INTO `bazdid` (ip,time) VALUES(:ip,:time)';
    
$result $connect-> prepare($sql);
    
$result -> bindParam(":ip",$ip);
    
$result -> bindParam(":time",time());
    
$query $result -> execute();
    if (
$query) {
        
header('location: bazdid1.php');
        exit();
    }else{echo 
"error in INSERT INTO bazdid";} 



وبار دوم میاد سراغ کد پایین اگه مشکلی پیش اومده باشه احتمالا در کد زیر هست


کد پی‌اچ‌پی:
if ($num 0) {
    
$sql "SELECT * FROM `bazdid` WHERE ip =$ip";
    
$result $connect -> query($sql);
    foreach (
$result as $rows) {
        if((
time() - $rows['time']) > 60*60*24){
            
$sql 'UPDATE `bazdid` SET `time`=? WHERE `ip`=?';
            
$result $connect -> prepare($sql);
            
$result -> bindValue(1,time());
            
$result -> bindValue(2,$ip);
            
$result -> execute();
            
header('location:bazdid1.php');
            exit();
        } else{
            
header('location:bazdid2.php');
            exit();        
        }
    }


(id رو اوتواینکریمنت بذارید) _> برای این کار تو قسمت ویرایش id تیک A_I رو براش بزنید!
اگر بار اول درست ریدایرکت میکنه قانونا باید indert انجام شده باشه اما جهت احتیاط احتمالات زیر رو بررسی کنید

1 - آیا ip و خروجی تابع تایم و id در دیتابیس ذخیره شده است؟

خوب اگه ثبت شده بود چک کن آیا متغییر $rows['time'] مقدار گرفته یا نه اگه مقدار نداشت یعنی تکه کد زیر کار نکرده

کد پی‌اچ‌پی:
$sql "SELECT * FROM `bazdid` WHERE ip =$ip";
    
$result $connect -> query($sql);
    foreach (
$result as $rows) { 
که البته اگه تکه کد بالا مشکل داشته باشه باید بگه ورودی های foreach مشکل دارن(اگه رکوردی تو جدول ثبت شده باشه)
و البته منظورت از صفحه سفید رو مشخص نمیشم تو چه فایلی و چه آدرسی سفید نشون میده تو صفحه bazdid1 یا redirect یا bazdid2
  پاسخ
تشکر شده توسط : Y.P.Y
#7
(۱۳۹۴ خرداد ۲۶, ۱۲:۰۶ ب.ظ)mortaza نوشته: بار اول این کد اجرا میشه
کد پی‌اچ‌پی:
$sql='INSERT INTO `bazdid` (ip,time) VALUES(:ip,:time)';
    
$result $connect-> prepare($sql);
    
$result -> bindParam(":ip",$ip);
    
$result -> bindParam(":time",time());
    
$query $result -> execute();
    if (
$query) {
        
header('location: bazdid1.php');
        exit();
    }else{echo 
"error in INSERT INTO bazdid";} 



وبار دوم میاد سراغ کد پایین اگه مشکلی پیش اومده باشه احتمالا در کد زیر هست


کد پی‌اچ‌پی:
if ($num 0) {
    
$sql "SELECT * FROM `bazdid` WHERE ip =$ip";
    
$result $connect -> query($sql);
    foreach (
$result as $rows) {
        if((
time() - $rows['time']) > 60*60*24){
            
$sql 'UPDATE `bazdid` SET `time`=? WHERE `ip`=?';
            
$result $connect -> prepare($sql);
            
$result -> bindValue(1,time());
            
$result -> bindValue(2,$ip);
            
$result -> execute();
            
header('location:bazdid1.php');
            exit();
        } else{
            
header('location:bazdid2.php');
            exit();        
        }
    }


(id رو اوتواینکریمنت بذارید) _> برای این کار تو قسمت ویرایش id تیک A_I رو براش بزنید!
اگر بار اول درست ریدایرکت میکنه قانونا باید indert انجام شده باشه اما جهت احتیاط احتمالات زیر رو بررسی کنید

1 - آیا ip و خروجی تابع تایم و id در دیتابیس ذخیره شده است؟

خوب اگه ثبت شده بود چک کن آیا متغییر $rows['time'] مقدار گرفته یا نه اگه مقدار نداشت یعنی تکه کد زیر کار نکرده

کد پی‌اچ‌پی:
$sql "SELECT * FROM `bazdid` WHERE ip =$ip";
    
$result $connect -> query($sql);
    foreach (
$result as $rows) { 
که البته اگه تکه کد بالا مشکل داشته باشه باید بگه ورودی های foreach مشکل دارن(اگه رکوردی تو جدول ثبت شده باشه)
و البته منظورت از صفحه سفید رو مشخص نمیشم تو چه فایلی و چه آدرسی سفید نشون میده تو صفحه bazdid1 یا redirect یا bazdid2

تو صفحه redirect سفيد نشون ميده
من زياد از كدنويسي php سر در نميارم ميشه لطف كني رو هاست خودت تستش كني و مشكلاتش رو برطرف كني و كد سالمش رو اينجا بزاري با بكاپ ديتابيسش؟
  پاسخ
تشکر شده توسط :
#8
این هم کد بفرمایید تصحیح شد!
کد پی‌اچ‌پی:
<?php 
$ip
=$_SERVER['REMOTE_ADDR'];
$servername 'localhost';
$dbname 'android';
$password '';
$username 'root';
$dns "mysql:host=$servername;dbname=$dbname";
try{
    
$connect = new pdo($dns,$username,$password);
}catch(
PDOException $error){
    echo 
"error in connect to database! : ".$error->getMessage();
}
$sql "SELECT COUNT(*) FROM `bazdid` WHERE `ip`=?";
$result $connect -> prepare($sql);
$result -> bindValue(1,$ip);
$result -> execute();
$num $result-> fetchColumn();
if (
$num 0) {
    
$q $connect->prepare("select `time` from `bazdid` WHERE `ip`=:ip");
    
$q->bindValue(':ip'$ip);
    
$q->execute();
    while(
$row $q->fetch(PDO::FETCH_ASSOC)) {
        
$time=$row['time'];
        echo 
$row['time'];
    }
    
$day time() - $time;
        if(
$day >= 86400){
            
$sql 'UPDATE `bazdid` SET `time`=? WHERE `ip`=?';
            
$result $connect -> prepare($sql);
            
$result -> bindValue(1,time());
            
$result -> bindValue(2,$ip);
            if(
$result -> execute()){
                
header('location:bazdid1.php?update');
                exit();
            }else{
                echo 
"error in update";
            }
        } else{
            
header('location:bazdid2.php?no-update?'.$day);
            exit();        
        }
}else{
    
$sql='INSERT INTO `bazdid` (ip,time) VALUES(:ip,:time)';
    
$result $connect-> prepare($sql);
    
$result -> bindParam(":ip",$ip);
    
$result -> bindParam(":time",time());
    
$query $result -> execute();
    if (
$query) {
        
header('location: bazdid1.php?insert');
        exit();
    }else{echo 
"error in INSERT INTO bazdid";}
    
}
?>
فقط توجه داشته باشید که در کد ها نام دیتابیس و جدول خودتون رو واردکنید در اینجا
اسم دیتابیس android و نام جدول bazdid هست
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان