1 回答

TA貢獻1784條經驗 獲得超9個贊
當執行預備語句時,mysqli 默認使用無緩沖查詢。這是一個非常令人困惑的行為,但這意味著結果不會自動發送到 PHP。MySQL 服務器將結果存儲在服務器上并等待 PHP 檢索它們。只要還有更多結果需要獲取,您就無法執行另一個查詢。
要解決此問題,您需要致電mysqli_stmt_store_result()或者需要獲取所有結果。
在您的情況下,簡單的選擇是添加store_result并完成它。
$consulta = "SELECT id_usuario FROM usuario WHERE usuario = ? ORDER BY fecha_registro DESC LIMIT 1";
$ultimo_registro = mysqli_prepare($connect,$consulta);
mysqli_stmt_bind_param($ultimo_registro, 's', $usuario);
mysqli_stmt_execute($ultimo_registro);
mysqli_stmt_store_result($ultimo_registro);
mysqli_stmt_bind_result($ultimo_registro, $id_usuario_creado);
mysqli_stmt_fetch($ultimo_registro);
但是,如果您直接停止使用 mysqli 函數,這對您來說會容易得多。即使是一個簡單的包裝函數也可以幫助您避免所有這些 mysqli 混亂。
function safeQuery(mysqli $db, string $sql, array $params = []): ?array {
$stmt = $db->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;
}
然后您可以將整個準備好的語句抽象為一行代碼:
$consulta = "SELECT id_usuario FROM usuario WHERE usuario = ? ORDER BY fecha_registro DESC LIMIT 1";
$result = safeQuery($connect, $consulta, [$usuario]);
if ($result) {
$id_usuario_creado = $result[0]['id_usuario'];
}
您甚至可以編寫第二個函數,它僅從準備好的語句中獲取單個值。
function fetchSingle(mysqli $db, string $sql, array $params = []) {
$stmt = $db->prepare($sql);
if ($params) {
$stmt->bind_param(str_repeat("s", count($params)), ...$params);
}
$stmt->execute();
if ($result = $stmt->get_result()) {
return $result->fetch_row()[0];
}
return null;
}
LIMIT 1當您只想獲取單個值時可以使用此方法。
$consulta = "SELECT id_usuario FROM usuario WHERE usuario = ? ORDER BY fecha_registro DESC LIMIT 1";
$id_usuario_creado = fetchSingle($connect, $consulta, [$usuario]);
- 1 回答
- 0 關注
- 142 瀏覽
添加回答
舉報