mysqli никогда ничего не возвращает - PullRequest
1 голос
/ 15 апреля 2011

Изменить: я новый пользователь, поэтому я не могу ответить на свой вопрос в течение 24 часов.Итак, я разместил ответ здесь.

Спасибо всем, кто быстро ответил.

Если кто-то столкнется с подобными проблемами, действительно поможет, есливы запускаете fetch () для своего объекта mysqli_stmt.

В моем коде выше решение выглядит следующим образом:

$query->bind_result($col1) or die ("Could not bind result");

$query->fetch(); // <--- How could I forget to do this?

if ($col1 !== 0) {
   return true;
} else {
   return false;
}

Исходный вопрос:

Привет всем,

Как часть веб-приложения PHP, я запрашиваю базу данных MySQL, используя mysqli и подготовленные операторы.

Я использовал точно такой же код нанесколько запросов, и это работает, но по одному конкретному запросу он всегда возвращает пустой набор записей.Я выполнил точно такой же запрос из командной строки MySQL, и он правильно возвращает результат.Я проверил передаваемые параметры, и они в порядке.

Я провел большую часть дня, пытаясь выяснить, почему я всегда получаю пустой набор записей без ошибок илипредупреждения.У меня есть ошибки PHP для отображения на странице, и я установил для них E_ALL | E_STRICT.Я до сих пор не получаю никаких предупреждений или ошибок.

Я перепробовал все очевидные вещи, такие как проверка того, что я действительно могу подключиться к базе данных, проверка параметров, которые передаются, и проверкастрока, которую я пытаюсь вернуть, действительно существует в базе данных.У меня были var_dump () s и die () по всей странице, чтобы проверить, что возвращается, и это всегда законный, но пустой набор записей.

function salt() {
   return("I've removed my salt from this sample code");
}

function openDatabase() {
   $conn = new mysqli("127.0.0.1", "username", "password", "database")
      or die("Error: Could not connect to database.");
   return($conn);
}

function checkUserCredentials($username, $password) {
   $goodPassword = md5(salt().$username.$password);

   $conn = openDatabase();
   $query = $conn->stmt_init();

   $query->prepare("SELECT id FROM users WHERE email = ? AND passwordHash = ?")
      or die('Problem with query');

   $query->bind_param("ss", $username, $goodPassword)
      or die('Error binding parameters');

   $query->execute() or die("Could not execute");
   $query->bind_result($col1) or die ("Could not bind result");

   if ($col1 !== 0) {
      die("Authentication Complete");
   } else {
      die("Authentication Failure! Number of Rows: ".$query->num_rows." Username: " . $username . " Password Hash: " . $goodPassword);
   }
}

Любая обратная связь приветствуется.Я уверен, что упускаю что-то простое, но если бы я не побрился, я бы сейчас вырвал себе волосы.

Спасибо

1 Ответ

0 голосов
/ 15 апреля 2011

Я не знаком с библиотекой mysqli (обычно я использую PDO, который предоставляет очень похожий кроссплатформенный API), поэтому не могу сразу увидеть какие-либо проблемы. Однако вы можете попробовать посмотреть журнал mysqld. Смотрите здесь для информации:

http://dev.mysql.com/doc/refman/5.1/en/query-log.html

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

Последнее замечание: я заметил, что вы используете фиксированное значение соли. Не лучше ли генерировать это значение случайным образом каждый раз, когда вам это нужно, и затем сохранять его в таблице пользователей? Как правило, соль не предназначена для того, чтобы быть секретной, она просто предназначена для того, чтобы люди не могли предварительно рассчитать таблицы паролей, используя алгоритм хеширования, который вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...