Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在PDO中将列强制转换为布尔值_Php_Mysql_Pdo_Casting_Boolean - Fatal编程技术网

Php 在PDO中将列强制转换为布尔值

Php 在PDO中将列强制转换为布尔值,php,mysql,pdo,casting,boolean,Php,Mysql,Pdo,Casting,Boolean,我在数据库中有一个布尔字段“done”。GET/The rows函数不返回该字段为布尔值的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);

我在数据库中有一个布尔字段“done”。GET/The rows函数不返回该字段为布尔值的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() .'}}';
}
}
如何将该列“done”列设置为布尔值?我的意思是,可以用PDO::PARAM_BOOL

下面是我的更新示例,它在数据库中插入布尔值,效果非常好:

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() .'}}';
}
}
很简单,

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

等等,

在SQL中实际上没有布尔值,正如您注意到的1和0

正确的术语是位字段。您不应该尝试修改它,如果您将其检索为1和0,则应将其插入为1或0

还要注意,catch中生成的JSON无效,永远不要手动构建JSON。因此,改变:

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


我知道我在这方面有点晚了,但我想补充我的2美分,因为这些最佳实践将帮助每个人,我认为这是一个保持简单的好方法:

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

$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');
Mysql没有显式的布尔数据类型,因此我们在1/0的数据库中使用TINYINT1。 如果我们使用的是整数数据类型,我不认为将参数绑定为布尔值是一种好的做法,而实际上它不是 虽然MYSQL在内部将true/false完美地转换为1/0,但我觉得1/0应该显式绑定为整数

PGSQL有一个显式的True/false数据类型,您可以在其中直接传递True/false PGSQL还有许多其他选项,如“是”、“否”,这些选项需要用引号括起来,这使得字符串值被解释为布尔值时更容易混淆。这是错误的,它们应该被视为字符串,因为它们就是字符串

$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常量,因此您总是根据驱动程序预先铸造正确的类型

这对我不起作用,您提到的示例用于插入和更新,不适用于选择…您不能在输出上使用bindParam,您可以在结果中强制转换它。或者您可以使用自定义类来填充,但这只是我答案的包装。好吧,让我们试试!谢谢笨蛋!有时简单的事情就能完成工作。我刚刚替换了$tasks=$stmt->fetchAllPDO::FETCH_OBJ;为了你生命的第一部分code@Frankistan如果这有助于您,请检查答案左侧的标记。总是接受对你有用的答案@法兰克斯坦-很高兴我能帮忙。通常情况下,让事情变得过于复杂太容易了。总是试着用认可的方式做事,如果失败了,就用最简单的方式去做。通常,通过这种方式,您也会获得更好的性能。