2016-12-21 10 views
0

これは、ユーザがユーザ名でログインするユーザログインのコードラインです。私は電子メールIDまたはユーザー名の両方からユーザーがログインできるように編集したいと思う。私は2つの名前を使用する必要があると思うが、構文は正しいとは思わない。そうする方法を教えてください。入力タイプに複数の名前を使用する

if (isset($_POST["user_login"]) && isset($_POST["password_login"])) { 
    $user_login = preg_replace('#[^A-ZA-z0-9]#i', '',$_POST["user_login"]); //filter everything but numbers and letters 
    $password_login = preg_replace('#[^A-ZA-z0-9]#i', '',$_POST["password_login"]);//filter everything but number and letter 
$password_login_md5 = md5($password_login); 
$sql = mysql_query("SELECT id FROM users WHERE username='$user_login' AND password='$password_login_md5'LIMIT 1");//query whether user exists 
//Check for their existence 
$userCount = mysql_num_rows($sql);//Count the number of rows entered 
if ($userCount ==1){ 
    while ($row =mysql_fetch_array($sql)) { 
    $id = $row["id"]; 
    } 
    $_SESSION["id"] = $id; 
    $_SESSION["user_login"] = $user_login; 
    $_SESSION["password_login"] = $password_login; 
    header("location: welcome.php"); 
    exit(); 
}else { 
    echo 'Information is incorrect, try again'; 
    exit(); 
} 
} 
?> 
<div style="width: 800px; margin: 0px auto 0px auto;"> 
<table> 
    <tr> 
    <td width="60%" valign="top"> 

<form action="index.php" method="POST"> 
    <input type="text" name="user_login" size="25" placeholder="Username"><br> 
    <input type="password" name="password_login" size="47" placeholder="Password"><br><br> 
    <input type="submit" name="login" value="Login"> 
</form> 
    </td> 
+0

変更する必要があるコードは、HTMLだけではありません。ログインを処理するクエリを含め、バックエンドを変更する必要があります。 –

+1

は、この問題をフォームページではなく処理ページで処理します。データに@が含まれている場合は、strpos()を使用してチェックを行うことができます。そうであれば、適切な電子メール構文をチェックし、有効であればユーザー名ではなく電子メールと見なしてください。 – Abela

+0

バックエンドのものが残っているこのコード行には – sanchit

答えて

2

実際にこのタイプのチェックは、バックエンド/処理ページで処理する必要があります。

な準たとえば以下のように簡単なチェック、それが得ることができると同じくらい簡単です:(明らかに追加のセキュリティ検証が必要です)

if(filter_var($_POST["user_login"], FILTER_VALIDATE_EMAIL)) { 
    $sql_prepare = 'SELECT id FROM users WHERE email = ? AND password = ? LIMIT 1'; 
} 
else { 
    $sql_prepare = 'SELECT id FROM users WHERE username = ? AND password = ? LIMIT 1'; 
} 

しかし、ええ、これは本当にの程度としては簡単ですあなたの事件を解決する方法です。

0

あなたはユーザー名でユーザー入力に基づいて別のクエリを作成する必要があります。

if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
    // is email 
    $sql = mysql_query("SELECT id FROM users WHERE email='$user_login' AND password='$password_login_md5'LIMIT 1");//query whether user exists 
} else { 
    // not email 
    $sql = mysql_query("SELECT id FROM users WHERE username ='$user_login' AND password='$password_login_md5'LIMIT 1");//query whether user exists 
} 
+0

コードを完全に変更してください 少し混乱しました – sanchit

+0

これは特に指定されていないので、このようなsqlクエリの途中で変数を削除すると、あなたの将来に。 – castis

0

あなたはこのような何かにあなたのSQLを変更したいと思います。それは一致のための電子メールとユーザー名フィールドの両方を比較します。

$sql = "SELECT id FROM users WHERE (username='$user_login' OR email='$user_login') AND password='$password_login_md5' LIMIT 1"; 

また、代わりにmysql_*機能のPDOを使用することを検討し、パスワードをハッシュの代わりmd5()を使用することを検討すべきです。

0

メール確認用のfilter_var機能を使用して少し確認できます。関数がfalseを返す場合、それは間違いなく有効な電子メールになることはありません。これに基づき、あなたは少し、次のコードのようなあなたのクエリを変更することができます。

function is_email($str) { 
    return filter_var($str, FILTER_VALIDATE_EMAIL); 
} 

if(is_email($user_login)) { 
    $sql = mysql_query("SELECT id FROM users WHERE email ='{$user_login}' AND password = '{$password_login_md5}' LIMIT 1"); 
} else { 
    $sql = mysql_query("SELECT id FROM users WHERE username = '{$user_login}' AND password = '{$password_login_md5}' LIMIT 1"); 
} 

をあなたのための任意の混乱を避けるために、私は、既存のコードにいくつかのことを変更することで、ここで全体のコードを掲示しています:

function is_email($str) { 
    return filter_var($str, FILTER_VALIDATE_EMAIL); 
} 

if(isset($_POST["user_login"]) && isset($_POST["password_login"])) { 
    $user_login = preg_replace('#[^A-ZA-z0-9]#i', '', $_POST["user_login"]); //filter everything but numbers and letters 
    $password_login = preg_replace('#[^A-ZA-z0-9]#i', '',$_POST["password_login"]); //filter everything but number and letter 
    $password_login_md5 = md5($password_login); 

    if(is_email($user_login)) { 
     $sql = mysql_query("SELECT id FROM users WHERE email ='{$user_login}' AND password = '{$password_login_md5}' LIMIT 1"); 
    } else { 
     $sql = mysql_query("SELECT id FROM users WHERE username = '{$user_login}' AND password = '{$password_login_md5}' LIMIT 1"); 
    } 

    $userCount = mysql_num_rows($sql); //Count the number of rows entered 

    if($userCount ==1) { 
     while ($row =mysql_fetch_array($sql)) { 
      $id = $row["id"]; 
     } 
     $_SESSION["id"] = $id; 
     $_SESSION["user_login"] = $user_login; 
     $_SESSION["password_login"] = $password_login; 
     header("location: welcome.php"); 
     exit(); 
    } else { 
     echo 'Information is incorrect, try again'; 
     exit(); 
    } 
} 

また、あなたのコードについて注意を喚起したいと思います。

  1. $user_loginの正規表現は、数字とアルファベットしか使用できないため削除してください。これは電子メール形式を受け入れません。 #[^[email protected]_.]#iのような正規表現を渡して、@,_.などの他の文字を受け入れることもできます。入力を許可された文字のみに制限する場合は同様です。
  2. 廃止予定のmysql拡張子を使用しないでください。 mysqliまたはPDOを使用してください。
  3. SQL注入攻撃を避けるには、mysqliまたはPDOにprepared statementを使用してください。

希望します。

+0

それは未定義の変数のユーザー名は – sanchit

+0

笑、何回も転記されたことを再投稿する方法を言う。 – Abela

+0

'$ username'ではなく' $ user_login'でなければなりません。今すぐコードを修正しました。 – Perumal

関連する問題