2012-06-22 53 views
0

我刚刚开始搞乱php,我正在测试我的新知识,尝试使用数据库来存储用户名和密码的简单登录页面。一切进展顺利,但我跑进了一堵巨大的墙壁!出于某种原因,我的获取方法$result = $stmt->fetch();没有返回任何结果,即使如果我在phpmyadmin中运行sql查询,它会返回一行就好!这与我从表单或加密获取输入的方式有关吗?通过php和sql检查账户详细信息

这是我的完整代码。谢谢你们要温柔我是全新的,以该哈哈

<?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()'附加一点调试吗?当你做SELECT时,很高兴看到数据库返回的内容 – andrewsi

回答

2

您使用$stmt->bindParam的变量都尚未设置。像这样调整你的代码:

$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()函数,并使用了一个'salt',这似乎使哈希值保持一致。 –

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注入的查询分开。 –