【问题标题】:Picking up an array of values from php request and running a mysql query从 php 请求中获取一组值并运行 mysql 查询
【发布时间】:2016-01-05 13:50:23
【问题描述】:

我有这张表,其中包含以下列。

  • 身份证
  • place_id
  • 姓名
  • 纬度
  • 经度
  • 优惠

我必须在给定一组地点 ID 的情况下获得报价。但是我实现这个的方式,它不会返回任何结果。以下是我的要求。

http://localhost:8001/googleplaces/getOffers.php?place_id[]=%22epc888%22&place_id[]=%22epc999%22

下面是我写的PHP脚本。

<?php
    $response = array();
    $pid =array();
    require_once __DIR__ . '/db_connect.php';
    $db = new DB_CONNECT();
    if (isset($_GET["place_id"])) {
       $pid = $_GET['place_id'];

       $result = mysql_query("SELECT * FROM places WHERE place_id IN ($pid)");

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

        $result = mysql_fetch_array($result);

        $place = array();
        $place["place_id"] = $result["place_id"];
        $place["offers"] = $result["offers"];
        // success
        $response["success"] = 1;

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

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

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

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

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

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

虽然有几条记录满足上述要求,但这是我得到的响应。

{"success":0,"message":"No offers found"}

我在这里做错了什么?请指教。我是 PHP 新手。

【问题讨论】:

  • 你为什么使用 mysql_ -- 这些函数已被弃用?您的代码也容易受到 SQL 注入的攻击。
  • 是的,这是一个通过我的 android 应用程序调用的小代码片段。所以我不介意那些:) 你能告诉我我哪里出错了吗? :(
  • @trincot 我照你说的做了。请参考已编辑的问题。但我仍然只得到一个输出。请帮忙:(

标签: php mysql arrays get


【解决方案1】:

当 PHP 检测到 URL 参数 place_id[] 是数组类型时,它会将值显示为数组。但是,您将 $pid 注入到您的 SQL 中。 PHP 将对此发出警告,但仍会进行隐式转换并继续。例如,如果数组是 (1, 2, 3),那么它将被转换为字符串 "Array.1,2,3",从而导致到无效的 SQL 语法。

非常快速的解决方案是将该数组转换为逗号分隔的字符串,如下所示:

$pid = implode(",", $_GET['place_id']);

但是,这很重要:您的代码容易受到SQL injection 的攻击。如果有人知道要发送到您的 PHP 代码的 URL,他们可能会造成很大的损失!您应该使用 prepared statements(并移至 mysqliPDO!)来代替参数。

您还应该将结果处理变成一个循环来处理所有记录,并将它们收集到一个数组中。因此,将if 替换为while,并直接填充$response["place"]。请注意,您的 if 用第一条记录的数组覆盖了原始 $results 结果集,这使您丢失了原始 $result 对象。但是你需要它来循环它。所以我引入变量$row

// check for empty result
if (mysql_num_rows($result) > 0) {
    // user node
    $response["place"] = array(); // array of places
    while ($row = mysql_fetch_array($result)) {
        $response["place"][] = array(
            "place_id" => $row["place_id"],
            "offers" => $row["offers"]
        );
    }
    // success
    $response["success"] = 1;
    // echoing JSON response
    echo json_encode($response);
}

【讨论】:

  • 添加该行后,我只得到一条记录。另一个不归还。我返回记录的方式是否正确? $place 数组是否包含所有输出?
  • 使用 while 循环,查看更新的答案。另请注意,您在从$result 获取时分配给$result ---> 非常糟糕的代码!
  • 非常感谢伙计!搞定了。
【解决方案2】:

这:$_GET['place_id'] 在您的示例中是一个数组,因此您需要将其视为查询中的数组。

所以你可以这样做:

$pid = implode(",", $_GET['place_id']);

不是最好的方法,但它应该可以正常工作。不过,您可能想逃脱并对其进行消毒。


要获得所有结果,您需要像这样遍历它们:

    // success
    $response["success"] = 1;
    // user node
    $response["place"] = array();

    while ($result = mysql_fetch_array($result)) {
        $response["place"][] = array( 
            "place_id" => $result["place_id"],
            "offers" => $result["offers"],
        );
    }

【讨论】:

  • 添加该行后,我只得到一条记录。另一个不归还。我返回记录的方式是否正确? $place 数组是否包含所有输出?
  • 是的,我认为这就是您想要的方式,如果您需要返回所有结果,那么您需要遍历它们。我可以更新我的答案。
  • 在第 26 行的 C:\wamp\www\googleplaces\getOffers.php 中放置代码后出现此错误 :( 解析错误:语法错误,意外 ';',期待 ')'
  • 谢谢老兄我找到了解决办法:)
猜你喜欢
  • 2013-10-07
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2015-04-11
  • 1970-01-01
相关资源
最近更新 更多