PHP脚本没有返回预期的JSON响应

时间:2014-10-29 14:24:50

标签: php mysql json

我需要一些帮助..我有一个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);
}
?>

2 个答案:

答案 0 :(得分:1)

这是你的问题:

where investimento.investimento='%$keyword3%'
                               ^---

在大多数查询中,您使用的是SQL通配符,只有在使用LIKE运算符时才能使用。在进行直接相等测试=时,通配符是普通字符,没有特殊含义

这意味着,如果您正在搜索关键字foo,则告诉数据库对包含文字字符%,{{1}的记录执行完全字符串匹配},foo

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注入,这样一段代码就可以解决您的大多数担忧。 ;)