0

我正在编写推荐程序脚本。我有下表:

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

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

每次有人订阅时,我都需要检查表中是否有三个相同的参考,然后将奖励设置为 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; 
} 

你能帮助我吗?

4

2 回答 2

1

您的代码在当前状态容易受到SQL 注入攻击。我还看到您正在使用mysql_*目前正在弃用的古老功能。看到红框了吗?相反,您应该了解准备好的语句并使用PDOMySQLi。如果你不能决定,这篇文章将有助于选择。如果你想学习,这里有一个很好的 PDO 教程。您至少已尝试修复 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();
}

验证用户尝试使用的电子邮件地址可能会更好。这可以通过内置filter_var()函数轻松完成:

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

请注意,我检查了出现的次数是否正好是 3,所以也许你想检查三的倍数。

于 2012-10-14T18:33:02.663 回答
0

SQL中有一个COUNT函数。

SELECT COUNT(*) FROM betalist WHERE ref=?

然后检查结果是否为 3。比返回实际行然后对它们进行计数要高效得多..

于 2012-10-14T14:47:24.117 回答