0

私はPHPの初心者で、ユーザーが名、姓、メールアドレスを追加するシステムを作成しようとしています。基本的に私がやろうとしているのは、電子メールがデータベースにすでに存在するかどうかを確認することです。

何時間も働いていますが、うまくいきません。しかし、名と姓を確認しようとすると、両方とも機能します。

しかし、電子メールフィールドでは...コードは重複する値があることを比較できません。データベースには重複する電子メールIDがたくさんありますが、コードはそれを無視して値:/を挿入します。一方、重複する名と姓を確認しようとすると、機能します

助けてください:(

$firstname=$_POST['firstname'];
$lastname=$_POST['lastname'];
$email=$_POST['email'];
$firstname= stripslashes($firstname);
$lastname= stripslashes($lastname);
$email= stripslashes($email);
$host="localhost";
$user="root";
$pass="";
$db="site";
$link=mysql_connect($host,$user,$pass);
mysql_select_db($db,$link);
$test="SELECT * FROM email_list WHERE email = '$email' ";   

$select=mysql_query($test);
if(mysql_num_rows($select)>0)       
{
    echo "Email already exists".$email."<br>";
    echo "Please enter another email";
}
else
{
    $query="INSERT into email_list (first_name, last_name, email) values ('$firstname', '$lastname', '$email')";
    mysql_query($query);
    echo "values entered" .$firstname. "<br>". $lastname. "<br>". $email;   
}
4

5 に答える 5

0

まず第一に、あなたの質問の下のコメントから読むことができるように、あなたの質問mysql_*はもはや推奨されていません. mysqli_*手続き型のアプローチが好きな場合は、代わりに関数を試してください。ただし、それは重要ではありません。

上記のコードには明らかなエラーはないようですが、生の入力をデータベースに挿入することは危険です。(少なくとも) INSERT および SELECT ステートメントを変更して、すべてのテキスト入力がmysql_real_escape_string()関数で囲まれるようにする必要があります。select ステートメントは次のようになります。

"SELECT * FROM email_list WHERE email = '".mysql_real_escape_string($email)."' ";

それはコードの動作を変更しません。誰かが $email フィールドに意味のない入力をした場合、(コードをクラッシュさせることなく) 入力したとおりに保存されるか、mysql を「ハッキング」(注入) しようとした場合にのみ確認します。クエリを実行しても成功しません。

私はここで(作業する情報が多すぎないため)テーブルのemailフィールドemail_listが短すぎると推測しています-そして、入力された電子メールアドレスの最初の16文字しか保存していない可能性があります-これは、入力したjoe@test.comjoe@test.cと比較しているため、電子メール アドレスが存在します (emailフィールドが次のように定義されている 場合)。char(10)

于 2013-03-17T09:47:22.543 に答える
0

基本的なデバッグ手順:

  1. mysql_query() 失敗する可能性があります。あなたはそれをテストしません。試して:

    $select=mysql_query($test);
    if(!$select){
        die(mysql_error());
    }
    
  2. が 0 より大きくならない場合mysql_num_rows()は、それが何であるかを調べる必要があります。

    var_dump(mysql_num_rows($select));
    

    この機能は、考えられるすべての構成で機能するわけではありません。

  3. SELECT クエリを実行しますか? 結果セットが気になりませんか? すべての行を取得して印刷します。

さらに:

  • より多くの SQL がありますSELECT * FROM table。カウントしたい場合は、SQL でカウントできます。

    SELECT COUNT(*) AS dupes FROM email_list
    
  • 次の主要な PHP リリースが公開されたときに削除される MySQL 拡張機能を使用しています。

  • 私はそこに見えstripslashes()ます。魔法の引用符機能は煩わしく、役に立たず、非推奨です。

  • PHP で SQL インジェクションを防止する方法を読んで理解してください。.

于 2013-03-17T09:47:28.733 に答える
0

すべて問題ないように見えますが、データベースで定義された電子メールの長さを確認し、送信しているものと一致する場合は、フォームに受け入れられている電子メールを印刷してみてください。お気に入り

Print $email ;

そして、「mysql」のすべての名前を「mysqli」に変更することをお勧めします

于 2016-07-16T20:08:43.740 に答える
0

mysql_query と mysql は一般的に避けるべきだと指摘する人に強く同意します (また、遅かれ早かれ非推奨になるため)。MySQLi などに切り替えたい。これは、エラーをチェックしていないということです。データベースへの接続は失敗しますか? 君が知ることはないだろう。$test失敗しますか? あなたも決して知らないでしょう。" " を使用してデバッグしてみてくださいor die()(注意: または die(); は強くお勧めしません! ただし、本番環境で使用されていない場合は、それで十分です)。

mysql_select_db($db,$link) or die("cannot open db");
$select=mysql_query($test) or die ("cannot select the email");

EDIT:電子メールがデータベースにあるかどうかを確認するには、おそらくそれを行う関数が必要です。または、関数に入れたくない場合は、この方法で編集してみてください

$test="SELECT * FROM email_list WHERE email = '$email' ";   
$select=mysql_query($test);
if(mysql_num_rows($select)!=0) //different from 0   
{
    echo "Email already exists".$email."<br>";
    echo "Please enter another email";
}

これが役立つことを願っています。

于 2013-03-17T09:48:10.647 に答える
0

「$email」変数を括弧で囲んだところ、うまくいきました。

$test= "SELECT Password FROM persons WHERE Email=('$email')";
于 2016-07-16T19:55:20.960 に答える