我在后端使用Flight framework构建RESTful服务,使用PDO从MySql检索数据。

require 'flight/Flight.php';

Flight::route('GET /satellites', function () {
    $sql = "SELECT * FROM satellites";
    try {
        $db = getConnection();
        $stmt = $db->prepare($sql);
        $stmt->execute();
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        $response = json_encode($stmt->fetchAll());
        $db = null;
        echo "{sucess: true, records:" . "$response" . "}";
    } catch (PDOException $e) {
        echo '{"error":{"text":' . $e->getMessage() . '}}';
    }
});

Flight::start();

我得到这个JSON响应:
{
    sucess: true,
    records:[
        {
            "id":"1",
            "dates":"01.01.2007 - 01.01.2011",
            "satellite":null,
            null:"98.2",
            "resolution":"15",
            "band":"30",
            "price":"$15"
        }
    ]
}

上面是正确的,但是satellite不应该为空,它肯定有一个值(我通过PHPMyAdmin检查过)。还有一个名为null的列,值为98.2,应该称为nadir。为什么叫空?
顺便说一下,satellite和nadir列的数据类型是varchar(255)。然后我将附属列数据类型改为文本,但都是一样的。

最佳答案

在您的记录中可能有隐藏字符,如您的var_dump数据所示:

array(1) {
 [0]=> array(10) {
  ["id"]=> string(1) "1"
  ["dates"]=> string(23) "01.01.2007 - 01.01.2011"
  ["satellite"]=> string(9) "SAT­7" // This 4 character is showing count 9
  ["nadir­"]=> string(4) "98.2"
  ["resolution"]=> string(2) "15"
  ["band"]=> string(2) "30"
  ["price"]=> string(3) "$15"
 }
}

上面的"SAT7"实际上看起来像4个字符的单词,但它有一些隐藏字符,var_dump显示计数。类似地,"nadir"也有隐藏字符。
解决上述问题并继续
这里json输出给出:
[{
    "id":"1",
    "dates":"01.01.2007 - 01.01.2011",
    "satellite":"SAT\u00ad7", // Hidden characters in value
    "nadir\u00ad":"98.2", // Hidden characters in field
    "resolution":"15",
    "band":"30",
    "price":"$15"
}]

07-24 09:50