我想实施一个新的推荐/促销系统。我的新系统,当用户注册一个特定的来源时,他就会得到他的帮助。来源可以是来自referal(客户域)和促销代码(例如:50%折扣)的任何内容。该来源也有一个日期(y-m-d)。每个源ID都是唯一的,多个用户可以拥有相同的源ID
例如:
source id : 1 = www.domain1.com / 2011-11-20 / (empty referal code)
source id : 2 = www.domain1.com / 2011-11-20 / referalcode1
source id : 3 = www.domain2.com / 2011-11-20 / referalcode1
source id : 4 = www.domain2.com / 2011-11-20 / referalcode2
可以将referal代码从client1混合到客户端2
我如何确定有人注册(其免费注册,我们现在每小时超过1000)我们没有重复记录并冒险mysql产生错误?
答案 0 :(得分:25)
来自mysql页面:
主要思想是使用
检索最后一个IDignore
语句插入记录。如果 您使用IGNORE关键字,执行时发生的错误 INSERT语句被视为警告。例如,没有 IGNORE,一个复制现有UNIQUE索引或PRIMARY KEY的行 表中的值导致重复键错误,语句为 中止。使用IGNORE时,仍未插入行,但没有错误 发行。然后使用mysql_insert_id
如果记录不存在,它将插入它并返回最后一个ID。
现在,如果没有返回记录,您可以进行选择。这意味着记录已经存在,所以只需使用它即可。
示例:的
// make sure $id is safe (preventing sql injections)
$sql = "INSERT IGNORE INTO yourtable SET `field1` = 'value1' ... ";
mysql_query($sql);
if(mysql_affected_rows() == 1) { // no record found and then the inserts worked
$id = mysql_insert_id(); // id from the primary key
// add to cache
}
else {
// you can also cache them when they were inserted (faster to run than a select statement)
$id = retreiveFromCache($field1, $field2 /* etc...*/);
if(!$id) { // no record found in cache
// now the select can be done using the fields received
// make sure your use the right index otherwise it can be slow
$sql = "SELECT id FROM promotions_referrals WHERE `field1` = 'value1' ... "; //
$query = mysql_query($sql);
$row = mysql_fetch_assoc($query);
$id = $row['id'];
// add to cache
}
}
此时您将分配$id
并且您确定没有重复/ mysql错误。
注意:如果域属于一个客户端,请使用客户端ID而不是使用域。这样,您将使用INT作为索引,该索引比VARCHAR快。推荐代码的想法相同。
答案 1 :(得分:0)
您应该将MySQL中的列定义为INTEGER AUTO_INCREMENT PRIMARY KEY
。
进行插入时,请勿指定该列:
INSERT INTO referral (domain, date, referralcode) VALUES (?,?,?)
如果您需要刚刚生成的ID,可以使用函数mysql_insert_id