在我的程序中,我有一个html表单,其名称为用户输入:
<form action ="view_process.php" role = "form" method = "post">
....
<input type="text" name="name_in" class="form-control" placeholder="Name here" maxlength = "30">
....
</form>
然后我有php代码将用户输入放入变量
$name_in = trim($_POST['name_in']);
所有这一切都有效,但是当我向MySQL数据库发出以下查询时,
$query = "SELECT * FROM students WHERE SID = $id_in AND name = $name_in;";
如果用户在引号中输入其名称,它只返回数据库条目/元组。造成这种情况的原因是什么?如何解决?我意识到我可以编写一个函数来为输入添加引号但我想了解为什么会发生这种情况并且这似乎不是一个好的解决方案。我做了一些研究,尝试使用addslashes()
,stripslashes()
,并启用魔术引号,但没有修复它。
编辑:我不认为这是重复的:How can I prevent SQL-injection in PHP? 因为我使用的是mysqli而没有准备好的陈述。
答案 0 :(得分:3)
你需要:
$query = "SELECT * FROM students WHERE SID = $id_in AND name = $name_in;";
并将其制作成预备陈述:
$db = new mysqli(...); //Look up the connection if you don't already home one.
$stmnt = $db->prepare("select a, b, c from students where sid = ? and name = ?");
$stmnt->bind_param('is',$id_in,$name_in);
$stmnt->execute();
$stmnt->bind_result($a,$b,$c);
while($stmtnt->fetch())
{
// Do stuff with $a $b and $c
}
查询语句中的问号代表&#34;来自用户的东西在这里我们不信任&#34;。 bind_param
函数的第一个参数告诉mysqli以下每个参数的类型。在这种情况下,int(i
)和字符串(s
)用于id和学生姓名。但是,在使用输入过滤器和白名单/正则表达式进行查询之前,您应该清理并验证输入。请注意,我们还要求确切地填写我们想要的字段,并且不要在select中使用*。这很重要,因为我们需要将这些变量与bind_results()
。
答案 1 :(得分:-1)
我相信你想这样做
$query = "SELECT * FROM students WHERE SID = $id_in AND name = '$name_in'";
在SQL中传递的文本变量必须用引号括起来。
如果用户添加&#34;引号&#34;他们的名字。在将变量直接传递给SQL时,必须使用数据库转义函数将其剥离。 http://php.net/manual/en/mysqli.real-escape-string.php
您可以将此添加到您的变量中
$name_in = $mysqli->real_escape_string(trim($_POST['name_in']));