我在数据库中有一个字段('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() .'}}';
}
}
答案 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中,没有真正的布尔值,因为您注意到1
和0
。
正确的术语是BIT
字段。您不应尝试修改它,如果您将其检索为1
和0
,则应将其插入为1
或0
。
另请注意,catch中生成的JSON无效,永远不会手动生成json。所以改变:
echo '{"error":{"text":'. $e->getMessage() .'}}';
到
echo json_encode(array('error'=>$e->getMessage()));