【问题标题】:MySQL: Selecting boolean value from JSON fieldMySQL:从 JSON 字段中选择布尔值
【发布时间】:2017-12-31 11:07:24
【问题描述】:

我使用的是 MySQL 5.7.19

我正在尝试检索如下所示的类

class Task
{
    public $title;
    public $done;
}

titledone 属性保存在 JSON 列中。

我用来检索的代码如下:

    $tasksSql = <<<'EOT'
    SELECT  JSON_UNQUOTE(JSON_EXTRACT(data, '$.title')) AS title,
            JSON_EXTRACT(data, '$.done') AS done
                FROM Tasks WHERE TaskListId = ?;
EOT;
    $tasksStatement = $connection->prepare($tasksSql);
    $tasksStatement->execute([$id]);
    $tasksStatement->setFetchMode(PDO::FETCH_CLASS, "Task");
    $taskList->tasks = $tasksStatement->fetchAll(PDO::FETCH_CLASS, "Task");

它会填写所有字段,但 done 属性会设置字符串值“true”或“false”而不是布尔值。

【问题讨论】:

  • 你得到什么字符串值? “1”还是“真”?
  • “真”或“假”

标签: php mysql json pdo mysql-json


【解决方案1】:

我认为 PDO 无法识别返回的布尔值,它只是假设它只是字符串。这与使用的 JSON 无关。您可以更改您的查询

JSON_EXTRACT(data, '$.done') AS done

进入

JSON_EXTRACT(data, '$.done') = true AS done

改为将其更改为整数 0/1。

或者更改您的 PHP 代码以将返回的值解析为布尔值。例如,通过为 tasks 对象添加构造函数:

class Task {
    public $title; // string
    public $done; // bool
    // ...

    public function __construct() {
        $this->done = $done == 'true';
    }
}

甚至让 PDO 使用匿名函数进行转换:

$taskList->tasks = $tasksStatement->fetchAll(PDO::FETCH_FUNC, function($title, $done) { $task = new Task(); $task->title = $title; $task->done = $done == 'true'; return $task;});

【讨论】:

  • 很遗憾这也不起作用。属性被设置为字符串值“1”或“0”。
  • 我假设 PDO 无法识别布尔值。您可以通过快速将查询输入select 'foo' as title, true as done; 来确认这一点...我认为您仍然会得到字符串'true'...
  • 没错。这是否意味着您不能使用 PDO 解析任何布尔值?我从来都不是 PHP 的粉丝,但这种语言永远不会让人失望。
  • @Philippe 我已经编辑了答案以添加一些选项。
  • 谢谢,我最终使用了构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 2015-01-24
  • 2021-07-13
相关资源
最近更新 更多