我正在为任何客户分享产品并吸引新客户的折扣系统。每个独特的访问= 0.05美元,每个新客户= 0.50美元(这是一个便宜的产品,所以是的,没有大数字)。
当新客户共享网站时,最初负责新客户(如果有)的客户也将获得新客户折扣的一半。初始客户将获得下一级别的第四名和新客户的一半等,从而创建一个无限的树或金字塔。
客户与其IP地址(bin2hex(inet_pton))一起保存在数据库表(customers
)中,其中包含唯一ID,电子邮件地址和购买产品的首次日期/时间等信息( =注册时间)。
共享保存在同一数据库(sharing
)内的单独表中。访问该站点的每个唯一IP地址都会创建一个新行,其中包含IP地址(再次保存为bin2hex(inet_pton)),共享它的客户的ID以及访问的日期/时间。
通过包含初始客户ID的GET元素的URL进行共享。访问和新客户重叠,因为访问将始终在新客户之前进行。这很好,不用担心。
使用日期/时间只是为了让它更安全一些(我还使用IP和cookie来查看人们是否欺骗共享系统,这绝对不是不可能但我不在乎)。如果IP已在sharing
或customers
中,则不会计算,也不会创建新条目。
现在的问题是,如何使无限发生并应用不同的折扣值(总是恰好一半)呢?这就是我需要知道的全部内容。
它需要单独计算每个客户的折扣,但也允许完全监控(尽管这只是通过它传递所有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;
}
}
}
}
但这只是初始客户的直接结果。如果我想要检查下一级别,我基本上必须完全相同的检查和循环,检查每个新客户并访问带到网站的初始客户,然后再次进入下一级别检查所有新客户等等。
怎么办? / 去哪儿? /为什么这是正确的做法?
谢谢!
答案 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