2013-04-21 2 views
0

У меня простая система входа, и я ничего не получаю при попытке получить количество строк, тот же метод, который использовался для работы все время, я не знаю, что происходит сегодня.MySQLi Num Rows Does not Work

Код:

<?php 
class LoginClass { 
    public $User; 
    public $Pass; 
    public $Query; 
    function Init() { 
     $User = $this->User; 
     $Pass = $this->Pass; 
     if($User != '') 
     { 
      if($Pass != '') 
      { 
       $this->HashPass(); 
      } 
      else 
      { 
       echo 'Please Enter A Password.'; 
      } 
     } 
     else 
     { 
      echo 'Please Enter A Username or E-Mail.'; 
     } 
    } 

    function HashPass() { 
     $Pass = $this->Pass; 
     $this->Pass = hash('sha256', $Pass); 
     $this->CheckUser(); 
    } 

    function CheckUser() { 
     $User = $this->User; 
     if(!filter_var($User, FILTER_VALIDATE_EMAIL)) 
     { 
      $this->Query = 'SELECT * FROM Users WHERE User = "'.$User.'" AND Pass = "'.$this->Pass.'"'; 
     } 
     else 
     { 
      $this->Query = 'SELECT * FROM Users WHERE EMail = "'.$User.'" AND Pass = "'.$this->Pass.'"'; 
     } 
     $this->CheckDB(); 
    } 

    function CheckDB() { 
     $Query = $this->Query; 
     $Connect = new mysqli("127.0.0.1", "root", "", "Data"); 
     $Stmt = $Connect->prepare($Query) 
     $Stmt->execute(); 
     $Stmt->store_result(); 
     echo $Stmt->num_rows; 
     $Stmt->close(); 
     $Connect->close(); 
    } 

    function SetupSession() { 
     echo 'Test'; 
    } 
} 

Чек DB является проблемой здесь, и им возможность повторить эту переменную запроса в этой функции все нормально, вот именно то, что я получаю

SELECT * FROM Users WHERE User = "Test" AND Pass = "532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25"

Я также проверил свою БД, и все мои таблицы настроены правильно, и нет пароля.

+0

только хэширования пароля с SHA256 не достаточно. Вместо этого используйте [bcrypt] (http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php). –

+1

Что такое 'var_dump ($ Stmt);' вывод (перед закрытием)? – bwoebi

+0

@Marcel - Учитывая, что у его базы данных нет пароля root, я сомневаюсь, что это производственная среда. –

ответ

0

ОК, нужно больше места, чем поле для комментариев, этот вопрос явно в этом блоке:

function CheckDB() { 
    $Query = $this->Query; 
    $Connect = new mysqli("127.0.0.1", "root", "", "Data"); 
    $Stmt = $Connect->prepare($Query) 
    $Stmt->execute(); 
    $Stmt->store_result(); 
    echo $Stmt->num_rows; 
    $Stmt->close(); 
    $Connect->close(); 
} 

Я думаю, это потому, что вы не обязательные параметры в подготовленном операторе, вы уже включили их inline в вашем предыдущем заявлении. Таким образом, вы, вероятно, хотите:

Переключить на препарирования заявление

Самый простой вариант здесь будет переключаться на не подготовленные заявления. Замените блок с:

function CheckDB() { 
    $Query = $this->Query; 
    $Connect = new mysqli("127.0.0.1", "root", "", "Data"); 
    $Stmt = $Connect->query($Query) 
    echo $Stmt->num_rows; 
    $Stmt->close(); 
    $Connect->close(); 
} 

слово предостережения при таком подходе вы должны дезинфицировать ввод пользователя в блоке, который определяет $User, в противном случае вы оставляете себя открытым для инъекций MySQL. В этом блоке, измените эту строку:

$User = $this->User; 

к следующему:

$User = mysql_real_escape_string($this->User);