PDO更新失败

时间:2013-03-09 18:16:03

标签: php mysql codeigniter pdo sql-update

我在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的第一个查询工作得很好......

然后我尝试使用&&&&但似乎第二个甚至不影响if语句的结果。

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

3 个答案:

答案 0 :(得分: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语句中避免多次赋值,因为这样做会让人感到困惑!

答案 1 :(得分: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是否正确(从您复制/粘贴),但我的观点是,一旦您更好地构建代码,就会更容易解决问题。

答案 2 :(得分: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,   $评论))&& ($ time = $ this - > staff_model - > studenttime($ anum))){

     

我建议你避免if语句中的多个赋值   那只是因为,这很令人困惑!

很有意义。 1