bind_param() 中的第一个参数究竟是做啥的?
Posted
技术标签:
【中文标题】bind_param() 中的第一个参数究竟是做啥的?【英文标题】:What exactly does first parameter in bind_param() do?bind_param() 中的第一个参数究竟是做什么的? 【发布时间】:2015-01-05 17:38:22 【问题描述】:我正在尝试理解使用 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”到底是什么意思?有没有必要写,以后还会用吗?我没有发现它在其他地方使用过。
我只想要第一个参数的答案:
【问题讨论】:
@krupalshah 我什至还没有投票给任何东西。但手册中的咨询会有所帮助。它向您展示了每个论点的含义和代表。您还希望有人在这里写下它作为答案吗?在这里,它在手册中。 i.imgur.com/WxGTcL8.png 根据手册:types
- 包含一个或多个字符的字符串,用于指定相应绑定变量的类型。这里有什么不清楚的地方?
@u_mulder 很难理解 'sssd' 是第一次输入的类型。不是吗?
@krupalshah — 如果您阅读了 Ghost 之前指出的对它的描述,则不会。
@krupalshah 我认为你写的问题太宽泛了。我对其进行了编辑,以更专注于您的实际问题。
【参考方案1】:
第一个参数指定列数据的类型。例如,如果我们有四列,并且都是字符串类型,我们这样写:
$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
代表double类型,b
代表blob。
所以对于你的情况,sssd
表示第四列是双列,其余的是字符串
【讨论】:
我会批评 columns 在这里相当不相关;这只是您希望 MySQL 将这些值视为什么类型。例如,SELECT ? + ?
是一个完全有效的查询,您可以准备和绑定,但它与列无关。
@deceze 你是对的,但是对于这个问题,使用column
这个词仍然有效(注意这是一个初学者的答案)
b 是用于 blob 还是二进制?
@userX 根据PHP manualb
代表blob:对应的变量是一个blob,会分包发送【参考方案2】:
我想你理解绑定参数的概念,所以我不会深入。尽管如此,您可能需要查看this 以了解更多背景信息。
用于绑定参数的 mysqli API 可以说不是很优雅。它看起来像这样:
bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
这意味着该函数的第一个参数$types
向mysqli 提供了您的参数是什么类型/它应该将它们视为什么的信息。接下来是各个参数。
$types
参数是一串单独的字符,每个字符表示一个类型。有四种可能的类型:i
、d
、s
和 b
,分别代表 integer、double、string 和二进制。因此,如果您想绑定两个整数和一个字符串,按此顺序,$type
参数需要为iis
。然后按照实际值进行跟踪:
$int1 = 42;
$int2 = 11;
$str = 'foo';
$stmt->bind_param('iis', $int1, $int2, $str);
【讨论】:
谢谢..我第一次不明白,因为我没有在'sssd'中发现任何特别之处。感谢您的帮助。以上是关于bind_param() 中的第一个参数究竟是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章
-XX:-TieredCompilation 究竟是做啥的?
AVFoundation 的 AVAssetWriterInput 期望MediaDataInRealTime 属性究竟是做啥的?