【问题标题】:How to pass array with if statement to MySQL query with a prepared statement?如何使用准备好的语句将带有 if 语句的数组传递给 MySQL 查询?
【发布时间】:2020-04-06 23:07:10
【问题描述】:

我正在制作一个有工作的网站,有人可以按类别过滤工作。但是,有人可能并不总是过滤作业,因此它必须依赖于前端选中的复选框。一旦到达 PHP 文件,它必须对数组进行内爆,然后使用每个变量来参数化查询。我找到了一些显示如何执行类似应用程序的链接,但我找不到任何关于如何使用 IF 语句和准备好的 mysqli 语句执行此操作的材料。

$o = 'o';
$sql="SELECT pid,title,description,location FROM jobs WHERE status=? ORDER BY job_date DESC";

if(isset($_POST['category'])){
    $category_filter = implode("','",$_POST['category']);
    $sql .= " AND category=? IN('".$category_filter."')";
}
$stmt = $conn->prepare($sql);
$stmt->bind_param('ss', $o,$category_filter);
$stmt->execute();
$stmt->bind_result($pid,$title,$description,$location);
$job = '';
while($stmt->fetch()){
    include '../templates/job-listing.php';
        }

【问题讨论】:

    标签: php mysql mysqli prepared-statement


    【解决方案1】:

    您的代码几乎是好的。问题是,在order by 子句之后添加了约束“IN ,...”,这将导致语法错误。 改变:

    $o = 'o';
    $sql="SELECT pid,title,description,location FROM jobs WHERE status='" . $o . "' ";
    
    $order_clause = " ORDER BY job_date DESC";
    
    if(isset($_POST['category'])){
        $category_filter = implode("','",$_POST['category']);
        $sql .= " AND category IN('" . $category_filter . "')";
    }
    
    $sql .= $order_clause;
    
    $stmt = $conn->prepare($sql);
    $stmt->execute();
    $stmt->bind_result($pid,$title,$description,$location);
    
    ....
    

    【讨论】:

    • 不需要绑定参数吗?到目前为止,我一直在每个 sql 语句中绑定参数
    • 只有在查询中有 ? 参数时才需要绑定,而在我的示例中并非如此。
    • 我明白了,但我应该让它们来防止 SQL 注入吗?检查此链接,这与我想要的非常接近,但是其中的一些部分我真的不明白/不知道我是否需要它来保证安全。 stackoverflow.com/questions/907806/…查看李维莫里森的回答
    • 链接的解决方案正在生成一个IN 子句,其中包含与数组成员一样多的?,然后将它们作为绑定参数传递。您的代码已经通过内爆 POST 数组来生成完整的 IN 子句。你必须决定你想要什么,任何一种解决方案都有效,但不能混合使用。
    • 谢谢,对不起,我不知道完整的 IN 子句与其他类型相比意味着什么。我想要什么是安全的。我的数据可能有 0 个参数,并且可能有更多
    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多