Mysqli bind_param()没有按预期工作

时间:2015-08-20 18:01:59

标签: mysqli bind param

有谁能告诉我我做错了什么? 当我执行并获取此信息时,我将成为正确的结果。

$message = '100';
if($stmt = $mysqli->prepare("select english from table where message=? LIMIT 1")) {
$stmt = bind_param("i", $message);
} //Return the Message in English

但是当我将语言放入变量并使用bind_param()时。 我只是得到了新的变量作为结果返回前:。

$message = '100';
$language = 'english';
if($stmt = $mysqli->prepare("select ? from table where message=? LIMIT 1")) {
$stmt = bind_param("si", $language, $message);
} //Returns "english"

我猜问题是" $语言"绑定为" String"。什么是正确的类型?已经尝试将其更改为blob或double,但没有结果。

1 个答案:

答案 0 :(得分:1)

让我们看看<div class="content"> <p>Main content goes here.</p> </div> <footer class="smallFooter"> <p>Footer content goes here</p> </footer> 做了什么。

bind_param

大致相当于

$stmt = $mysqli->prepare("select * from users where name=?");
$stmt->bind_param("s", "Dennis");

但是,使用bind_param比将值插入SQL查询要安全得多。因为在用手插入值时,需要仔细处理特殊字符;否则恶意构造的值可以使SQL解析器将值的某些部分视为值,而不是命令,表名,列名等.bind_param为您完成;使用bind_param,您不必担心在插入SQL查询之前$stmt = $mysqli->prepare("select * from users where name='Dennis'"); 应该转换为Dennis,但'Dennis'应该变成Dennis O'Brian(而不是{{} 1}}),NUL-character应变成'Dennis O\'Brian'(不作为NUL字符保留)。

bind_param仅适用于将插入SQL查询。因为当您需要将列或表名插入SQL查询时,实际上需要相反 - 您需要将列名直接插入SQL查询(不添加任何引号等)。所以你真的需要:

'Dennis O'Brian'

'\0'

所以,就这样做:

select english from table where message=... LIMIT 1

唯一的一点是,必须确保select 'english' from table where message=... LIMIT 1 包含有效的列名。否则,如果用户强行通过$message = '100'; $language = 'english'; $sql = "select " . $language . " from table where message=? LIMIT 1"; if($stmt = $mysqli->prepare($sql)) { $stmt->bind_param("i", $message); } 传递了不好的内容,您将获得SQL-injection

$language