【问题标题】:PDO Update UnsuccessfullPDO 更新失败
【发布时间】:2013-02-25 04:33:38
【问题描述】:

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

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

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

这是我模型中的代码 sn-p :

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 语句的结果。

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

【问题讨论】:

    标签: php mysql codeigniter pdo sql-update


    【解决方案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 语句中进行多次赋值,因为这很混乱!

    【讨论】:

    • 这也没有用。我所有的查询除了我在 OP 工作中发布的查询。这真的很奇怪......
    【解决方案2】:

    您应该使您的 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 是否正确(从您那里复制/粘贴),但我的意思是,一旦您更好地构建代码,那么解决问题就会变得更容易。

    【讨论】:

      【解决方案3】:

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

      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, $cmets)) && ($time = $this -> staff_model -> studenttime($anum))) {

      我建议您避免在 if 语句中进行多次分配,例如 这仅仅是因为,嗯,它令人困惑!

      很有道理。 +1

      【讨论】:

        猜你喜欢
        • 2017-01-04
        • 2012-07-25
        • 2014-01-26
        • 2021-03-05
        • 2018-05-07
        • 2012-12-23
        • 2022-01-17
        • 2014-03-01
        • 2015-09-24
        相关资源
        最近更新 更多