sql语句在实际有值时返回null

Posted

技术标签:

【中文标题】sql语句在实际有值时返回null【英文标题】:Sql statement returns null when there is actually a value 【发布时间】: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怎么可以是字段名(属性)??? 【参考方案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"
]

【讨论】:

以上是关于sql语句在实际有值时返回null的主要内容,如果未能解决你的问题,请参考以下文章

没有值时带有 CASE 的 SQL 语句

sql语句 not in在表里有空值时就查询不到

插入mysql数据库,sql语句没错,每个字段都有值,但到插入到数据库后值为空。为啥?

如何用SQL语句修改一个表的字段,让它不能为空

尝试在 SQL 中插入多个值时如何修复语句结尾?

Laravel Eloquent empty() 函数在 $request->url 有值时返回 true