第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

無法對 mysqli 使用多個(gè) STMT 查詢

無法對 mysqli 使用多個(gè) STMT 查詢

PHP
有只小跳蛙 2023-07-07 10:32:34
我正在嘗試生成一個(gè)用戶創(chuàng)建頁面,并進(jìn)行驗(yàn)證以確定用戶是否已存在,為此我使用以下代碼:在這里,我將用戶及其密碼插入到表 USERS 中mysqli_stmt_bind_param($guardar_usuario, 'ss', $usuario,$encriptar);mysqli_stmt_execute($guardar_usuario);這里我重用變量 $user 來恢復(fù)創(chuàng)建的新 id 用戶$consulta = "SELECT id_usuario FROM usuario WHERE usuario = '$usuario' ORDER BY fecha_registro DESC LIMIT 1";$ultimo_registro = mysqli_prepare($connect,$consulta);mysqli_stmt_execute($ultimo_registro);mysqli_stmt_bind_result($ultimo_registro, $id_usuario_creado);mysqli_stmt_fetch($ultimo_registro);我將額外的數(shù)據(jù)插入到名為 PERSONAS 的表中$guardar_persona = mysqli_prepare($connect, "INSERT INTO persona (id_usuario, nombre, email) VALUES (?, ?, ?)");        mysqli_stmt_bind_param($guardar_persona, 'iss',  $ultimo_registro, $nombre_usuario, $email_usuario);            mysqli_stmt_execute($guardar_persona);我的問題是第二個(gè)查詢,將數(shù)據(jù)插入到表 PERSONAS 中不起作用,但是如果我刪除第一個(gè)查詢,使插入到表 USERS 中,則該查詢可以正常工作,所以我不知道是否有規(guī)則使這項(xiàng)工作有效?抱歉,如果這是一個(gè)相當(dāng)新手的問題,剛剛開始以這種方式工作以嘗試盡可能防止數(shù)據(jù)注入。
查看完整描述

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]);


查看完整回答
反對 回復(fù) 2023-07-07
  • 1 回答
  • 0 關(guān)注
  • 143 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號