2016-04-22 50 views
1

我有这样的形式来获取用户输入:包括<SELECT>在搜索领域的查询

<form method="post" action="do_search.php"> 
    <select name="stat"> 
     <option value="-">No StatTrak</option> 
     <option value="ST">StatTrak</option> 
    </select> 
     <input type="text" name="search" id="search_box" class="search_box" placeholder="Bayonet/Blue Steel (Factory New)"></br> 
     <input type="submit" value="Find item!" class="search_button" /><br /> 
</form> 

的查询工作,并搜索匹配第二列(ITEMNAME)。现在我想让选择框通过使用第一列过滤出结果。

第一列只包含“ST”或“ - ”。

这里是我的查询:

$search=$_POST['search']; 
$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); 
$query->execute(); 

基本上,我需要这样的东西:

...FROM pricedata where itemname LIKE $Searchbox AND itemstat LIKE $Selectbox... 

我新的PHP和我使用一些教程做此查询。我理解它的大部分内容,但我不明白这些价值是如何“准备好”的。

这部分是很难理解我:

$query->bindValue(1, "%$search%", PDO::PARAM_STR); 

会是什么使选择框给查询一个额外的变量正确的方法,所以它只能说明匹配的搜索框和有结果第一列中的“ST”或“ - ”。

在此先感谢,我感谢任何帮助! :)

编辑 - 这是我的数据库的一部分: enter image description here


对于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); 
$query->execute(); 

这个查询(您发布的第一个只是说“没什么发现“,但它会做正确的事情,如果它工作的话,因为它包括用户输入(选择框和搜索栏)

SELECT itemname, itemprice, itemupdate, itemstat FROM pricedata WHERE itemname Like 'Karambit' AND itemstat='ST' ORDER BY itemprice DESC LIMIT 15 

我用这个替换了第一个测试,如果有任何问题找到正确的匹配。它找到了正确的匹配,但是这个不包含任何占位符或用户输入,所以我猜,在接受用户输入并将其提供给查询使用之间存在一个问题。

现在我有这样的查询和打印出来的结果 - >http://pastebin.com/xMf4jCgH

我尝试添加$搜索和$统计在面前的桌子上。它打印出搜索字符串,但不是“ - ”或“ST”,它是来自选择框的输入。所以问题是,用户输入甚至没有达到查询。

你有什么想法吗?

+0

井代码'where itemname LIKE $搜索框和itemstat LIKE $选择框'它看起来不错。试验是最好的学习方式 – RiggsFolly

+0

你可以编写任意数量的'$ query-> bindValue()'so'$ query-> bindValue(2,“%$ select%”,PDO :: PARAM_STR);' – RiggsFolly

+0

谢谢! PDO :: PARAM_STR是做什么的?该查询如何知道,哪个数字是“?”。它是否按升序排列? bindvalue(1是否意味着它是查询和绑定值中的第一个“?”(2是第二个? –

回答

0

你尝试似乎是确定:

"...FROM pricedata WHERE itemname LIKE ".$Searchbox." AND itemstat LIKE ".$Selectbox.";" 
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(); 

编辑:既然你说没有必要的统计信息字段只能取两个不同的值在查询中使用LIKE运算符。 =运营商将做

+0

1+整齐,没有听说过这个到现在 – TechTreeDev

+0

嘿,谢谢,我复制了你发布的确切代码,但是它现在没有给出任何结果任何想法? –

+0

在原始文章中包含数据库快照,以便我可以观察内容。请注意,数据库必须包含与'itemstat'列完全相同的值。如果$ stat变量包含值'ST'但数据库列具有'st',则不起作用 – dimlucas