在PDO中将列转换为布尔值

时间:2014-10-27 23:42:45

标签: php mysql pdo casting boolean

我在数据库中有一个字段('done'),它是boolean。 GET /行不返回带有该字段的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() .'}}';
}
}

如何将THAT列('done'列)作为布尔值?我的意思是,可以用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() .'}}';
}
}

3 个答案:

答案 0 :(得分:0)

我对此有点晚了,但是我想加2美分,因为这些最佳做法对所有人都有帮助,我认为这是使事情保持简单的好方法:

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

Mysql没有显式的布尔数据类型,因此我们在数据库中以1/0使用TINYINT(1)。 如果我们使用整数数据类型,我认为将参数绑定为布尔值不是很好的做法 尽管MYSQL在内部将true / false完美地转换为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常量,因此您始终可以根据驱动程序预先转换正确的类型

答案 1 :(得分:-1)

非常简单,

$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;
}

等。

答案 2 :(得分:-1)

在SQL中,没有真正的布尔值,因为您注意到10

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

另请注意,catch中生成的JSON无效,永远不会手动生成json。所以改变:

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

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