0

私は自分のWebサイトのPHP登録ページを作成しています。現在、登録フォームのアクションに以下のコードを使用しています。現在、ページを更新すると、データベースにデータを送信した後、再送信されます。ヘッダーリダイレクトの使用方法を知っています。これも使用します。同じユーザー名の別のユーザーがいる場合は、スクリプトをデータベースに送信しないようにしたいのですが。IF関数でこれを行うにはどうすればよいですか?

<?php
include 'dbconnect.php';
$birth_year= $_POST['year'];
$birth_month= $_POST['month'];
$birth_day= $_POST['day'];
$birthday=$_POST['year'].'-'.$_POST['month'].'-'.$_POST['day'];
$password=md5($_POST['password']);
$sql = "INSERT INTO users      (first_name,last_name,username,password,email,gender,birthday) VALUES (:first_name,:last_name,:username,:password,:email,:gender,:birthday)";
$q = $conn->prepare($sql);
$q->execute(array(':first_name'=>$_POST['first_name'],
          ':last_name'=>$_POST['last_name'],
          ':username'=>$_POST['username'],
          ':password'=>$password,
          ':email'=>$_POST['email'],
          ':gender'=>$_POST['gender'],
          ':birthday'=>$birthday));
?>
4

3 に答える 3

2

行数を取得します。ここでusername=$_POST['username']:

$username = $_POST['username'];
$checkexisting = $conn->prepare("SELECT COUNT(*) FROM users WHERE username=:username");

if($checkexisting->execute(array(':username' => $username))->fetchColumn() == 0) {
  // username does not exist
  // fetch column returns the first column from the select statement, which is COUNT(*)
}

または、ユーザー名列を一意の ID にします。これにより、データベース内でこの列の値が重複するのを直接防ぐことができます。その場合、SQL ステートメントがエラーをスローするように準備する必要があります。

また、フォームを更新して再送信しないようにするために、POST/REDIRECT/GET を使用した John の回答を参照してください。

于 2013-03-07T15:39:29.513 に答える
1

スクリプトは「データベースに送信」されません。スクリプトはクエリを実行して、データベースに行を INSERT しようとします。ユーザー名を一意にする場合は、一意のインデックスにします。SQL INSERT ステートメントは失敗し、その特定のエントリが既に存在することを示すコードが返されます。

于 2013-03-07T15:39:59.110 に答える
0

POSTを介して読み込まれたページにより、ブラウザはユーザーに情報を再送信してページを表示するように求め、そのページによって実行されるアクションが再度発生します。

これを回避する最善の方法は、POST / REDIRECT/GETパターンを使用することです。Authorize.Net用に作成した支払いの処理に関する例で使用しました。うまくいけば、それはあなたを正しい方向に向けます。

于 2013-03-07T15:37:42.870 に答える