【问题标题】:Sql statement returns null when there is actually a valuesql语句在实际有值时返回null
【发布时间】:2014-02-15 05:54:50
【问题描述】:

我在后端使用 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,应称为最低点。为什么叫null?

顺便说一句,卫星和最低点列的数据类型是 varchar(255)。然后我将卫星列数据类型更改为文本,但都一样。

【问题讨论】:

  • 你的排序规则是什么?
  • 你检查过是不是json_encode()的问题? $stmt->fetchAll() 返回什么?
  • 为什么db的字段名是null
  • 顺便说一句,数据库中的文本是从 odt 文档中复制粘贴的。如果重要的话。
  • null怎么可以是字段名(属性)???

标签: php mysql json pdo


【解决方案1】:
  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
   );

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2011-06-09
      • 2016-05-25
      • 2022-10-13
      相关资源
      最近更新 更多