在包含搜索字段

时间:2016-04-22 09:09:57

标签: php mysql input filter

我有这个表单来获取用户输入: < form method =“post”action =“do_search.php”>     < select name =“stat”>         < option value =“ - ”> No StatTrak< / option>         < option value =“ST”> StatTrak< / option>     < /选择>         < input type =“text”name =“search”id =“search_box”class =“search_box”placeholder =“Bayonet / Blue Steel(Factory New)”>< / br>         < input type =“submit”value =“查找项目!” class =“search_button”/>< br /> < /形式> 该查询工作并在第二列(itemname)中搜索匹配项。现在我想让选择框通过使用第一列过滤掉结果。 第一列仅包含“ST”或“ - ”。 这是我的查询: $搜索= $ _ POST [ '搜索']; $ STAT = $ _ POST [ 'STAT']; $ query = $ pdo-> prepare(“SELECT itemname,itemprice,itemupdate,itemstat FROM pricedata WHERE itemname like?ORDER BY itemprice DESC LIMIT 15”); $ query-> bindValue(1,“%$ search%”,PDO :: PARAM_STR); $查询 - >执行(); 基本上我需要这样的东西: ... FROMpriceata其中itemname LIKE $ Searchbox AND itemstat LIKE $ Selectbox ... 我是php新手,我使用一些教程进行了这个查询。我理解其中的大部分内容,但我不明白这些价值是如何“准备好”的。 这部分对我来说很难理解: $ query-> bindValue(1,“%$ search%”,PDO :: PARAM_STR); 使选择框为查询提供附加变量的正确方法是什么,因此它只显示与搜索框匹配的结果并且在第一列中具有“ST”或“ - ”。 在此先感谢,我感谢任何帮助! :) 编辑 - 这是我的数据库的一部分: 对于Dimlucas: $ query = $ pdo-> prepare(“SELECT itemname,itemprice,itemupdate,itemstat FROM pricedata WHERE itemname like?AND itemstat =?ORDER BY itemprice DESC LIMIT 15”); $ query-> bindValue(1,“%$ search%”,PDO :: PARAM_STR); $ query-> bindValue(2,$ stat); $查询 - >执行(); 这个查询(你发布的第一个只是说“没有找到”,但它会做正确的事情,如果它有效,因为它包括两个用户输入(选择框和搜索栏)。 SELECT itemname,itemprice,itemupdate,itemstat FROM pricingata WHERE itemname like'Karambit'AND itemstat ='ST'ORDER BY itemprice DESC LIMIT 15 如果找到正确的匹配有任何问题,我用这个替换第一个进行测试。它找到了正确的匹配,但是这个没有包含任何占位符或用户输入,所以我想,在获取用户输入并将其提供给要使用的查询之间存在问题。 现在我将此作为查询并打印出结果 - > http://pastebin.com/xMf4jCgH 我试图在桌面前添加$ search和$ stat。它打印出搜索字符串但不是“ - ”或“ST”,它是选择框的输入。所以问题是,用户输入甚至没有到达查询。 你有什么主意吗?

2 个答案:

答案 0 :(得分:1)

您可以阅读有关准备好的陈述here的信息。它们在防止SQL注入攻击方面非常有用。

现在您要实现的目标我建议您修改查询:

    $query = $pdo->prepare("SELECT itemname, itemprice, itemupdate, itemstat FROM pricedata WHERE itemname Like ? AND itemstat=? ORDER BY itemprice DESC LIMIT 15");
    $query->bindValue(1, "%$search%", PDO::PARAM_STR);
    $query->bindValue(2, $stat);
    $query->execute();

编辑:由于您说stat字段只能采用两个不同的值,因此无需在查询中使用LIKE运算符。 =运算符将执行

答案 1 :(得分:0)

您的尝试似乎没问题:

"...FROM pricedata WHERE itemname LIKE ".$Searchbox." AND itemstat LIKE ".$Selectbox.";"