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 关注
- 110 浏览
添加回答
举报