1

我在 PHP 框架 COdeigniter 中使用 PDO 驱动程序。

一旦有人点击“提交”按钮,我必须运行两个查询。

一个是插入,下一个(问题查询)是更新。

这是我模型中的代码片段:

function studenttime($anum) {
    try {
        $times = NULL;

        $sql = "UPDATE student SET last_visit = :times WHERE anum = :anum";
        $time = $this -> db -> conn_id -> prepare($sql);
        $time -> bindParam(':times', $times);
        $time -> bindParam(':anum', $anum);
        $time -> execute();
        if ($time -> rowCount() == 1) {
            return $time;
        }

    } catch (PDOException $e) {
        error_log($e -> getMessage());
        die("An Error Occured, Contact System Admin - Err: SFM136");
    }
}

这是我的控制器:

} else {
                if ($session = $this -> staff_model -> session($anum, $why, $aidyear, $comments) && $time = $this -> staff_model -> studenttime($anum)) {

                    $this -> session -> unset_userdata('anum');
                    $this -> session -> unset_userdata('first');
                    $this -> session -> unset_userdata('last');
                    $this -> session -> unset_userdata('aidyear');
                    $this -> session -> unset_userdata('why');
                    $this -> session -> unset_userdata('comments');

                    redirect('staff_controller/studentlogin', 'location');
                }
            }

在我的模型中调用 $session = session 的第一个查询工作得很好......

然后我尝试使用 && 在一个 else 语句中进行两个查询,但似乎第二个甚至不会影响 if 语句的结果。

我看不出我在这里做错了什么,因为我的控制器到处都是一堆这样的代码片段,所以我看不到这个特定的问题。

4

3 回答 3

1

这是由于运算符优先级。

尝试运行此代码作为示例:

if ($a = 5 && $b = 6) {
    var_dump($a); // Output: bool(true)
}

为什么?因为它和这个是一样的:

if ($a = (5 && $b = 6)) {
    var_dump($a); // Output: bool(true)
}

故事的寓意:在 if 语句和类似语句中的赋值周围加上括号。

这应该会更好:

if (($session = $this -> staff_model -> session($anum, $why, $aidyear, $comments)) && ($time = $this -> staff_model -> studenttime($anum))) {

我建议您避免在这样的 if 语句中进行多次赋值,因为这很令人困惑!

于 2013-03-09T18:24:12.983 回答
0

你应该让你的 if 语句更容易阅读,无论是对你自己还是对任何将要阅读代码的人都是如此。另外,不要在 if 语句中间为变量赋值,一切都应该在你到达那里的时候决定,仅仅因为编程语言可以在 if 语句中处理变量赋值并不意味着它会按照你认为他们会工作的方式工作。

$a = $session = $this -> staff_model -> session($anum, $why, $aidyear, $comments);
$b = $time = $this -> staff_model -> studenttime($anum);

现在你可以做类似的事情。

if($a && $b)
{
    //...
}

如果你真的想取消设置你活跃的所有会话,那么你可以使用

session_destroy();

但如果你只是想破坏一个子集,那么当然,按照你的方式去做。

我不知道我发布的 $a 和 $b 是否正确(从您那里复制/粘贴),但我的意思是,一旦您更好地构建代码,那么解决问题就会变得更容易。

于 2013-03-09T18:34:34.167 回答
0

问题实际上是由我模型中的其他方法引起的:

function checkanum($anum) {
        try {
            $sql3 = "SELECT * FROM student WHERE anum = : anum";
            $check = $this -> db -> conn_id -> prepare($sql3);
            $check -> bindParam(':anum', $anum);
            $check -> execute();
            if ($check -> rowCount() == 1) {
                return $check;
            }
        } catch (PDOException $e) {
            error_log($e -> getMessage());
            die("An Error Occured, Contact System Admin - Err: ST_M79");
        }
    }

它等于 == 0,它应该是 1。

我的控制器将检查记录是否已经存在,如果存在,则只需更新再次查询的时间。当我故意拼错 if 语句中的一项作业时,我发现了这一点,我注意到它没有给出错误,这给了我确定我的逻辑有缺陷所需的信息。现在一切正常。

感谢您的投入。我喜欢奥斯卡添加的补充:

这应该会更好:

if (($session = $this -> staff_model -> session($anum, $why, $aidyear, $comments)) && ($time = $this -> staff_model -> studenttime($anum))) {

我建议您避免在这样的 if 语句中进行多次赋值,因为这很令人困惑!

很有意义。+1

于 2013-03-09T19:42:06.637 回答