2012-06-22 11 views
0

Я недавно начал общаться с php, и я тестировал свои новые знания, пытаясь сделать простую страницу входа, используя базу данных для хранения имени пользователя и пароля. Все шло хорошо, но я столкнулся с огромной стеной! По какой-то причине мой метод извлечения $result = $stmt->fetch(); не возвращает никаких результатов, даже если я запустил sql-запрос в phpmyadmin, он возвращает строку просто отлично! Это связано с тем, как я получаю входные данные из формы или шифрования?Проверка сведений о счете через 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() и использовал «соль», которая, похоже, теперь сохраняет хеш-значение. –

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

Duplicate Answer –

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-инъекции. –

Смежные вопросы