@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) не работает

Как правильно это все реализовать чтобы все работал?
  • Вопрос задан
  • 48 просмотров
Решения вопроса 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 или более высокоуровневым инструментом.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы