PHP内爆与PDO SQL LIKE查询

时间:2017-06-01 13:57:04

标签: php sql pdo

我正在尝试运行一个包含数组的查询。我破坏了数组,但我不能使用sql IN函数,因为我将使用LIKE函数。所以这就是我想到的解决方案:

$soort = $_POST['soort'];

$st = $db->prepare("SELECT * FROM antwoorden_259 WHERE vraag4 LIKE :soort 
                    AND vraag3 LIKE :merk 
                    AND vraag16 BETWEEN :prijsvan AND :prijstot 
                    AND vraag5 BETWEEN :minkm AND :maxkm 
                    AND vraag8 BETWEEN :vermogenvan AND :vermogentot 
                    AND vraag9 LIKE :brandstof 
                    ORDER BY vraag3 ASC LIMIT 5"
                   );


$st->bindValue(':soort', implode(" OR ", $soort));
$st->bindValue(':merk', "%%");
$st->bindValue(':prijsvan', $prijs_particulier_van);
$st->bindValue(':prijstot', $prijs_particulier_tot);
$st->bindValue(':minkm', $minkm);
$st->bindValue(':maxkm', $maxkm);
$st->bindValue(':vermogenvan', $vermogenvan);
$st->bindValue(':vermogentot', $vermogentot);
$st->bindValue(':brandstof', $brandstof);
$st->execute();

对不起荷兰语,请忽略绑定值,除了:soort one。基本上我要做的是将我的数组$ soort拆分成这样的字符串:truck或car OR boat,等等。用户可以在不同页面的复选框中选择值。

我似乎无法弄清楚为什么最终查询不起作用,内爆完成了它的事情,当我手动尝试在PHPMyAdmin中使用它时它确实有效。此外,当我选择1复选框时,查询确实有效,但它当我选择第二个时停止工作...

任何人都可以帮助我吗?我可能忘记了一些事情......这是漫长的一天!

HTML:

<li>
    <input type="checkbox" value="vrachtwagen" id="check-1" class="checked" name="soort[]">
    <label for="check-1" class="">
        <span class="flt_lt">Vrachtwagen</span>
        <span class="flt_rt">5</span>
        <span class="clear"></span>
    </label>
</li>
<li>
    <input type="checkbox" value="trekker" name="soort[]" id="check-2">
    <label for="check-2" class="">
        <span class="flt_lt">Trekker</span>
        <span class="flt_rt">5</span>
        <span class="clear"></span>
    </label>
</li>
<li>
    <input type="checkbox" value="oplegger" name="soort[]" id="check-3" class="checked">
    <label for="check-3" class="">
        <span class="flt_lt">Oplegger</span>
        <span class="flt_rt">5</span>
        <span class="clear"></span>
    </label>
</li>
<li>
    <input type="checkbox" value="vrachtwagen" name="soort[]" id="check-4" class="checked">
    <label for="check-4" class="">
        <span class="flt_lt">Aanhanger</span>
        <span class="flt_rt">10</span>
        <span class="clear"></span>
    </label>
</li>

1 个答案:

答案 0 :(得分:0)

您的soort参数已插入查询中,如下所示:

SELECT * FROM antwoorden_259
    WHERE vraag4 LIKE 'trekker OR oplegger' [...]

如果我正确地收集了你的目标,你需要将它们分成单独的绑定参数,以便它们像这样插入到查询中:

SELECT * FROM antwoorden_259
    WHERE vraag4 LIKE 'trekker'
    OR vraag4 LIKE 'oplegger' [...]

当查询具有可变数量的绑定参数时,我发现我需要在准备好的SQL中使用?使用数字索引参数。

$st = $db->prepare("SELECT * FROM antwoorden_259 WHERE
    vraag4 LIKE ?
    OR vraag4 LIKE ?
");
$st->bindValue(1, $soort[0]);
$st->bindValue(2, $soort[1]);

(将查询调整为可变数量的参数已留作读者练习。)

如果您的SQL方言支持它,您可以使用类似“LIKE in array”类型的运算符,如PostgreSQL支持:WHERE somecolumn ~~* any(array['%some%', '%someelse']))