2012-10-14 58 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所以也許你要檢查三個而不是的倍數。