이메일과 비밀번호라는 항목이 있어서 문의하고 싶습니다
<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...