이메일 또는 사용자 이름 로그인

WBOY
풀어 주다: 2016-09-22 08:56:48
원래의
1502명이 탐색했습니다.

이메일과 비밀번호라는 항목이 있어서 문의하고 싶습니다

<code>$email = $_POST['email'];
$password = $_POST['password'];
$login     = mysql_query("SELECT * FROM `users`
JOIN `users_profile` USING (id)
WHERE `email` = '".$email."' AND `password` = '".$password."' 
OR `username` = '".$email."' AND `password` = '".$password."'
</code>
로그인 후 복사
로그인 후 복사

위는 내 로그인 구문입니다
사용자가 이메일 또는 비밀번호 쌍을 입력한다고 가정하면 로그인이 성공합니다.

<code>`email` = '".$email."' AND `password` = '".$password."' 
</code>
로그인 후 복사
로그인 후 복사

그러나 사용자가 올바른 사용자 이름과 비밀번호를 입력하면 계속 로그인할 수 있습니다.

<code>`username` = '".$email."' AND `password` = '".$password."'
</code>
로그인 후 복사
로그인 후 복사

위 구문은 이메일과 비밀번호로만 로그인할 수 있다는 점 뿐입니다
사용자 이름과 비밀번호로 로그인하면 실패합니다
JOIN users_profile을 확인하고 해당 ID를 문제 없이 사용하세요
무엇이 문제인가요?

답글 내용:

이메일과 비밀번호라는 항목이 있어서 여쭤보고 싶습니다.

<code>$email = $_POST['email'];
$password = $_POST['password'];
$login     = mysql_query("SELECT * FROM `users`
JOIN `users_profile` USING (id)
WHERE `email` = '".$email."' AND `password` = '".$password."' 
OR `username` = '".$email."' AND `password` = '".$password."'
</code>
로그인 후 복사
로그인 후 복사

위는 내 로그인 구문입니다
사용자가 이메일 또는 비밀번호 쌍을 입력한다고 가정하면 로그인이 성공합니다.

<code>`email` = '".$email."' AND `password` = '".$password."' 
</code>
로그인 후 복사
로그인 후 복사

그러나 사용자가 올바른 사용자 이름과 비밀번호를 입력하면 계속 로그인할 수 있습니다.

<code>`username` = '".$email."' AND `password` = '".$password."'
</code>
로그인 후 복사
로그인 후 복사

위 구문은 이메일과 비밀번호를 입력해야만 로그인이 가능하다는 점 뿐입니다
사용자 이름과 비밀번호를 입력하여 로그인하면 실패합니다
JOIN users_profile을 확인하고 아이디를 문제없이 사용하세요
무엇이 문제인가요?

OR 사용 시 괄호 추가에 주의하세요.

<code class="sql">SELECT * FROM `users`
JOIN `users_profile` USING (id)
WHERE (`email` = '".$email."' AND `password` = '".$password."') 
OR (`username` = '".$email."' AND `password` = '".$password."')</code>
로그인 후 복사

그러나 이러한 SQL은 사용하지 않는 것이 좋습니다.

먼저 코드에 정규 표현식을 사용하여 사용자가 이메일 또는 사용자 이름을 입력했는지 확인할 수 있습니다. 이메일인 경우 이메일 필드를 사용하여 쿼리하고, 그렇지 않으면 사용자 이름 필드를 사용합니다.

참고: http://tool.oschina.net/regex#

우선 귀하의 코드에는 쉽게 SQL이 주입될 수 있습니다. 최소한 mysqli는 사용해주세요. 개인적으로는 PDO를 적극 추천합니다.

그러면 내 개인적인 생각은 프런트 엔드 페이지의 양식에 다음과 유사한 입력이 있다고 가정하는 것입니다.

<code><input name="login" type="text" class="form-control" placeholder="用户名或者邮箱"></code>
로그인 후 복사

여기서 name="login"을 사용하여 email 또는 username을 대체한 다음

<code>$field = filter_var($_POST['login'],FILTER_VALIDATE_EMAIL) ? 'email':'username';
// 这里的 $field 就是你的 欄位 (这边翻译为 字段 )</code>
로그인 후 복사

그러면 SQL 문은 아마도 다음과 같을 것입니다.

<code>$email = $_POST['email'];
WHERE `".$field."` = '".$email."'</code>
로그인 후 복사

다시 한번 말씀드리지만 글을 쓰는 방식은 매우 위험합니다.

참고자료: http://php.net/manual/en/func...

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿