Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关于准备好的声明和加入的建议_Php_Sql_Join_Prepared Statement - Fatal编程技术网

Php 关于准备好的声明和加入的建议

Php 关于准备好的声明和加入的建议,php,sql,join,prepared-statement,Php,Sql,Join,Prepared Statement,我正在尝试为我正在学习的课程的网页项目构建一个后端解决方案。这门课没有涉及任何关于后端编码的内容,所以我必须自己学习所有内容。我想了解如何在下面的PHP代码中利用准备好的语句和连接。我的数据库中有三个表,但我只想从其中一个表中返回数据,而且有时只需要引用另外两个表来进行搜索 代码目前按预期工作,但易受sql注入的影响。我从用户那里得到了三个表单输入:文本输入$u POST[拼写\名称],选择元素$u POST[类列表],以及一些复选框$u POST[学校]。当复选框发送空数组时,它仍然需要工作。

我正在尝试为我正在学习的课程的网页项目构建一个后端解决方案。这门课没有涉及任何关于后端编码的内容,所以我必须自己学习所有内容。我想了解如何在下面的PHP代码中利用准备好的语句和连接。我的数据库中有三个表,但我只想从其中一个表中返回数据,而且有时只需要引用另外两个表来进行搜索

代码目前按预期工作,但易受sql注入的影响。我从用户那里得到了三个表单输入:文本输入$u POST[拼写\名称],选择元素$u POST[类列表],以及一些复选框$u POST[学校]。当复选框发送空数组时,它仍然需要工作。没有选中任何复选框,并且select元素发送默认值all

     $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参数名称而不是值,然后添加一个具有该值的参数