0

私は紹介プログラムのスクリプトに取り組んでいます。私は以下の表を持っています:

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

基本的に、3人の友人が同じ参照を使用して参加すると、参照と等しいIDを持つ人が報酬を受け取ります。

誰かがサブスクライブするたびに、同じrefが3つあるかどうかを確認し、報酬をtrueに設定して、refと等しい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_*の古い関数を使用していることもわかりました。赤いボックスが見えますか? 代わりに、準備済みステートメントについて学び、 PDOまたはMySQLiのいずれかを使用する必要があります。決められない場合は、この記事を参考にしてください。学習したい場合は、ここに良い 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 であるかどうかを確認したので、代わりに 3 の倍数を確認する必要があることに注意してください。

于 2012-10-14T18:33:02.663 に答える
0

SQLにはCOUNT関数があります。

SELECT COUNT(*) FROM betalist WHERE ref=?

次に、結果が3であるかどうかを確認します。実際の行を返し、それらをカウントするよりもはるかに効率的です。

于 2012-10-14T14:47:24.117 に答える