我想创建具有多个选项的“精确搜索”,但答案显示“无法搜索”。
在表格中,price,one和pre是行。 如果答案与1和pre匹配,则分离出的价格将会出现。如果没有,答复将是“尝试agian”。
编辑:我有三张桌子 - 前,一张和价格。
- KA 1 will win 100
- KA 5 will win 500
- MA 3 will win 100
- MA 1 will win 200
- BA 3 will win 800
编辑:我现在更改了代码并且没有显示错误,但结果总是“再试一次”。
<?php
$output = NULL;
$link = mysqli_connect("localhost","root","","searchdemo") or die("Unable to select database" . mysqli_error($link));
if(isset($_GET['search'])){
$searchq = $_GET['search'];
$searchq = preg_replace("#[^0-9a-z]#i","",$searchq);
$query = mysqli_query ($link, "SELECT * FROM `345` WHERE pre = '$searchq' AND one = '$searchq'") or die("<b>Error</b> : ".mysqli_error($link));
$count = mysqli_num_rows($query);
if ($count == 0){
$output = 'Try Again';
}else{
while($row = mysqli_fetch_array($query)){
$onen = $row['one'];
$pren = $row['pre'];
$price = $row['price'];
$output = 'You won '.$price.' now';
}
}
}
?>
<form name="search1" action="index.php" method="GET">
<b>Prefix</b>
<select name="pre">
<option value="">Pick a prefix</option>
<option value="Ka">Ka</option>
<option value="Ba">Ba</option>
<option value="Ma">Ma</option>
</select>
<b>Number</b>
<select name="one">
<option value="">Pick a number</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<input type="submit" name="search" value="Search" />
</form>
<?php
print ("$output");
//echo ($output);
?>
答案 0 :(得分:1)
如果调用 die(),则表示查询失败,因此我开始在那里寻找原因。
您的查询中缺少 WHERE ,它应该以
开头SELECT * FROM 345 WHERE ...
请记住,您的代码是针对SQL注入攻击打开的。您必须转义进入查询的所有用户输入。
最简单的方法是使用http://php.net/manual/en/function.mysql-real-escape-string.php(自PHP 5.5起不推荐使用)或http://php.net/manual/en/mysqli.real-escape-string.php。您还可以为查询使用PDO预处理语句(http://php.net/manual/en/book.pdo.php)
答案 1 :(得分:0)
这里有一些通用指示:
您需要在SQL语句中使用WHERE子句来定义搜索条件。搜索将在没有它的情况下工作,但它将返回所有内容,这不是您想要的。 (这已经修复)
您的WHERE子句中的变量之间需要AND
或OR
语句,因为您要求“显示此WHERE条件1为真且/或条件2是真的“
将die
命令替换为更好,更丰富的反馈:
这将输出搜索失败的原因。使用它来修复更多错误。
or die("Could not search: ".mysql_error());
正如jedrzej.kurylo所提到的,您对数据库的注入攻击是开放的,并且根据他们的建议或通过将代码升级到使用 MySQLi来解决这些问题非常重要。 或 PDO 。当你还在学习SQL的基础知识时,现在就这样做,因为它远远超过了使用旧的,已弃用且不安全的MySQL的坏习惯。
答案 2 :(得分:0)
最后我得到了答案,这很容易。我真傻啊! :)
我非常感谢@Martin和@ jedrzej.kurylo
<?php
$output = NULL;
$link = mysqli_connect("localhost","root","","searchdemo") or die("Unable to select database" . mysqli_error($link));
if(isset($_POST['search'])){
$spre = $_POST['pre'];
$sone = $_POST['one'];
$query = mysqli_query ($link, "SELECT * FROM `345` WHERE pre = '$spre' AND one = '$sone'") or die("<b>Error</b> : ".mysqli_error($link));
$count = mysqli_num_rows($query);
if ($count == 0){
$output = 'Try Again';
}else{
while($row = mysqli_fetch_array($query)){
extract($row);
$onen = $row['one'];
$pren = $row['pre'];
$price = $row['price'];
$id = $row['id'];
$output = 'You won '.$price.' now';
}
}
}
?>
<form name="search1" action="index.php" method="POST">
<b>Prefix</b>
<select name="pre">
<option value="">Pick a prefix</option>
<option value="Ka">Ka</option>
<option value="Ba">Ba</option>
<option value="Ma">Ma</option>
</select>
<b>Number</b>
<select name="one">
<option value="">Pick a number</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<input type="submit" name="search" value="SEARCHING" />
</form>
<?php
print ("$output <br />");
?>