PHP SQLi Новичок Проблема.Получить не вернул True - PullRequest
2 голосов
/ 28 февраля 2011

Я супер новичок в PHP.Просто начал писать сценарии неделю назад.У меня проблема с функцией, которая не возвращает true, хотя данные кажутся правильными.Я провел день + в поисках ответов.

Вот сокращенный класс.

public function verifyPost()
{
 try
 {
  if(!$this->verifyDatabase())
    throw new Exception('Invalid Username Password');

  $this->access = 1;
 }
 catch(Exception $e)
 {
  $this->errors[] = $e->getMessage();
 }
}

public function verifySession()
{
 if($this->sessionExist() && $this->verifyDatabase())
    $this->access = 1;
}

public function verifyDatabase() 
{
 /* connect to db */ 
 $mysqli = new mysqli ("localhost", "user", "password", "world");  

 /* check connection */ 
 if (mysqli_connect_errno()) { 
        printf("Connect failed: %s\n", mysqli_connect_error()); 
        exit(); 
 } 

 /* create prepare statement */ 
 $stmt = $mysqli->prepare("SELECT ID FROM user WHERE id1 = ? AND id2 = ?"); 
 $stmt->bind_param('ss', $this->id1, $this->id2); 

 /* execute prepared statement */ 
 $stmt->execute(); 

 /* bind variables to prepared statement */ 
 $stmt->bind_result($col1); 

 /* check user info in db and assign returned ID to variable*/ 
 if(($stmt->fetch()) != 0) {
        $this->userid = $col1; 
        return true;
 } else {
        return false;
 }

 /* close statement and connection */ 
 $stmt->close(); 

 /* close connection */ 
 $mysqli->close();
}

(я не вставил реальную информацию о подключении к БД)

По какой-то причине $ access не устанавливается в verifySession () bc verifyDatabase () не делаетверните истину.VerifyDatabase () проходит через нормально.Он находит User / Pass в БД и не выдает исключение.Проблема возникает в заявлении IF.Я выделил его здесь, закомментировав весь оператор IF за исключением «return true;», и verifySession () устанавливает $ access в 1.

Теперь я подумал, что это может быть fetch (), поэтому явместо этого попробовал num_rows () и до сих пор не возвращает true.

Надеюсь, это имеет смысл.Дайте мне знать, если мне нужно уточнить больше.Любая помощь высоко ценится!!Спасибо!

1 Ответ

3 голосов
/ 28 февраля 2011

$ stmt-> fetch может возвращать три значения: TRUE, FALSE и NULL.

TRUE = Успех и данные были получены ЛОЖЬ = произошла ошибка NULL = больше нет строк / данных или усечение данных произошло

Вы должны использовать оператор triple =, который также выполняет проверку типа, например.

if($stmt->fetch() === true) {
  $this->userid = $col1; 
  return true;
} else
  return false;

Или, так как эти FALSE и NULL никогда не оценятся в true, вы можете просто написать

if($stmt->fetch()) {
...