bind_param() 中的第一个参数究竟是做啥的?

Posted

技术标签:

【中文标题】bind_param() 中的第一个参数究竟是做啥的?【英文标题】:What exactly does first parameter in bind_param() do?bind_param() 中的第一个参数究竟是做什么的? 【发布时间】:2015-01-05 17:38:22 【问题描述】:

我正在尝试理解使用 phpmysqli 准备的语句。我试图阅读一些教程、手册和这个: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 参数是一串单独的字符,每个字符表示一个类型。有四种可能的类型:idsb,分别代表 integerdoublestring二进制。因此,如果您想绑定两个整数和一个字符串,按此顺序,$type 参数需要为iis。然后按照实际值进行跟踪:

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

$stmt->bind_param('iis', $int1, $int2, $str);

【讨论】:

谢谢..我第一次不明白,因为我没有在'sssd'中发现任何特别之处。感谢您的帮助。

以上是关于bind_param() 中的第一个参数究竟是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

Android的@hide注解究竟是做啥的?

“同步”究竟是做啥的? [复制]

-XX:-TieredCompilation 究竟是做啥的?

AVFoundation 的 AVAssetWriterInput 期望MediaDataInRealTime 属性究竟是做啥的?

`ssh-keygen -A` 究竟是做啥的?

Android虚拟设备管理器下的“擦除数据”功能究竟是做啥的