1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
當(dāng)執(zhí)行預(yù)備語句時(shí),mysqli 默認(rèn)使用無緩沖查詢。這是一個(gè)非常令人困惑的行為,但這意味著結(jié)果不會自動(dòng)發(fā)送到 PHP。MySQL 服務(wù)器將結(jié)果存儲在服務(wù)器上并等待 PHP 檢索它們。只要還有更多結(jié)果需要獲取,您就無法執(zhí)行另一個(gè)查詢。
要解決此問題,您需要致電mysqli_stmt_store_result()或者需要獲取所有結(jié)果。
在您的情況下,簡單的選擇是添加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 函數(shù),這對您來說會容易得多。即使是一個(gè)簡單的包裝函數(shù)也可以幫助您避免所有這些 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;
}
然后您可以將整個(gè)準(zhǔn)備好的語句抽象為一行代碼:
$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'];
}
您甚至可以編寫第二個(gè)函數(shù),它僅從準(zhǔn)備好的語句中獲取單個(gè)值。
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當(dāng)您只想獲取單個(gè)值時(shí)可以使用此方法。
$consulta = "SELECT id_usuario FROM usuario WHERE usuario = ? ORDER BY fecha_registro DESC LIMIT 1";
$id_usuario_creado = fetchSingle($connect, $consulta, [$usuario]);
- 1 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報(bào)