Это две разные функции, но вам не нужно использовать ни одну из них.
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 жив, пока он необходим, а не еще момент.