0

我目前正在开发一个应用程序,它将通过我编写的 PHP 服务与数据库进行通信。

我遇到问题的服务应该根据用户的搜索字符串在表中查找一行或多行。

下面的 PHP 旨在接收带有“名称”变量的 GET 请求,该变量将是 SQL 查询使用的数据。我看不出我的代码有什么问题,但是从搜索返回的行始终为 0。

// checks for the post data
if (isset($_GET["name"])) {
    $name = '%' . $_GET['name'] . '%';

    // get a list of products from the database
    $result = mysql_query("SELECT * FROM products WHERE name LIKE $name");

    if (!empty($result)) {
        // check for empty result
        if (mysql_num_rows($result) > 0) {

            $result = mysql_fetch_array($result);

            $products = array();
            $products["id"] = $row["id"];
            $products["name"] = $row["name"];
            $products["type"] = $row["type"];
            $products["price"] = $row["price"];
            $products["photo"] = $row["photo"];
            // success
            $response["success"] = 1;

            // products node
            $response["products"] = array();

            array_push($response["products"], $products);

            // echoing JSON response
            echo json_encode($response);
        } else {
            // no products found
            $response["success"] = 0;
            $response["message"] = "No products found";

            // echo no products JSON
            echo json_encode($response);
        }
    } else {
        // no products found
        $response["success"] = 0;
        $response["message"] = "Search Complete... No products found";

        // echo no products JSON
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}

我在它正在查看的表中有一个条目和一个名为“crisps”的条目,所以当我发送一个带有“cr”数据的 get 请求时,我希望在结果中看到该条目,但是它返回 0 行。

然后更奇怪的是,当我直接对我的数据库运行下面的 SQL 时,它实际上拉回了正确的记录。

SELECT * FROM products WHERE name LIKE "%cr%"

有任何想法吗??

4

2 回答 2

1

在您的查询中,您需要将引号添加' 到您的'$name'

  $result = mysql_query("SELECT * FROM products WHERE name LIKE '$name'");
于 2013-03-01T14:09:23.690 回答
1

因为你没有用单引号包裹这个值,所以记住它是一个字符串文字。

SELECT * FROM products WHERE name LIKE '$name'

作为旁注,SQL Injection如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

于 2013-03-01T14:09:35.253 回答