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

这就是为什么我更喜欢 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() 之后检查是否成功。

于 2013-02-21T16:28:43.247 回答
-1

这段代码在逻辑上是有缺陷的:

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

如果没有错误,此函数将返回0aka 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 回答