我需要一些帮助..我有一个php脚本,它基于3个关键字在数据库上执行搜索,并且查询在数据库的phpadmin上运行良好,但返回的JSON响应没有找到结果("没有找到empresa")。谁能告诉我为什么?如果我执行单表搜索,它完美地工作。 (如果我只使用与一个表关联的关键字)
关键字1用于表A上的名称 关键字2适用于桌面价格的PriceRange 关键字3适用于表格部门的扇区
表格如下:
Table A Table Prices Table Sectors
Name PriceRange Sector ID Pricerange ID Sector
XY 1 2 1 100€ to 200€ 1 Computers
YX 2 1 2 200€ to 300€ 2 Tablets
PHP脚本
<?php
error_reporting(0);
require_once('db_config.php');
$conn = mysql_connect($db_server, $db_user, $db_password) or die(mysql_error());
$db= mysql_select_db($db_database, $conn);
header('content-type: application/json; charset=utf-8');
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');
// array for JSON response
$response = array();
// get empresa based on keyword
$keyword=$_GET["keyword"];
$keyword2=$_GET["keyword2"];
$keyword3=$_GET["keyword3"];
if($keyword2 == "Todos os Setores" and $keyword3 == "Qualquer Investimento" ):
$result = mysql_query("SELECT * FROM empresa WHERE marca LIKE '%$keyword%' and ficha LIKE '%1' ") or die(mysql_error());
elseif($keyword2 == "Todos os Setores"):
$result = mysql_query("SELECT empresa.ficha, empresa.marca, empresa.empresa, empresa.descricao, empresa.imagempequena from empresa , investimento where investimento.investimento='%$keyword3%' and empresa.nivelinvestimento=investimento.id and empresa.ficha LIKE '%1' and empresa.marca LIKE '%$keyword%'") or die(mysql_error());
elseif($keyword3 == "Qualquer Investimento"):
$result = mysql_query("SELECT empresa.ficha, empresa.marca, empresa.empresa, empresa.descricao, empresa.imagempequena from empresa, sector where sector.sector='%$keyword2%' and empresa.sector=sector.id and empresa.ficha LIKE '%1' and empresa.marca LIKE '%$keyword%'") or die(mysql_error());
else:
//query a funcionar
$result = mysql_query("SELECT empresa.ficha, empresa.marca, empresa.empresa, empresa.descricao, empresa.imagempequena from empresa , investimento, sector where investimento.investimento='%$keyword3%' and empresa.nivelinvestimento=investimento.id and sector.sector='%$keyword2%' and empresa.sector=sector.id and empresa.ficha LIKE '%1' and empresa.marca LIKE '%$keyword%'") or die(mysql_error());
endif;
// check for empty results
if (mysql_num_rows($result) > 0) {
// looping through all results
$response["empresa"] = array();
while ($row = mysql_fetch_array($result)) {
// temp user array
$empresa= array();
$empresa["marca"] = $row["marca"];
$empresa["empresa"] = $row["empresa"];
$empresa["descricao"] = $row["descricao"];
$empresa["imagempequena"] = $row["imagempequena"];
// push single empresa array into final response array
array_push($response["empresa"], $empresa);
}
// success
$response["success"] = 1;
// echoing JSON response
echo json_encode($response);
} else {
// no products found
$response["success"] = 0;
$response["message"] = "No empresa found";
// echo no users JSON
echo json_encode($response);
}
?>
答案 0 :(得分:1)
这是你的问题:
where investimento.investimento='%$keyword3%'
^---
在大多数查询中,您使用的是SQL通配符,只有在使用LIKE
运算符时才能使用。在进行直接相等测试=
时,通配符是普通字符,没有特殊含义
这意味着,如果您正在搜索关键字foo
,则告诉数据库对包含文字字符%
,{{1}的记录执行完全字符串匹配},f
,o
和o
。
e.g。这两个查询直接等价:
%
以及这两个
WHERE foo = '%bar%'
WHERE substr(foo, 0, 1) = '%' AND substr(foo, 1, 1) = 'b' AND ....
请注意,正如其他人所指出的那样,你很容易受到sql injection attacks的攻击。</ p>
答案 1 :(得分:0)
您的代码的问题在于引号'%keyword%'
请尝试使用此'%".mysql_real_escape_string($keyword)."%'
并且老实说,您可以使用sql注入,这样一段代码就可以解决您的大多数担忧。 ;)