0

私はPHPが初めてですが、ここで何がうまくいかなかったのかを知るためにできる限りのことをしてきました:

$sid = $db->EscapeString($_GET['data']);
    $site = $db->FetchArray($db->Query("SELECT id,cpc FROM `surf` WHERE `id`='".$sid."'"));
    $check = $db->GetNumRows($db->Query("SELECT * FROM `surfed` WHERE `user`='".$data['id']."' AND `site`='".$sid."'"));
    $pr = mysql_query("SELECT premium  FROM users");
        if($site['id'] != "" && $check == 0 && $pr['premium'] = "0"){
        $db->Query("UPDATE `users` SET `coins`=`coins`+'".$site['cpc']."' WHERE `id`='".$data['id']."'");
        $db->Query("UPDATE `surf` SET `visits`=`visits`+'1', `points`=`points`-'".$site['cpc']."' WHERE `id`='".$site['id']."'");
        $db->Query("INSERT INTO `surfed` (user, site) VALUES('".$data['id']."', '".$site['id']."')");
    }
        elseif($site['id'] != "" && $check == 0 && $pr['premium'] != "0"){
        $db->Query("UPDATE `users` SET `coins`=`coins`+ 20 WHERE `id`='".$data['id']."'");
        $db->Query("UPDATE `surf` SET `visits`=`visits`+'1', `points`=`points`-'".$site['cpc']."' WHERE `id`='".$site['id']."'");
        $db->Query("INSERT INTO `surfed` (user, site) VALUES('".$data['id']."', '".$site['id']."')");
    }
}

したがって、基本的に私がやろうとしているのは、Traffic Exchange Web サイトで、Premium を使用していないユーザーには通常の量のコインを、Premium を使用しているユーザーにはそれぞれ 20 コインの報酬を与えることです。理由はわかりませんが、上記のコードは全員に 20 コインの報酬を与えます。

もう 1 つの問題は、上記のプレミアムは個人のアカウントに残っているプレミアム日数を示していますが、それが毎日減少しているようには見えないことです。それを修正する方法はありますか?

定義:

  • surfiduser、などが含まれます。これはtitlecpcTraffic Exchange のサーフ ページが表示されるデータを取得するテーブルです。idはサイト ID、cpc= クリック単価などです。
  • surfed含まれてsiteidおりuserid、ユーザーが 24 時間前に同じサイトを再び閲覧するのを防ぎます。cron は毎日このテーブルからデータを削除します。
  • usersidusernamecoinsなどが含まれpremiumます。ユーザー情報テーブル。
4

1 に答える 1

0

私が見つけた最初の問題は、特定のユーザーが「プレミアム」ユーザーかどうかを判断しようとしているということです。これを行うには、次のコードがあります。

$pr = mysql_query("SELECT premium FROM users");

ただし、これはすべてのユーザーの「プレミアム」列を取得するため、あまり役に立ちません。代わりに次のように変更してみてください。

$pr = mysql_query("SELECT premium FROM users WHERE id={$data['id']}");

$data['id']これは、ユーザー ID が含まれており(これは既存のコードの場合だと思います)、この配列エントリは既にエスケープされていると見なすことができると想定しています。

$pr次に、実際には結果ハンドルであるのに、結果配列としての値を使用しようとしています。それを使用するには、次のようなことを行う必要があります。

$pr = mysql_query("SELECT premium FROM users WHERE id={$data['id']}");
$prData = mysql_fetch_assoc($pr);
$premium = $prData['premium'];

第 3 に、あなたは というデータベース クラスを持っているように見えますが、関数をコードに$db混在させています。mysql_クラスで提供されているメソッドを使用する方が良いかもしれ$dbませんが、ここで使用しているクラスがわからないため、アドバイスするのは困難です.


余談ですが、できるだけ多くの情報を提供していただければ、初心者として役立ちます。人々はあなたのユースケースについて何も知らないと仮定する必要があります。そのため、すべてを説明し、できるだけ多くの情報を含め、合理的に簡潔に保ちます。「サーフページ」とは?あなたの「Traffic Exchange」とは何ですか? は何のクラス$dbですか?データベースに関する質問では、通常、完全なテーブル定義を提供します。

また、質問に対する回答が得られた場合は、それを自分のケースに当てはめてみて、必要に応じて説明を求めてください。ほとんどの場合、ここにいる人々は喜んであなたに教えてくれますが、あなたのために仕事をしようとはしません。いずれにせよ、ファイルを破損したり、ユーザー データベースを盗んだりしないという確信がない限り、サーバーの資格情報をインターネット上の人々に提供することは、セキュリティ上の適切な慣行ではありません:)。これには十分注意してください!

コメントで指摘したように、この種の質問はデバッグの機が熟しています。コードが意図したとおりに動作していないことはわかっていますが、どこで問題が発生しているのかはわかりません。したがって、予期しない値または間違った値を持つ変数が見つかるまで、それを絞り込むのがコツです。

たとえば、次のコードを参照してください (わかりやすくするためにラップしています。これは PHP で実行できます)。

$sid = $db->EscapeString($_GET['data']);
$site = $db->FetchArray(
    $db->Query("SELECT id,cpc FROM `surf` WHERE `id`='".$sid."'")
);

次のように debug ステートメントを追加してみてください。

$sid = $db->EscapeString($_GET['data']);
echo "Site ID: $sid";
exit();
$site = $db->FetchArray(
    $db->Query("SELECT id,cpc FROM `surf` WHERE `id`='".$sid."'")
);

次に、チェック$sidは期待する値です。そうであれば、素晴らしいので、次のコードに進みます。そうでない場合は、なぜ正しくないのかを調べてください。次に試すのは、次のようなものです。

$sid = $db->EscapeString($_GET['data']);
$sql = "SELECT id,cpc FROM `surf` WHERE `id`='" . $sid . "'";
echo "Surf query: $sql";
exit();
$site = $db->FetchArray($db->Query($sql));

ここで、SQL クエリが期待どおりであることを確認できます。

于 2013-03-03T08:20:16.973 に答える