绑定到等于 mysqli 的 PDO 中的不同值的正确方法是什么?

What is the proper way to bind to different values in PDO equal to mysqli?

我一直在将我做的一个小登录脚本转换为 PDO,尝试尝试一下。

代码 mysqli

        $stmt = $conn->prepare('SELECT id, name FROM users WHERE id = ?');
        $stmt->bind_param('i', $id);
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($id, $name);

        if ($stmt->fetch()) {
            $_SESSION['id'] = $id;
            $_SESSION['name'] = $name;
            $is_valid = true;
        } else {
            $is_valid = false;
            self::logout();
        }

我改成了PDO

        $sql = "SELECT id, name FROM users WHERE id = :id";
        $stmt = $conn->prepare($sql);


        $stmt->bindParam(':id', $id);
        $stmt->bindParam(':name', $name);
        $stmt->execute();

        if ($stmt->fetch())
        {
            $_SESSION['id'] = $id;
            $_SESSION['name'] = $name;
            $is_valid = true;
        } else {

            $is_valid = false;
            self::logout();
        }

在 mysqli 中,我能够绑定和存储 $​​id 和 $name,但读取它们在 PDO 中不可用

        $stmt->store_result();
        $stmt->bind_result($id, $name);

PDO 中没有 bind_result 的等效项,因为您并不真正需要它。只需读取行中的数据:

if ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    $_SESSION['id'] = $row["id"];
    $_SESSION['name'] = $row["name"];
    $is_valid = true;
}

您也不需要 $stmt->bindParam(':name', $name); 行,因为 SQL.

中没有 :name 输入参数

更多示例可用 in the manual 和其他地方。

另请参阅 Is it possible to use store_result() and bind_result() with PHP PDO? 了解更多有用的背景信息。

等效方法称为bindColumn()。您可以将变量绑定到结果集中的一列。

/* Bind by column number */
$stmt->bindColumn(1, $id);
$stmt->bindColumn(2, $name);

while ($stmt->fetch(PDO::FETCH_BOUND)) {
    print $name . "\t" . $id. "\n";
}

但是,我建议编写更简单的代码。 PDO 旨在更易于使用。

如果你想让代码更简单,使用数组。方法 fetch() returns an array with the current row. They are better when you need to fetch more than one column from the result. If you only need to fetch one column, use fetchColumn().

$sql = "SELECT id, name FROM users WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([
    'id' => $id,
    'name' => $name,
]);

if ($row = $stmt->fetch()) {
    $_SESSION['id'] = $row['id'];
    $_SESSION['name'] = $row['name'];
    $is_valid = true;
} else {
    $is_valid = false;
    self::logout();
}