PHP MySQLi Prepared Statement


PHP MySQLi Prepared Statement

我正在尝试使用MySQLi创建我的第一个预准备语句,因为我知道我执行查询的方式对SQL注入是开放的。

我真的不明白其中的bind_param和bind_result部分。有人可以以最愚蠢的方式向我解释这一点吗?

这是我有效的查询。

$sql = "UPDATE formdata SET name = '$varName', email = '$varEmail', address = '$varAddress', city = '$varCity', state = '$varState', zip = '$varZip', submitDate  = '$varDate' WHERE promoCode = '$varPromo'";
$mysqli->query($sql);

这是我试图准备好的声明。

$query = "UPDATE formdata SET name = ?, email = ?, address = ?, city = ?, state = ?, zip = ?, submitDate  = ? WHERE promoCode = '$varPromo'";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $varName, $varName, $varEmail, $varAddress, $varCity, $varState, $varZip, $varDate);
$stmt->execute();
$stmt->bind_result($varName, $varName, $varEmail, $varAddress, $varCity, $varState, $varZip, $varDate);
$stmt->fetch();
header("location: index.php?success=1");
exit();

一些错误消息信息会有所帮助,但是,我应该指出几件事。

对于初学者来说,在bind_param()中,第一个参数指示正在传入的信息(字符串、int 等),并且您必须按照列出参数的相同顺序指定每条信息。 例如,如果你有两个字符串和两个整数,你会把:

$stmt->bind_param("ssii", $str1, $str2, $int1, $int2);

此外,您还有一个变量$varName,您可以在bind_param()bind_result()中使用两次。 最佳做法是为每个信息使用不同的变量名称。 但是,在这种情况下,由于您正在执行 UPDATE 语句,因此您只会获得受影响的行数,因此$stmt->bind_result(...);使用 echo $stmt->affected_rows;

select 语句将是一个完全不同的方案,在这种情况下,您将结果信息绑定到变量。 但是,您应该查看上面发布的教程hakre。 他们有很多不错的示例,将帮助您编写自己准备好的语句并获得结果。