2013-12-02 5 views
0

У меня этот код, но когда я пытаюсь его использовать, он дает мне сообщение об ошибке «Неустранимая ошибка: нельзя использовать объект типа mysqli_stmt as array». Я пытаюсь найти имя пользователя, которое прилагается к письму, кто бы ни пытался войти.Вход в PHP дает мне фатальную ошибку?

  <?php if($_SERVER['REQUEST_METHOD'] == 'POST') 
    { 
     session_start(); 
     $sql = new mysqli('hostname', 'dbname', 'username', 'password'); 
     $email = $_POST['email']; 
     $password = $_POST['password1']; 
     if(empty($email)) 
     { 
      echo "<p>Email cannot be empty.</p>"; 
     } 
     else if(empty($password)) 
     { 
      echo "<p>Password cannot be empty.</p>"; 
     } 
     else 
     { 
      $hashinserted = hash('sha512', $password); 
      $db = $sql->prepare("SELECT Email, Password, Username FROM Users WHERE Email = ? AND Password = ? "); 
      $db->bind_param('ss', $email, $hashinserted); 
      $db->execute(); 
      $db->bind_result($email, $username, $hashinserted); 
      $db->store_result(); 
      if($db->num_rows == 1) //To check if the row exists 
      { 
        $data = $db->fetch_assoc(); 
        $username = $data["Username"]; 
        $_SESSION['username'] = $username; 
        $_SESSION['loggedin'] = true; 
        $_SESSION['email'] = $email; 
        header('Location:index.php'); 
        exit(); 
      } //check for results 
      else 
      { 
       echo "Whoops! You entered incorrect log in credentials. Try again."; 
      } //end incorrect information else 
      $db->close(); 
      $sql->close(); 
     } //end login else 
    } //end server if 

?> 
+1

Какая строка является ошибкой? – qwertynl

+0

Он говорит строку 77, но я не думаю, что есть строка 77. – moonlightdreamer

+1

Sidenote: Люди обычно называют соединение с базой данных для '$ db' и запросы для' $ sql', '$ query' или что-то другое. Вы называете это довольно назад. – OptimusCrime

ответ

1

Порядок аргументов в конструкторе неправильно. Порядок должен быть host, user, password, database.

$sql = new mysqli('hostname', 'dbname', 'username', 'password'); -- WRONG 

$sql = new mysqli('hostname', 'username', 'password', 'dbname'); -- RIGHT 

Подготовить() и выполнить() возвращает ложные об ошибках. Вы всегда должны проверить возвращаемое значение для этого. Например:

$db = $sql->prepare("SELECT Email, Password, Username FROM Users 
    WHERE Email = ? AND Password = ? "); 
if ($db === false) { 
    trigger_error($sql->error, E_USER_ERROR); 
} 

Для извлечения строк вы перепутали два разных способа извлечения. Вы используете bind_result(), но затем пытаетесь получить строку данных как ассоциативный массив. Используйте один или другой метод получения результатов.

Один метод, чтобы связать результаты, а затем вызвать выборки():

$db->bind_result($email, $username, $hashinserted); 
$db->store_result(); 
... 
$db->fetch(); 
// now $email, $username, $hashinserted have values from the row 

Альтернативный способ заключается в вызове get_result(), который возвращает mysqli_result ресурс. Затем вызовите fetch_assoc() для этого ресурса результата, чтобы получить одну строку.

Если вы вызываете get_result(), вы не можете не позвонить call store_result(). Поскольку вы не можете вызвать store_result(), вы не можете использовать $ db-> num_rows. Вам просто нужно убедиться, что fetch_assoc() возвращает null, если нет строк для извлечения.

$result = $db->get_result(); 
if (($data = $result->fetch_assoc()) === null) { 
    echo "Whoops! You entered incorrect log in credentials. Try again."; 
} 

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

$db = new mysqli(...); // or $mysqli or $link are also common 
$sql = "SELECT ..."; 
$stmt = $db->prepare($sql); 
$result = $stmt->get_result(); 
$row = $result->fetch_assoc(); 

Смешением этих имен переменных делает код менее читабельным для других людей.

+0

Спасибо! Это поставило проблему. – moonlightdreamer

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