【问题标题】:Cast a column as Boolean in PDO在 PDO 中将列转换为布尔值
【发布时间】:2014-12-23 06:56:13
【问题描述】:

我在数据库中有一个布尔字段(“完成”)。获取/行的函数不返回该字段为布尔值的 json,但它返回 1 或 0。

function getTasks() {
$sql = "SELECT id,task_name,done FROM tarea ORDER BY id";
try {
    $db = getConnection();
    $stmt = $db->query($sql);
    $tasks= $stmt->fetchAll(PDO::FETCH_OBJ);
    $db = null;
    echo json_encode($tasks);
} catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}';
}
}

我怎样才能将那个列(“完成”列)作为布尔值?我的意思是,是否可以使用 PDO::PARAM_BOOL 投射列??

这是我在数据库中插入布尔值的 UPDATE 示例,它运行良好:

function updateTask($id) {
$request = Slim::getInstance()->request();
$body = $request->getBody();
$task = json_decode($body);
$sql = "UPDATE tarea SET task_name=:task_name, done=:done WHERE id=:id";

try {
    $db = getConnection();
    $stmt = $db->prepare($sql);
    $stmt->bindParam("task_name", $task->task_name);

    $stmt->bindParam("done", $task->done,PDO::PARAM_BOOL);  // cast before execute

    $stmt->bindParam("id", $id);
    $stmt->execute();
    $db = null;
    echo json_encode($task);
} catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}';
}
}

【问题讨论】:

  • 它对我不起作用,你提到的那个例子是用于 INSERT 和 UPDATE,而不是 SELECT...
  • 你不能在输出中使用 bindParam,你可以在结果中使用它。或者您可以使用自定义类来填充,但这只是我的答案的包装。

标签: php mysql pdo casting boolean


【解决方案1】:

我知道我在这方面有点晚了,但我想加上我的 2 美分,因为这些最佳做法会对每个人都有帮助,而且我认为这是让事情变得简单的好方法:

简单的信息:保持数据类型尽可能严格和明确,并准确地称呼它们。

Mysql 没有明确的布尔数据类型,所以我们在数据库中使用 TINYINT(1) 和 1/0。 如果我们使用整数数据类型,我认为将参数绑定为布尔值不是一个好习惯,而实际上它不是 虽然 MYSQL 在内部完美地将真/假转换为 1/0,但我觉得 1/0 应该显式绑定为整数

PGSQL 有一个明确的 True/false 数据类型,您可以在其中直接传递 true/false PGSQL 有许多其他选项,例如 'yes'、'no' 需要用引号括起来,这使得它更加混乱,因为字符串值被解释为布尔值。那是错误的,它们应该被视为字符串。

$sql->bindParam(':done',1,PDO::PARAM_INT);
$sql->bindParam(':done',true,PDO::PARAM_BOOL);
//In my code I have created some wrapper,
//Explicit true/false & adds PARAM_BOOL
$sql->bind('done',$done,'bool');
//Expects only 1 or 0
$sql->bind('done',$done,'bit');

我刚刚在 PDO 之上构建了一个库,它强制执行严格类型,这允许您显式类型检查数据类型并自动选择适当的 PDO 常量,因此您始终可以根据驱动程序预先转换正确的类型

【讨论】:

    【解决方案2】:

    在 SQL 中实际上没有布尔值,因为您注意到 10

    正确的术语是BIT 字段。您不应该尝试修改它,如果您将其检索为10,那么您应该将其插入为10

    还要注意catch中会产生的JSON是无效的,千万不要手动构建json。所以改变:

    echo '{"error":{"text":'. $e->getMessage() .'}}';
    

    echo json_encode(array('error'=>$e->getMessage()));
    

    【讨论】:

      【解决方案3】:

      真的很简单,

      $tasks = array();
      while( false !== ( $task = $stmt->fetch(PDO::FETCH_OBJ) ) ){
         $task->done = (bool)$task->done;
         $tasks[] = $task;
      }
      

      如果这不起作用,你也可以这样做

      if(intval($task->done)){
         $task->done = true;
      }else{
         $task->done = false;
      }
      

      等等。

      【讨论】:

      • 好吧,我们试试吧!谢谢! :D
      • 令人印象深刻!有时简单的事情就可以完成工作。我刚刚替换了“$tasks= $stmt->fetchAll(PDO::FETCH_OBJ);”对于您的第一段代码
      • @Frankistan 如果这确实帮助您检查此答案左侧的标记。始终接受对您有用的答案。 meta.stackexchange.com/questions/5234/…
      • @Frankistan - 很高兴我能帮上忙。通常很容易让事情变得过于复杂。始终尝试以“批准”的方式做事,如果失败,请以最简单的方式进行。通常,您也会通过这种方式获得更好的性能。
      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 2012-02-25
      • 2015-02-20
      • 1970-01-01
      相关资源
      最近更新 更多