2012-10-14 56 views
0

我正在处理推荐程序脚本。我有如下表:字符串在列中的逗号数

id primary key 
name varchar 
email varchar 
ref varchar 
bid varchar 
reward boolean 

基本上一次的三个朋友使用相同的裁判,用id等于裁判将获得奖励的人加入。

我需要检查每次有人订阅,如果三个相同的参考在表中,然后将奖励设置为true,并发送电子邮件给ID等于参考编号的人。

我希望很清楚。

我努力完成它。

下面到目前为止整个脚本:

$Bname = mysql_real_escape_string($_POST['Bname']); 
$Bemail = mysql_real_escape_string($_POST['Bemail']); 
$Bref = mysql_real_escape_string($_POST['Bref']); 
$Bid = mysql_real_escape_string($_POST['Bid']); 

mysql_connect("******", "******", "*******") or die ('Error: '.mysql_error()); 
mysql_select_db("********"); 


$checkEmail = "SELECT email FROM betalist WHERE email ='".$Bemail."'"; 
$result = mysql_query($checkEmail); 


if (mysql_num_rows($result) > 0) { 
echo $Bemail." is already in our list"; 
exit; 
} 

if (mysql_num_rows($result) == 0) { 
$query="INSERT INTO betalist (ID, name, email,ref,bid)VALUES ('NULL','".$Bname."','".$Bemail."','".$Bref."','".$Bid."')"; 
mysql_query ($query) or die ('Error updating database'); 

到目前为止,我已经尝试去解决它使用mysql_num_rows:

$refCount = "SELECT id, email FROM betalist WHERE ref='".$Bref."'"; 
$result = mysql_query($refCount); 
if (mysql_num_rows($result)==3) 
{ 
    echo $countarray; 
} 

你能帮助我吗?

+0

触发器可能是一个很好的选择:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html –

+0

我现在使用mysql_real_escape_string就足够了吗? – user1341765

+0

我正在努力将mysql_ *函数更改为PDO API。 – user1341765

回答

0

SQL中有一个COUNT函数。

SELECT COUNT(*) FROM betalist WHERE ref=? 

,然后检查是否结果是3比返回实际的行,然后计算他们更加高效..

1

您的代码 是容易受到SQL Injection attack在当前状态。我也看到你正在使用古老的mysql_*功能,目前正在进行deprecated的过程。请参阅red box?相反,您应该了解prepared statements并使用PDOMySQLi。如果你不能决定,this article将有助于选择。如果你在意学习,here is a good PDO tutorial。您至少已尝试修复SQLi部分,但您当前的代码仍然会失败,因为mysql_real_escape_string()需要与数据库打开连接(并且只能在调用后打开数据库连接)。

代码中使用PDO看起来类似以下内容:

<?php 
$dbConnection = new PDO('mysql:dbname=dbname;host=127.0.0.1;charset=utf8', 'user', 'pass'); 
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

try { 
    $stmt = $dbConnection->prepare('SELECT email FROM betalist WHERE email = :email'); 
    $stmt->execute(array(':email' => $_POST['Bemail'])); 
    $result = $stmt->fetch(PDO::FETCH_ASSOC); 
    if ($result) { 
     echo htmlspecialchars($_POST['Bemail']), " is already in our list"; 
     exit; 
    } 

    $stmt = $dbConnection->prepare('INSERT INTO betalist (ID, name, email, ref, bid) VALUES (NULL, :name, :email, :ref, :bid)'); 
    $stmt->execute(array(
     ':name' => $_POST['Bname'], 
     ':email' => $_POST['Bemail'], 
     ':ref' => $_POST['Bref'], 
     ':bid' => $_POST['Bid'], 
    )); 

    $stmt-> $dbConnection->prepare('SELECT count(id) FROM betalist WHERE ref = :ref'); 
    $stmt->execute(array(':ref' => $_POST['Bref'])); 
    $result = $stmt->fetch(PDO::FETCH_ASSOC); 
    if ($result['count'] == 3) { 
     // do stuff 
    } 
} catch(PDOException $e) { 
    echo 'Something went wrong: ' , $e->getMessage(); 
} 

它也可能会更好,以验证该用户试图使用EMAILADDRESS。这可以很容易地与built in filter_var() function完成:

if(filter_var($_POST['Bemail'], FILTER_VALIDATE_EMAIL) === false) { 
    // user entered an invalid emailaddress 
} 

注意,我做了检查出现的次数是否正好是3所以也许你要检查三个而不是的倍数。