当实际存在值时,Sql语句返回null

时间:2014-01-24 09:43:25

标签: php mysql json pdo

我在后端使用Flight框架来构建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"
        }
    ]
}

以上是正确的,但卫星不应该为空,它肯定有一个值(我通过PHPMyAdmin检查它)。还有一个名为null的列,值为98.2,应该称为nadir。为什么称为null?

BTW,卫星和天底列的数据类型是varchar(255)。然后我将卫星列数据类型更改为文本,但都是一样的。

2 个答案:

答案 0 :(得分:1)

在您的记录中,可能存在隐藏字符,因为您的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"
}]

答案 1 :(得分:0)

  in  getConnection(); you use 
   // You might missing this line set utf8
   $pdoParams = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;');

   $params = array(
    'host' => 'localhost',        'username' => 'username',
    'password' => 'password',
    'dbname' => 'dbname',
    'driver_options' => $pdoParams
   );