@davc

Не работает mysqli_stmt_get_result после mysqli_stmt_num_rows?

Всем привет! есть такой PHP код
$game_win_query = mysqli_prepare($link, "SELECT * FROM `game_win` WHERE `id_user` = ?");
        mysqli_stmt_bind_param($game_win_query, "s", $user_get);
        mysqli_stmt_execute($game_win_query);
        mysqli_stmt_store_result($game_win_query);
        $win_num = mysqli_stmt_num_rows($game_win_query);
        $win_fetch = mysqli_fetch_all(mysqli_stmt_get_result($game_win_query));


Если mysqli_fetch_all поставить перед mysqli_stmt_store_result($game_win_query) то mysqli_stmt_num_rows не работает,
а если все остается так как есть ($win_fetch = mysqli_fetch_all) не работает

Как правильно это все реализовать чтобы все работал?
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
Доброго утра.

С подготовленными выражениями не всё так просто, если использовать mysqli* (процедурный или объектный стиль).
В вашем случае придётся разобрать, что именно написано:
$q = "SELECT name, last_name, email FROM users WHERE id IN (?, ?)";

$stmt = mysqli_prepare($link, $q);
if (false === $stmt) {
    die('statement was executed with errors');
}

$id = 1;
$anotherId = 2;

//обратите внимание на строку типов - "ii",
// подозреваю, что у вас ошибочно описан строковый тип "s" для id_user 
$stmt->bind_param("ii", $id, $anotherId); 
$stmt->execute();

$stmt->store_result(); // буферизация
echo "<br>Rows: " . $stmt->num_rows . "<br>"; // количество строк в результате

// При работе с подготовленными выражениями и результатами нам нужно точно знать, что мы получаем в запросе (см. SELECT <fields>)
// Можно получать в запросе все атрибуты, а конкретные имена атрибутов забирать через metadata
$name = null;
$lastName = null;
$email = null;

// Привязка переменных к результирующему набору (порядок, как в SELECT)
 $stmt->bind_result($name, $lastName, $email);

// каждый вызов fetch будет связывать наши переменные и дынными из результата
while ($stmt->fetch()) {
    var_dump([
        'name' => $name,
        'last_name' => $lastName,
        'email' => $email,
    ]);
}

$stmt->free_result(); // освобождаем память
$stmt->close();
$link->close();


Ссылки: Статья на хабре, Stackoverflow

P.S. Не вполне понятно, почему написано именно так (через mysqli*, зачем нужен store_result).
Думаю, что сам код можно упростить если воспользоваться тем же PDO или более высокоуровневым инструментом.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы