无限共享系统(PHP / MySQLi)

时间:2014-05-28 03:23:00

标签: php

我正在为任何客户分享产品并吸引新客户的折扣系统。每个独特的访问= 0.05美元,每个新客户= 0.50美元(这是一个便宜的产品,所以是的,没有大数字)。

当新客户共享网站时,最初负责新客户(如果有)的客户也将获得新客户折扣的一半。初始客户将获得下一级别的第四名和新客户的一半等,从而创建一个无限的树或金字塔。

  • 初始客户(1.35美元折扣:2次新增+ 3次访问+ 1次新增一半+ 2次访问)
    • 访客($ 0)
    • 访客($ 0)
    • 新客户(0.60美元)
      • 访客($ 0)
      • 访客($ 0)
      • 较新的客户($ 0)
    • 新客户($ 0)
    • 访客($ 0)

客户与其IP地址(bin2hex(inet_pton))一起保存在数据库表(customers)中,其中包含唯一ID,电子邮件地址和购买产品的首次日期/时间等信息( =注册时间)。

共享保存在同一数据库(sharing)内的单独表中。访问该站点的每个唯一IP地址都会创建一个新行,其中包含IP地址(再次保存为bin2hex(inet_pton)),共享它的客户的ID以及访问的日期/时间。

通过包含初始客户ID的GET元素的URL进行共享。访问和新客户重叠,因为访问将始终在新客户之前进行。这很好,不用担心。

使用日期/时间只是为了让它更安全一些(我还使用IP和cookie来查看人们是否欺骗共享系统,这绝对不是不可能但我不在乎)。如果IP已在sharingcustomers中,则不会计算,也不会创建新条目。

现在的问题是,如何使无限发生并应用不同的折扣值(总是恰好一半)呢?这就是我需要知道的全部内容。

它需要单独计算每个客户的折扣,但也允许完全监控(尽管这只是通过它传递所有ID的问题)。

我想我会用

开始(在数据库连接之后)
 $stmt = $con->prepare('SELECT ip,datetime FROM sharing WHERE sender=?');
 $stmt->bind_param('i',$customerid);
 $stmt->execute();
 $stmt->store_result();
 $discount = $discount + ($stmt->num_rows * 0.05);
 $stmt->bind_result($ip,$timeofsharing);

将所有访问量翻译为每个折扣0.05美元。

为了检查来自这些访问的新客户,我写了以下内容:

 while ($sql->fetch()) {
  $stmt2 = $con->prepare("SELECT datetime FROM users WHERE ip=?");
  $stmt2->bind_param('s',$ip);
  $stmt2->execute();
  $stmt2->store_result();
  $stmt2->bind_result($timeofpurchase);

随后比较日期时间更安全:

  while ($stmt2->fetch()) {
   if (strtotime($timeofpurchase) < strtotime($timeofsharing)) {
    $discount = $discount + $0.50;
   }
  }
 }
}

但这只是初始客户的直接结果。如果我想要检查下一级别,我基本上必须完全相同的检查和循环,检查每个新客户并访问带到网站的初始客户,然后再次进入下一级别检查所有新客户等等。

怎么办? / 去哪儿? /为什么这是正确的做法?

谢谢!

1 个答案:

答案 0 :(得分:1)

让我们假设您的初始网址如下:visitor.php?uid = 1234567890 另外,我假设您在表格中有折扣列,用于存储您的所有用户。

此时,在visitor.php中,您应该执行以下操作:

<?php
define('SECRET','The Line Secret Key');

function encryptCookie($value, $key) {
   if(!$value){return false;}
   $text = $value;
   $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
   $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
   $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv);
   return trim(base64_encode($crypttext)); //encode for cookie
}

function decryptCookie($value, $key) {
   if(!$value){return false;}
   $crypttext = base64_decode($value); //decode cookie
   $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
   $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
   $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv);
   return trim($decrypttext);
}

function getValueForCookie($arr) {
    $tmp = json_encode($arr);
    return encryptCookie($arr,SECRET);
}

function getValueFromCookie($string) {
    $tmp = decryptCookie($string,SECRET);
    return json_decode($string,true);
}

if(isset($_GET['uid']) && strlen(trim($_GET['uid'])) > 0 && !isset($_COOKIE['Referal']) {
    //assuming uid is int only
    $uid = intval($_GET['uid']);
    $cookie = array();

    $stmt2 = $con->prepare("SELECT * FROM users WHERE uid = :uid");
    $ret = $stmt2->execute(array(":uid" => $_GET['uid']));

    if($ret && $stmt2->rowCount() == 1) {
        $cookie['uid'] = $uid;

        $discount = 0.05;

        $update = $con->prepare("UPDATE users SET discount = discount + :discount WHERE uid = :uid");
        $ret2 = $update->execute(array(":uid" => $uid,":discount" => $discount));

        if($ret2) {
            $cookie['visit_discount'] = 1;
        } else {
            $cookie['visit_discount'] = 0;
        }
    }

    setcookie("Referal", getValueForCookie($cookie), 2147483647);
}
?>

现在,当访问者注册一个新帐户时,在用户的新数据实际插入数据库后,您将执行以下操作(此处还需要第一个文件中的函数):

<?php
$cookie_values = array();
if(isset($_COOKIE['Referal'])) {
    $cookie_values = getValueFromCookie($_COOKIE['Referal']);
}

/*
Create the new user's account, use $cookie_values['uid'] as the referal's user id
Once you create the account and make sure its created do the following
*/

if(isset($cookie_values['uid'])) {
    $stmt2 = $con->prepare("SELECT * FROM users WHERE uid = :uid");
    $ret = $stmt2->execute(array(":uid" => $cookie_values['uid']));

    if($ret && $stmt2->rowCount() == 1) {
        $row = $stmt2->fetch(PDO::FETCH_ASSOC);

        $discount = 0.5;

        $update = $con->prepare("UPDATE users SET discount = discount + :discount WHERE uid = :uid");
        $ret2 = $update->execute(array(":uid" => $cookie_values['uid'],":discount" => $discount));

        if($ret2) {
            $cookie_values['registration_discount'] = 1;
        } else {
            $cookie_values['registration_discount'] = 0;
        }

        setcookie("Referal", getValueForCookie($cookie_values), 2147483647);

        if(!is_null($row['referal'])) {
            while(!is_null($row['referal'])) {
                $discount = $discount / 2;

                $update = $con->prepare("UPDATE users SET discount = discount + :discount WHERE uid = :uid");
                $ret2 = $update->execute(array(":uid" => $row['referal'],":discount" => $discount));

                $select = $con->prepare("SELECT referal FROM users WHERE uid = :uid LIMIT 1");
                $ret_select = $select->execute(array(":uid" => $row['referal']));

                if($ret_select && $select->rowCount() == 1) {
                    $row = $select->fetch(PDO::FETCH_ASSOC);
                } else {
                    $row['referal'] = null;
                }
            }
        }
    }
}
?>

没有对上述内容进行测试,但如果我的假设开始正确,它应该可以正常工作:D