Php 关于准备好的声明和加入的建议
我正在尝试为我正在学习的课程的网页项目构建一个后端解决方案。这门课没有涉及任何关于后端编码的内容,所以我必须自己学习所有内容。我想了解如何在下面的PHP代码中利用准备好的语句和连接。我的数据库中有三个表,但我只想从其中一个表中返回数据,而且有时只需要引用另外两个表来进行搜索 代码目前按预期工作,但易受sql注入的影响。我从用户那里得到了三个表单输入:文本输入$u POST[拼写\名称],选择元素$u POST[类列表],以及一些复选框$u POST[学校]。当复选框发送空数组时,它仍然需要工作。没有选中任何复选框,并且select元素发送默认值allPhp 关于准备好的声明和加入的建议,php,sql,join,prepared-statement,Php,Sql,Join,Prepared Statement,我正在尝试为我正在学习的课程的网页项目构建一个后端解决方案。这门课没有涉及任何关于后端编码的内容,所以我必须自己学习所有内容。我想了解如何在下面的PHP代码中利用准备好的语句和连接。我的数据库中有三个表,但我只想从其中一个表中返回数据,而且有时只需要引用另外两个表来进行搜索 代码目前按预期工作,但易受sql注入的影响。我从用户那里得到了三个表单输入:文本输入$u POST[拼写\名称],选择元素$u POST[类列表],以及一些复选框$u POST[学校]。当复选框发送空数组时,它仍然需要工作。
$sql = "SELECT * FROM dnd5_spells WHERE ";
if($_POST["classList"] != "all"){
$sql .= "spell_id= ANY(SELECT spell_id FROM dnd5_class_spells WHERE class_id = ANY(SELECT class_id FROM dnd5_classes WHERE class_name='{$_POST["classList"]}')) AND";
};
$sql .= " spell_name LIKE '%{$_POST["spell_name"]}%'";
if(!empty($_POST["school"])){
$sql .= " AND (";
$spellschools = $_POST["school"];
$valueLength = count($spellschools);
for ($x = 0; $x < $valueLength; $x++) {
if ($x>0) {
$sql.= " OR";
};
$sql .= " spell_type" . " LIKE" . " '%" . $spellschools[$x] . "%'";
};
$sql .= ")";
};
$result = mysqli_query($conn, $sql);
当我可以接收到所有或没有可能的输入值,并且我不知道我提前得到了什么时,我如何制作一个准备好的语句?在我的情况下,发送表单数据为空会返回整个表,这很好?当数组可以为空或具有多个值时,我可以将数组迭代到一个准备好的语句中吗?当不需要sql查询的某部分时,我是否应该考虑包含该部分
此外,我知道我对ANY的使用可能会被JOIN所取代,但我无法对它进行思考,而且它对我来说没有弄清楚预先准备好的语句问题那么重要 这是我找到的解决方案。我需要使用PDO,然后在考虑准备好的语句时构建语句,放置?我需要输入数据的地方,同时用相应的数据值构建一个数组。我怀疑它是否完美,但它的工作原理和我最初的代码一样好,并且不太容易受到SQL注入的影响
$sql = "SELECT * FROM dnd5_spells WHERE ";
$parameters = [];
if($_POST["classList"] != "all"){
$sql .= "spell_id= ANY(SELECT spell_id FROM dnd5_class_spells WHERE class_id = ANY(SELECT class_id FROM dnd5_classes WHERE class_name= ?)) AND";
$parameters[] = $_POST["classList"];
};
$sql .= " spell_name LIKE ?";
$parameters[]= "%" . $_POST["spell_name"] . "%";
if(!empty($_POST["school"])){
$sql .= " AND (";
$spellschools = $_POST["school"];
$valueLength = count($spellschools);
for ($x =0; $x < $valueLength; $x++){
if ($x>0){
$sql.= " OR";
};
$sql.= " spell_type LIKE ?";
$parameters[] ="%" . $spellschools[$x] . "%";
};
$sql .= ")";
};
//bind the peramaters into the prepared statment
$stmt = $conn->prepare($sql);
$stmt->execute($parameters);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
你的例子实际上没有准备任何东西。您向我们展示的代码非常容易受到SQL注入的攻击。还有,我认为文字太多了。请你把它剪小一点好吗?对不起,我试着把文字剪小一点。在这种情况下,我很难理解如何实现准备好的语句,因为我可以接收所有可能的输入,也可以不接收任何可能的输入。您可以根据输入的数量动态构建语句。使用PDO,绑定动态数量的参数是小菜一碟。如果没有大量的相关文章,这篇文章可能会对您有所帮助,也许其中一篇文章会向您展示如何动态执行。现在,您的代码将值连接到SQL字符串中,因此您清楚地知道如何连接字符串。将透视图从封闭的值转移到封闭的参数占位符。。将一个参数占位符连接到字符串中,然后执行任何需要的操作来为该占位符参数指定一个值。。。在我的母语C中,这类似于sql=SELECT*fromt,其中。。。;ifname!=null sql=sql+和name=@n;sqlCommand.Parameters。Add@n,姓名;-concat参数名称而不是值,然后添加一个具有该值的参数