0

これが私の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」を文字列と見なし、それをプリペアドステートメントに含めますか?

4

4 に答える 4

4

(最初の引数を除く)へのすべての引数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]);
于 2013-02-21T16:02:25.177 に答える
0
$param = 1;
$stmt->bind_param("i" , $param);

バインドでは値を渡すことができないため、パラメーターのみを渡すことができます。

于 2013-02-21T16:12:54.160 に答える
0

これが、MysqliよりもPDOを好む理由です。

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()の後で成功を確認してください。

于 2013-02-21T16:28:43.247 に答える
-1

このコードブロックには論理的な欠陥があります。

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

エラーがなかった場合、この関数は0別名を返します。これ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呼び出しと手続き型呼び出しが混在しています。これが重要かどうかはわかりませんが、実行に関してはわかりませんが、混乱を招きます。

于 2013-02-21T16:10:17.740 に答える