0

私は現在、自分が作成したPHPサービスを介してデータベースと通信するアプリケーションを開発しています。

私が問題を抱えているサービスは、ユーザーからの検索文字列に基づいてテーブル内の1つまたは複数の行を検索する必要があるサービスです。

以下のPHPは、SQLクエリが使用するデータとなる「name」の変数を使用してGETリクエストを受信するように設計されています。コードに問題はありませんが、検索から返される行は常に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値が外部から取得された場合、クエリは脆弱です。予防方法については、以下の記事をご覧ください。を使用すると、値を一重引用符で囲む必要がなくなります。PreparedStatements

于 2013-03-01T14:09:35.253 に答える