mysqli_free_result () VS mysqli_stmt_free_result () различия и использование? - PullRequest
1 голос
/ 15 марта 2020

Каковы различия и конкретные c варианты использования этих двух функций? Вот что я нашел:

mysqli_free_result - освобождает память, связанную с результатом

mysqli_stmt_free_result - освобождает сохраненную память результатов для данного дескриптора оператора

Пример будет хорош.

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

Это две разные функции, но вам не нужно использовать ни одну из них.

mysqli_free_result

mysqli_free_result() - процедурный эквивалент $result->free(). Все, что он делает, это сбрасывает результаты из переменной. Объект все еще существует, но становится непригодным для использования.

$id = 1;
$stmt = $mysqli->prepare('SELECT * FROM student_detail WHERE ID=?');
$stmt->bind_param('s', $id);
$stmt->execute();
$result = $stmt->get_result();

$result->free();

var_dump($result->fetch_assoc()); // error

Также имеется 2 псевдонима. Все эти 4 одинаковы:

$result->free();
$result->close();
$result->free_result();
mysqli_free_result($result);

mysqli_stmt_free_result

Делает то же самое, но с самим утверждением. Это эквивалент $stmt->free_result()

$id = 1;
$stmt = $mysqli->prepare('SELECT * FROM student_detail WHERE ID=?');
$stmt->bind_param('s', $id);
$stmt->execute();
$result = $stmt->store_result();

$stmt->free_result();

var_dump($stmt->fetch()); // false

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

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

public function safeQuery(string $sql, array $params = []): ?array {
    $stmt = $this->prepare($sql);
    if ($params) {
        $stmt->bind_param(str_repeat("s", count($params)), ...$params);
    }
    $stmt->execute();
    if ($result = $stmt->get_result()) {
        return $result->fetch_all(MYSQLI_BOTH);
    }
    return null;
}

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

0 голосов
/ 15 марта 2020

Они эквивалентны, в первую очередь это зависит от того, как вы создали результаты.

Если вы используете подготовленный оператор, а затем используете $stmt->store_result(), вы освободите результаты, используя $stmt->free_result().

Если вы выполняете обычный запрос, такой как $result = $conn->query(...), вы бы освободили его, используя $result->free_result().

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