2015-01-07 2 views
-4

Итак, проект, над которым я работаю, построен на платформе разработки Cloud9, и я столкнулся с проблемой. В этом конкретном запросе MySQL отсутствует один из его данных столбца, он просто отказывается вернуть его.PHP MySQL, данные не возвращаются, даже если они находятся в базе данных

Часть моего кода входа, с запросом;

http://i.stack.imgur.com/kmx9O.png

в коде:

$sql_command = "SELECT Salt FROM User WHERE Name ='" . $username . "';"; 
    $result = $conn->query($sql_command); 

    if($result->num_rows > 0) 
    { 
     //echo "<p> username: ". $username . "</p>"; 
     //echo "<p> password: ".$password . "</p>"; 

     $salt = $result->fetch_array()[0]; 

     //echo "<p>salt " . $salt . "</p>"; 
     $hashed_password = hash("sha256", $salt . $password); 

     $sql_command = "SELECT `ID`, `Status` FROM User WHERE Password ='" . $hashed_password . 
         "' AND Name = '" . $username . "';"; 
     $result = $conn->query($sql_command); 

     //echo $hashed_password; 
     if($result->num_rows > 0) 
     { 

      $user = $result->fetch_array()[0]; 
      $status = $result->fetch_array()[1]; 

      if($status != -1) 
      { 
       $_SESSION['login_user'] = $user; 
       $_SESSION['login_status'] = $status; 
       $_SESSION['login_user_name'] = $username; 
      } 

данных в вопросе колонке Status;

http://puu.sh/ec3fP/de1e63b384.png

Единственный столбец, который не возвращает никаких данных, это столбец Status.

Каждый другой запрос работает нормально.

Состояние столбца - тип int, длина 11. Никаких других особых характеристик.

+2

Пожалуйста, ваши код здесь, так что сохраняется для будущего SO посетителей. –

+0

Я бы предложил совсем другой подход. Почему у вас есть запросы к БД для сравнения пароля. Почему бы просто не выбрать все столбцы, которые вам нужны на основе имени пользователя, а затем выполнить сравнение. Нет необходимости разбивать это на два отдельных запроса. Вы также можете рассмотреть возможность использования PHP в функциях 'password_hash()' и 'password_verify()', чтобы избежать необходимости хранить соль отдельно в таблице DB. –

+0

Вы попробовали альтернативно выбрать все (*) из базы данных и использовать некоторое время? .. Пока ($ result = fetch_array) { $ status = $ result ['Status']; echo $ status; } /// Это может быть очень случайным, каков ваш редактор кода? : D –

ответ

0

Это не отказ от получения массива. Это DID - вы просто выбрасывали результат:

Это извлекает строку:

$user = $result->fetch_array()[0]; 

Это Выдает ДАЛЕЕ ряд:

$status = $result->fetch_array()[1]; 

Предположительно ваш запрос будет только когда-либо возвращение ONE, поэтому вторая выборка возвращает логическое значение false, означающее «больше никаких данных».

Ваш код должен быть:

$row = $result->fetch_array(); 
$user = $row[0]; 
$status = $row[1]; 
+0

Спасибо, вот и все! – Neroxen

1

$result->fetch_array(), если вы запускаете несколько раз, как вы это делаете, каждый раз будет переходить к следующей строке, поэтому он пытается получить статус из второй строки вашего результата запроса, который не существует.

Можно использовать, например,

+0

Спасибо, вот оно! Спасибо, что решили, хотя это, возможно, было простой ретроспективностью с моей стороны. – Neroxen

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