簡體   English   中英

我正在嘗試從即將棄用的mysql語句轉到msqli准備的語句,我在做什么錯呢?

[英]I'm trying to go from the soon to be deprecated mysql statements to msqli prepared statements, what am I doing wrong?

這是我的PHP:

    $db = new mysqli($db_host, $db_user, $db_pass, $db_database);

    if (mysqli_connect_errno()) {
        echo "Could not connect to database.";
    }

    // On first connect to database, create a user to hold data for users not logged in
    $stmt = $db->prepare("SELECT id FROM users WHERE id = ?");
    $stmt->bind_param("i" , 1);
    $stmt->execute();

    if ($stmt->num_rows == 0) {
        $stmt = $db->prepare("INSERT INTO users (id, username, email, password) VALUES (?, ?, ?, ?");
        $stmt->bind_param("isss", 1, "anonymous", "anonymous", password_hash("noidentity", PASSWORD_BCRYPT));
        $stmt->execute();
    }

但是當它運行時,我得到了這個錯誤:

致命錯誤:無法通過引用傳遞參數2

它指向我有$stmt->bind_param("i" , 1);

我不確定自己在做什么錯。

另外,如果我要將行中的字段的值設置為比當前值大1,那么如何使用准備好的語句來做到這一點?

例如,這是: UPDATE users SET wins = wins + 1 WHERE id = ? 將wins設置為某個值是一個值,因此我認為應該將其與預備語句一起使用,但是我是否認為“ wins + 1”是字符串,並將其包括在預備語句中?

bind_param所有參數(第一個參數除外)必須是通過引用傳遞的變量,您不能只傳遞文字值,例如1"anonymous" ...

如果要插入的值像這樣固定,則根本沒有必要使用bind_param ,因為將它們包含在查詢中是完全安全的:

$stmt = $bd->prepare("INSERT INTO users (id, username, email, password) VALUES (1, 'anonymous',...)");

但是,通常需要將這些參數放入變量中,例如:

$params = Array(1,"anonymous","anonymous",password_hash("noidentity",PASSWORD_BCRYPT));
$stmt->bind_param("isss",$params[0],$params[1],$params[2],$params[3]);
$param = 1;
$stmt->bind_param("i" , $param);

因為您不能在綁定中傳遞值,所以只能傳遞參數。

這就是為什么我更喜歡PDO而不是Mysqli的原因。

在PDO中,您不需要綁定任何東西,只需將值傳遞給execute()即可按值傳遞它們,因此您可以使用文字和表達式。

$stmt = $pdo->prepare("INSERT INTO users (id, username, email, password) 
    VALUES (?, ?, ?, ?");

$status = $stmt->execute(array(1, "anonymous", "anonymous", 
    password_hash("noidentity", PASSWORD_BCRYPT));

當然,在每次prepare()和execute()之后都要檢查是否成功。

此代碼塊在邏輯上存在缺陷:

if (mysqli_connect_errno()) {
    echo "Could not connect to database.";
}

沒有錯誤的情況下,此函數將返回0 aka false ,更不用說這不會導致腳本退出或以其他方式跳過查詢執行。 您應該將其更改為:

$db = new mysqli($db_host, $db_user, $db_pass, $db_database)
if( $db->connect_error ) {
    echo "Could not connect to database.\n" .
        "Err: " . $db->connect_errno() . "\n" . $db->connect_error();
    // die/exit/return error/throw exception, or...
} else {
    // query prep/execution here
}

您還混合了OO和過程調用,我不知道這是否有意義或在執行方面不重要,但這令人困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM