2013-05-28 4 views
0

Я новичок в php. У меня есть сайт для входа в систему, где пользователи регистрируются с помощью своих писем. Каждому присваивается auto-increment user_id. Я хочу получить связанный user_id из базы данных и сохранить его в сеансе, чтобы при отправке контента их user_id можно было получить из сеанса и отправить с содержимым. Однако моя функция «get_user_id» не работает, чтобы искать идентификатор пользователя с их адреса электронной почты. Я пробовал использовать всевозможные команды mysqli из fetch_row, get_result, bind_result, и ничто не вернет user_id.Код Mysqli для получения одного результата и возврата его

function get_user_id($email) { 
    //$email = mysqli_real_escape_string($this->conn, $email); 
    $query = "SELECT id from users where email=?"; 
    if ($stmt = $this->conn->prepare($query)){ 
     $stmt->bind_param('s',$email); 
     if($result = $stmt->execute()){ 
      $row=$result->fetch_row(); 
      return $row['id']; 
     } else return "no ID returned."; 
    } 
} 

Edit: сообщение об ошибке я получаю сейчас: Fatal error: Call to a member function fetch_row() on a non-object

Обновление: Это то, что работает - спасибо RikkusRukkus:

function get_user_id($email) { 
    //$email = mysqli_real_escape_string($this->conn, $email); 
    $query = "SELECT id from users where email=?"; 
    if ($stmt = $this->conn->prepare($query)){ 
     $stmt->bind_param('s',$email); 
     if($result = $stmt->execute()){ 
      $stmt->bind_result($user_id); 
      $stmt->fetch(); 
      return $user_id; 
     } else return "no ID returned."; 
    } 
} 
+0

Предположительно вы проверили базу данных, чтобы убедиться, что адрес, который вы используете существует? – Orbling

+0

Да! Адрес электронной почты существует. Шаг get_user_id происходит после того, как они войдут в систему с их адресом электронной почты (или создайте учетную запись), чтобы письмо было проверено на этом этапе. – thisAnneM

+0

Если подготовка не удалась, ничто не возвращается, судя по этому коду. Возможно, вы захотите вывести сообщение об ошибке, '$ mysqli-> error' - сделать то же самое для идентификатора no, возвращаемого при ошибке' execute() '. – Orbling

ответ

0

Переменная $result будет содержать boolean - ИСТИННЫЙ или ЛОЖНЫЙ.

Вы пытаетесь вызвать функцию fetch_row() на этом буле, которая не будет работать.

Если вы используете подготовленные заявления, вы должны использовать bind_result(), а затем функцию fetch() на $stmt.

Изменение $row=$result->fetch_row(); на $stmt->fetch(); и вместо использования переменной $row, вызовите bind_result(), как описано в примере здесь: http://php.net/manual/en/mysqli-stmt.fetch.php

0

Вы можете написать вам собственный принести метод результата так который может принимать параметры для возврата одного столбца или полной строки.

0
function get_user_id($email) { 
    $query = "SELECT id from users where email=?"; 
    $stmt = $this->conn->prepare($query); 
    $stmt->bind_param('s',$email); 
    $stmt->execute(); 
    $stmt->bind_result($id); 
    $stmt->fetch(); 
    return $id; 
} 

(обработка ошибок не включены, поскольку это увеличит размер кода даже больше)

с PDO код будет в 2 раза меньше (обработка ошибок в комплекте)

function get_user_id($email) { 
    $query = "SELECT id from users where email=?"; 
    $stmt = $this->conn->prepare($query); 
    $stmt->execute(array($email)); 
    return $stmt->fetchColumn(); 
} 

с safeMysql было бы одной строки (обработка ошибок включена)

function get_user_id($email) { 
    return $this->conn->getOne("SELECT id from users where email=?s",$email); 
} 
Смежные вопросы