0

私のサイトに連絡フォームがあります。同じメールアドレスのユーザーが複数回連絡するのを防ぎたいです。

データを格納するmySQLデータベースで、ストアドプロシージャを作成しました

DELIMITER //
CREATE PROCEDURE find_email(emailaddr VARCHAR(60))
BEGIN

DECLARE form_email VARCHAR(60);
SET form_email=emailaddr;

SELECT count(*)
FROM wordpress.cf7dbplugin_submits
WHERE form_name='Register'
AND field_name LIKE '%email%'
AND field_value=form_email;
END //

このようにして、データベースに電子メールアドレスがあった回数から数値を取得できました。

私のPHPファイルでこれを行いました

Global $res;
$res = $mydb->query("CALL find_email");
if($res>0)
{
echo "<script>alert('This email address is already in use!')</script>";
}
else
{
$tableName = $this->getSubmitsTableName();
            $parametrizedQuery = "INSERT INTO `$tableName` (`submit_time`, `form_name`, `field_name`, `field_value`, `field_order`) VALUES (%s, %s, %s, %s, %s)";
            $parametrizedFileQuery = "INSERT INTO `$tableName` (`submit_time`, `form_name`, `field_name`, `field_value`, `field_order`, `file`) VALUES (%s, %s, %s, %s, %s, %s)";
            $order = 0;
            $noSaveFields = $this->getNoSaveFields();
            $foundUploadFiles = array();
            global $mydb;
 }

コードを変更し、手動で$ resを0に設定すると、フォームは想定どおりに機能します。そうしないと、送信ボタンをクリックしても何も起こりません。

解決策を持っている人に事前に感謝して、私が十分な詳細を入れてくれることを願っています。

4

1 に答える 1

0

あなたはこのすべてのものをあまりにも複雑にしました。まず、本当に必要がない場合は、MySQL でストアド プロシージャを使用しないでください。代わりに、以下を使用してください。

SELECT count(*) FROM table WHERE email LIKE '%value%'

2番。$_POST 変数が何であるかを私が知ることができるように、フォームの HTML を提供する必要があります。たとえば、フォームが次のようになっている場合:

<form ...>
  <input type="text" id="mail" name="mail" />
</form>

次に、PHP スクリプト内の電子メールにアクセスします$_POST['mail']

三番。1 つの PHP スクリプト/フレームワーク コントローラーが生のフォームの表示 (get) と送信 (post) の両方を処理するか、またはそれらが別個の PHP スクリプト/コントローラーであるかによって異なります。1 つのファイルを使用する場合、次のようになります。

if (isset($_POST['email'])) {
  // process - check SQL and eventually display javascript alert
} else  { // get
  // display the form
}

それが役立つことを願っています。何について質問しているのか理解できない場合は、質問しても必ずしも役立つとは限らないため、いくつかのチュートリアルを読むことをお勧めします。

于 2013-02-22T21:23:55.770 に答える