2 回答
TA贡献1799条经验 获得超9个赞
这是 MySQLi 准备好的语句在 PHP 中的工作方式:
准备一个以空值作为占位符的 SQL 查询(每个值都有一个问号)。通过说明每个变量及其类型,将变量绑定到占位符。执行查询。允许的四种变量类型:
i - 整数
d - 双
s - 字符串
b - 斑点
准备好的语句,顾名思义,是一种准备 MySQL 调用的方法,而不存储变量。你告诉它变量最终会去那里——只是还没有。演示它的最佳方法是通过示例。
$stmt = $mysqli->prepare("SELECT * FROM myTable WHERE name = ? AND age = ?");
$stmt->bind_param("si", $_POST['name'], $_POST['age']);
$stmt->execute();
//fetching result would go here, but will be covered later
$stmt->close();
如果您以前从未见过准备好的语句,这可能看起来有点奇怪。基本上发生的事情是您正在为 SQL 语句的内容创建模板。在本例中,我们从 myTable 中选择所有内容,其中 name 和 age 等于 ?。问号只是值的位置的占位符。
bind_param() 方法是您将变量附加到准备好的模板中的虚拟值的地方。注意变量前的引号中有两个字母。这告诉数据库变量类型。s 指定 name 将是一个字符串值,而 i 强制 age 是一个整数。这正是我没有在名称的问号周围添加引号的原因,就像我通常为 SQL 调用中的字符串所做的那样。您可能认为我只是忘记了,但事实是根本没有必要(事实上,如果您在 ? 周围加上引号,它实际上将不起作用,因为它将被视为字符串文字,而不是一个虚拟占位符。)。
当您调用 bind_param() 时,您已经告诉它它将是一个字符串文字,因此即使恶意用户尝试将 SQL 插入到您的用户输入中,它仍将被视为字符串。$stmt->execute() 然后实际运行代码;最后一行只是关闭准备好的语句。我们将在 Select 部分介绍获取结果。
- 2 回答
- 0 关注
- 139 浏览
添加回答
举报