php
  • mysql
  • database
  • select
  • 2012-04-16 6 views 0 likes 
    0

    ウェブサイトを登録しているユーザーが、誰も入力していない一意の16桁の番号を入力したことを確認する必要があります。MySQLとPHPを使用したユニークな入力確認

    関連するデータベース情報は、16桁の番号は、テーブル全体の名前はusersで、ユーザが入力した番号が$card1に格納され、card1という列に格納されていることです。ここで

    $query2 = "SELECT card1 FROM users WHERE card1='$card1' LIMIT 1"; 
    $result2 = smart_mysql_query($query2); 
    
    if (mysql_num_rows($result2) != 0) 
    {    
        header ("Location: register.php?msg=exists"); 
        exit(); 
    } 
    

    アイデアは、それがデータベースにすでに任意の例を見つけることです...私がこれまで持っているものであり、それは重複が見つかった場合、それが表示され、エラーメッセージが表示されます。

    問題は、重複があっても登録を続けて(登録フォームをDBに提出できるようにする)ことです。このコードブロックの直後に、フォームから収集されたすべてのユーザー情報を含むdbへの挿入呼び出しが行われます。

    注:私はPHPエラーメッセージの処理に慣れていません。私が使ったことは、サンプルコードの別のインスタンスで見つかった例です。

    答えて

    3

    このようなif文行います。これを行うには正しい方法は、その使用回数を保持するフィールドに一意のインデックスを追加することです

    $query2 = "SELECT * FROM users WHERE card1='$card1'"; 
    $result2 = mysql_query($query2); 
    
    if ($result2 !== false) 
    {    
        header ("Location: register.php?msg=exists"); 
        exit(); 
    } 
    

    する問題を修正する必要があります:)

    +0

    を試してみてください。異なるif文は何を達成しますか? – Mike

    +0

    mysqlデータベースが0行を返すと、PHPスクリプトはbooleanを返します。これはfalseに設定されます。このif文は、クエリの結果がfalseであるかどうか、およびエラーをスローしたかどうかをチェックします。 – Manuel

    +0

    新しいコードを試してください。私はクエリを少し変更し、smart_mysql_queryはmysql_queryになりました – Manuel

    2

    card1)と入力しました。

    次に、SELECTを試みることなくINSERT新しい行を試してみます。この操作が失敗した場合は、ユーザーをmsg=existsページにリダイレクトします。これにより、データベースで重複検出が処理され、メソッドに固有の問題が取り除かれます.2人のユーザーが同じ番号を同時に送信すると、SELECT - >INSERTがそれを検出する保証はありません。ユニークなインデックスがこれを検出して防止します。

    これには、これを実現するために1つのクエリだけが実行されるため、データベースのトラフィックが削減されるという利点もあります。

    +0

    この解決策はうまくいくが、INSERTステートメントが失敗した理由を判断するのが難しくなり、そのエラー状態に応じてユーザーに意味のあるメッセージを返すことが難しくなる。 –

    +0

    @rkosegiが下に投稿した答えと同様の考えですか? – Mike

    +0

    @AndreLackmannそれはそれが多大な問題を引き起こすかどうかわかりません。同じ番号のユーザーがすでに存在している可能性はありません。そのユーザーに通知して、別のユーザーを再送信することはできますか? – Mike

    0

    まず、この列のDBにユニークなインデックスを作成します。

    $query2 = "SELECT COUNT(1) FROM users WHERE card1='$card1'"; 
    $res = mysql_query($query2); 
    
    $data = mysql_fetch_array($res); 
    
    if ($data == 1) 
    {    
        header ("Location: register.php?msg=exists"); 
        exit(); 
    } 
    

    それは、テーブル内の行が存在するかどうかを確認し、存在する場合(0または1

    を返します。次のように私はあなたのSQLを変更する必要があり

    ALTER TABLE `users` 
    ADD UNIQUE INDEX `card1` (`card1`); 
    

    : これがベストプラクティスです1)あなたにリダイレクトされます。

    +0

    '$ res'はどこから来ますか? – Mike

    0

    は、私はあなたの両方のバージョンが答える試みた、それはまだ働いていない、この1

    $query2 = "SELECT card1 FROM users WHERE card1='".$card1."' LIMIT 1"; 
    $result2 = mysql_query($query2); 
    
    if (mysql_num_rows($result2) > 0) 
    {    
        header ("Location: register.php?msg=exists"); 
        exit(); 
    } 
    
    関連する問題