7

我试图理解使用 PHP 和 mysqli 准备好的语句。我试图阅读一些教程、手册和这个:Bind_Param in PHP,但我还没有找到任何令人满意的答案。

有人在回答中写道:

准备 SQL 语句时,您可以在列值所在的位置插入占位符 (?),然后使用 bind_param() 安全地将占位符替换为实际列的值。这可以防止任何 SQL 注入的可能性。

我在这样的教程中找到了一些代码:

$stmt = $con->prepare("INSERT INTO user_accounts VALUES (?,?,?,?)");

$stmt->bind_param('xyz', $sample1, $sample2, $sample3, $sample4);   // bind to the parameter

我明白我们写的是“?” 而不是我们的变量,以便稍后可以给出实际值。MySQL 为查询执行准备一个计划,然后将变量作为参数给出。

这行代码是什么意思?

bind_param('xyz', $sample1, $sample2, $sample3, $sample4);  

四个变量以“xyz”作为参数给出......参数“xyz”到底是什么意思?有没有必要写,以后还会用吗?我没有发现它在其他地方使用过。

我只想要第一个参数的答案:

在此处输入图像描述

4

2 回答 2

22

我想你理解绑定参数的概念,所以我不会深入。尽管如此,您可能希望查看内容以获取更多背景信息。

用于绑定参数的 mysqli API 可以说不是很优雅。它看起来像这样:

bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

这意味着这个函数的第一个参数$types,给 mysqli 信息你的参数是什么类型/它应该把它们当作什么。接下来是各个参数。

$types参数是单个字符的字符串,每个字符表示一个类型。有四种可能的类型:i、和d,分别代表整数双精度字符串二进制。所以如果你想绑定两个整数和一个字符串,按这个顺序,参数需要是. 然后,您可以按照实际值进行操作:sb$typeiis

$int1 = 42;
$int2 = 11;
$str  = 'foo';

$stmt->bind_param('iis', $int1, $int2, $str);
于 2014-11-09T08:53:07.940 回答
7

第一个参数指定列数据的类型。例如,如果我们有四列并且都是字符串类型,我们编写:

$stmt->bind_param('ssss', $sample1, $sample2, $sample3, $sample4);

如果一列是整数类型,我们使用i代替s。例如,如果第三列是整数,我们写:

$stmt->bind_param('ssis', $sample1, $sample2, $sample3, $sample4);

指定第一列和第二列是字符串 ( s),第三列是整数 ( i),第四列是字符串 ( s)。

对于bind_param()函数的第一个参数,我们使用s字符串类型,i代表整数,代表d双精度类型,代表bblob。

因此,对于您的情况,sssd意味着第四列是双列,其余列是字符串

于 2014-11-09T08:50:58.683 回答