提交给定次数的相同表单:为什么此代码不起作用?

时间:2014-11-30 09:00:22

标签: php forms yii2

因此,我正在进行一项测验,其中用户面临一系列问题,他通过表格回答这些问题。 一系列问题每个都包含一定数量的问题,当用户验证时,问题会一个接一个地被问到。

因此,我尝试使用每个问题的表单重新呈现视图,直到他们完成所有操作。这是我的行动:

public function actionAnswer($id_serie)
{
    if ($id_serie != 0)                          //getting the serie's info
    {
        $serie = Serie::find()
            ->where(['id' => $id_serie])
            ->one();
        $problems = (new \yii\db\Query())        //getting the problems in the serie
            ->select('*')
            ->from('problems')
            ->where(['id_serie' => $id_serie])
            ->all();
        $prob_counter = $serie->nbr_of_problems; //counts the number of questions answered
        $id_serie = 0;
    }
    $model = new Answer;
    if ($model->load(Yii::$app->request->post()) && $model->validate())
    {
        $model->save();     // works just fine every time
        if (--$prob_counter <= 0)
        {
            return $this->redirect('index.php?r=student/entry');
        }
    }
    return $this->render('answer',
            ['model' => $model,
            'problems' => $problems,
            'serie' => $serie,
            'prob_counter' => $prob_counter,       //these last two are for debug
            'id_serie' => $id_serie]);
}

第一次执行此操作时,$ id_serie永远不会为null或= 0。因此,我使用它只查询数据库一次,并设置一个计数器与系列中的问题总数。 (id est用户提交表单的时间) 如果他的答案是有效的,我会递减我的计数器,如果它低于0,则不再有问题可以回答,用户会被重定向。

然而,这个计数器永远不会降到0:它设置正确,只减少一次,然后它永远不会降低,无论我把线放在哪里。 (任何循环内部或外部) 另一方面,表单中的数据每次都正确地插入到数据库中。

我出错了什么?

1 个答案:

答案 0 :(得分:0)

根据您的代码,$prob_counter只存储每个系列的问题数量。您需要更改此项以显示该系列的未答复问题的数量。如何实现这将取决于您的模型和数据库,但它应该是这样的:

$problems = (new \yii\db\Query())        //getting the problems in the serie
        ->select('*')
        ->from('problems')
        ->where(['id_serie' => $id_serie])
        ->andWhere('not exists (select id from answer where problemid = problems.id')
        ->all();

此外,您应该查看working with relational data并避免在上一节中使用Query()