2016-03-29 2 views
-1

Прежде всего, это как-то связано с .PDO fetch (PDO :: FETCH_ASSOC) не возвращает значения

Я пытаюсь сохранить значения из базы данных в свои переменные $ _SESSSION. Сначала я попытался выбрать все строки, где username = user и password = password и т. Д.

Если он возвращает> 0, я попытался извлечь (PDO :: FETCH_ASSOC), чтобы получить его строки. Проблема в том, что она возвращает> 0, она FETCH_ASSOC не возвращает значения мне.

Вот что я пробовал до сих пор.

<?php 
if(isset($_POST['btn_Save'])){ 
    $uname = $_POST['username']; 
    $pword = $_POST['password']; 
    $q = "SELECT * FROM `users` WHERE `username` = :username AND `password` = :password"; 
    $sql = $db->prepare($q); 
    $sql->bindParam(":username",$uname); 
    $sql->bindParam(":password",$pword); 
    $sql->execute(); 
    $rows = $sql->fetch(PDO::FETCH_NUM); 
    if($rows > 0){ 
    $rows2 = $sql->fetch(PDO::FETCH_ASSOC); 
    echo $rows2['userID']; 
    $_SESSION['account'] = $rows2['userID']; 
    $_SESSION['name'] = $rows2['firstName']; 
//echo" <meta http-equiv='refresh' content='0;url=index.php'>"; 
    } 
    else{ 
    echo"<script>alert('No user found!');</script>"; 
    // echo" <meta http-equiv='refresh' content='0;url=index.php'>"; 

    } 
+1

Удалить «$ rows = $ sql-> fetch (PDO :: FETCH_NUM); if ($ rows> 0) {'часть из вашего кода и использовать' $ rows2 = $ sql-> fetch (PDO :: FETCH_ASSOC); if (count ($ rows2)> 0) {' – Saty

+1

Пожалуйста, не храните свои пароли в открытом виде в базе данных - это огромная проблема конфиденциальности, что владелец сервера может видеть все пароли. Вы можете использовать ['password_hash()'] (http://www.php.net/password_hash) и ['password_verify()'] (http://www.php.net/password_verify), чтобы хэшировать пароли (и unencryptable) в базе данных. Если ваша версия PHP <5.5, вы можете использовать [password_compat] (https://github.com/ircmaxell/password_compat), который будет работать в PHP> = 5.3.7. Если ваша версия старше, вы должны обновить свою установку в виде всплывающей поддержки 5.3 в августе 2014 года. – h2ooooooo

+0

Спасибо. Это будет иметь в виду в следующий раз. – Jerlon

ответ

0

PDO::FETCH_NUM:

возвращает массив, индексированный по номеру столбца, возвращаемый в вашем наборе результат , начиная со столбца 0

Так не может сравнить массив с вашей, если условие ниже

$rows = $sql->fetch(PDO::FETCH_NUM); 
if($rows > 0){ 

В вашем коде вы пытаетесь fetch data two times. Вы можете сделать это в один раз

Используйте его как

$q = "SELECT * FROM `users` WHERE `username` = :username AND `password` = :password"; 
$sql = $db->prepare($q); 
$sql->bindParam(":username", $uname); 
$sql->bindParam(":password", $pword); 
$sql->execute(); 

$rows2 = $sql->fetch(PDO::FETCH_ASSOC); 
if (count($rows2) > 0) { 
    $_SESSION['account'] = $rows2['userID']; 
    $_SESSION['name'] = $rows2['firstName']; 
    //echo" <meta http-equiv='refresh' content='0;url=index.php'>"; 
} else { 
    echo"<script>alert('No user found!');</script>"; 
    // echo" <meta http-equiv='refresh' content='0;url=index.php'>"; 
} 

Читайте о rowCount

Кроме того, вы сохраняете в базе данных простой пароль

метод чтения хеширования паролей

http://php.net/manual/en/function.password-hash.php

http://php.net/manual/en/faq.passwords.php

+1

Спасибо, Сати! Я никогда не думал, что «FETCH_ASSOC» вернет любое целое число. – Jerlon

+0

Я одобрил ваш комментарий. Я не спускался вниз. – Jerlon

+0

Настоящая проблема с этим кодом - двойная выборка, которую вы исправили, но не упомянули. –

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