2012-06-22 2 views
0

저는 최근에 PHP로 엉망이되었습니다. 사용자 이름과 암호를 저장하는 데이터베이스를 사용하여 간단한 로그인 페이지를 만들려고 노력하면서 새로운 지식을 테스트하고있었습니다. 모두 잘 가고 있었지만 거대한 벽을 만났습니다! 웬일인지 내 fetch 메서드 $result = $stmt->fetch();이 phpMyAdmin에서 sql 쿼리를 실행해도 결과를 반환하지 않습니다. 이것은 폼이나 암호화로부터 입력을 얻는 방법과 관련이 있습니까?php 및 sql을 통한 계정 정보 확인

여기 내 전체 코드입니다. 고마워 내가 아직 설정되지 않은 변수에 대한 당신은 $stmt->bindParam을 사용하고있는이 하하

<?php 
include 'inc/db.inc.php'; 
$link = new PDO(DB_INFO, DB_USER, DB_PASS); 

?> 

<!DOCTYPE html> 
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]--> 
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]--> 
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]--> 
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]--> 
<head> 
    <meta charset="utf-8"> 

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 

    <title></title> 
    <meta name="description" content=""> 

    <meta name="viewport" content="width=device-width"> 


    <link rel="stylesheet" href="css/style.css"> 

<script src="js/libs/modernizr-2.5.3.min.js"></script> 
</head> 
<body> 
<?php 
if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['register'])) { 
$sql = "INSERT INTO account (account_name, account_pass) VALUES (:name, :pass)"; 
$stmt = $link->prepare($sql); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':pass', $pass); 
$name = $_POST["username"]; 
$pass = md5($_POST["password"]); 
$stmt->execute(); 

echo "Thank you for registering!"; 
} else if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['login'])) { 
$sql = "SELECT account_name, account_pass FROM account WHERE account_name=:name AND account_pass=:pass"; 
$stmt = $link->prepare($sql); 
$stmt->bindParam(':name', $name, PDO::PARAM_STR); 
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR); 
$pass = strip_tags(md5($_POST["password"])); 
$name = strip_tags($_POST["username"]); 
$stmt->execute(); 
$result = $stmt->fetch(); 
print_r($result); 

if(empty($name) || empty($pass)){ 
echo "please enter a username and password!"; 
} else { 
if(empty($result)){ 

echo "yes"; 
} else { 
echo "no"; 
} 
} 

} else { 
?> 
<form method="post" action="test.php"> 
<label for="username">Username: </label> 
<input type="text" name="username" /> 
<label for="password">Password: </label> 
<input type="password" name="password" /> 
<input type="submit" name="login" value="Login" /> 
<input type="submit" name="register" value="register" /> 
</form> 
<?php } ?> 
</body> 
</html> 
+0

MySQL은, 또는 무엇을 사용하고 있지 않다 할 것 ...? – Fallenreaper

+0

'fetch()'주변에 약간의 디버깅을 추가 할 수 있습니까? 선택을 할 때 데이터베이스가 반환 한 것을 보니 좋을 것입니다. – andrewsi

답변

2

에 새로운 브랜드 해요 부드럽게. 다음과 같이 코드를 조정하십시오.

$sql = "SELECT account_name, account_pass FROM account WHERE account_name=:name AND account_pass=:pass"; 
$pass = strip_tags(md5($_POST["password"])); 
$name = strip_tags($_POST["username"]); 
$stmt = $link->prepare($sql); 
$stmt->bindParam(':name', $name, PDO::PARAM_STR); // $name needs to be set before this 
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR); // $pass needs to be set before this 
$stmt->execute(); 
$result = $stmt->fetch(); 
print_r($result); 
+0

도움을 주셔서 감사합니다! 내 문제가 내가 암호를 해싱하고있는 중이고 crypt() 함수로 전환하고 해시 값을 일관되게 유지하는 것처럼 보이는 '소금'을 사용한다는 것을 발견했습니다. –

0

매개 변수를 바인딩하기 전에 변수를 설정하지 않으시겠습니까?

$pass = strip_tags(md5($_POST["password"])); 
$name = strip_tags($_POST["username"]); 
$stmt->bindParam(':name', $name, PDO::PARAM_STR); 
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR); 
+0

중복 응답 –

0

매우 재미있는 방법이 있습니다. ㅎ.

난 그냥

$resource = mysql_query($sql); 
if(!$resource){ 
    die("query error: ".mysql_error()); 
} 
$count = mysql_num_rows($resource); 
if($count > 0){ 
    //match found. 
}else{ 
    //incorrect login. 
} 

같은 어쩌면 난 그냥 당신의 구문

+0

PDO는 SQL 인젝션을 방지하는 쿼리에서 사용자 입력을 분리하므로 더 좋은 방법입니다. –