【问题标题】:Array inside array doesnt show value of database preparement数组内的数组不显示数据库准备的值
【发布时间】:2019-09-20 20:36:00
【问题描述】:

我尝试创建圆圈并从数据库中获取数据。但它不显示值,它打印绑定。

function circle()
    {

        $sql = "SELECT count(projects.id) AS count, projects.status as status
                FROM user_projects
                    INNER JOIN projects ON projects.id = user_projects.project_id
                WHERE user_projects.user_id = :user_id
                AND projects.workspace = :current_workspace
                GROUP BY projects.status";


        $stmt = $this->db->prepare($sql);
        $stmt->execute(array(':user_id' => $this->id, ':current_workspace' => $this->userinfo['current_workspace']));
        //$stmt->debugDumpParams();
        $projectProcess = $stmt->fetch(PDO::FETCH_OBJ);
        //print_r($projectProcess);

        $total = $this->totalProjects();

        $arrProcessLable= [];
        $arrProcessPer = [];
        foreach ($projectProcess as $lable => $process){
            $arrProcessLable[]= $lable;
            $arrProcessPer[] = round(($process*100)/$total,2);
        }

        $arrProcessClass = ['text-success','text-primary','text-danger'];

        return ['a' => $arrProcessLable, 'b' => $arrProcessPer, 'c' => $arrProcessClass];
    }

数组打印“计数”而不是 6 之类的值。 它应该打印 6 个 project.id 计数。

同样,它打印“状态”,不像“正在进行”或“保持”,“完成” 它应该打印 6 个“正在进行”的项目

艾瑞:

Array
(
    [a] => Array
        (
            [0] => count
            [1] => status
        )

    [b] => Array
        (
            [0] => 100
            [1] => 0
        )

    [c] => Array
        (
            [0] => text-success
            [1] => text-primary
            [2] => text-danger
        )

)

【问题讨论】:

  • 您能多解释一下这部分吗? “它不显示值,它打印绑定”是什么意思。
  • @Dharman 它应该是 array( [a] => array ( [0] => 6 [1] => "Ongoing"...
  • 那么你的foreach循环的目的是什么?只需返回不带循环的原始$projectProcess

标签: php arrays foreach


【解决方案1】:

您需要单独获取每一行。换句话说,您需要在循环中调用fetch() 来访问每一行(或者,您可以fetchAll(),但如果您打算在脚本的同一“层”上迭代/处理数据,那是不合适的) .

请参阅此参考:https://phpdelusions.net/pdo/fetch_modes#FETCH_OBJ

您正在单行中迭代属性和值。但是,您应该迭代行并通过属性名称手动访问值。

未经测试的建议:

while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
    $arrProcessLable[] = $row->status;
    $arrProcessPer[] = round(($row->count * 100) / $total, 2);
}

补充说明:

  • 您不需要为 projects.status as status 加上别名,因为无论如何都会在结果集中为列 projects.status 赋予属性 status -- 省略了表名。

  • MySQL 具有合适的数学函数,允许您在 php 接触结果集之前执行所有计算。这可能是您感兴趣的事情。

  • 最后,如果您只想获取一次,->fetchAll(PDO::FETCH_KEY_PAIR) 看起来很有用,因为您将状态与其计数配对。请参阅上面的链接并向下滚动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2021-08-10
    • 2018-03-18
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多