【问题标题】:Is using mysql_num_rows (rowCount in PDO) necessary in update or insert query?在更新或插入查询中是否需要使用 mysql_num_rows(PDO 中的 rowCount)?
【发布时间】:2012-09-11 10:38:38
【问题描述】:

我应该在updateinsert 查询中使用mysql_num_rowsrowCount 中的rowCount)吗? 目前,我的代码如下所示,

public function update_username(){
    $q = "UPDATE usertable SET username = '$user_name' WHERE id = '$user_id' LIMIT 1";
    $r = $db->query($q);
    if($r){
        $message = "Updated successfully";
        return $message;
    }else{
        return false;
    }
}

我应该把它改成这样吗?

public function update_username(){
    $q = "UPDATE usertable SET username = '$user_name' WHERE id = '$user_id' LIMIT 1";
    $r = $db->query($q);
    if($r){
        $num = $r->rowCount();
        if($num == 1){
            $message = "Updated successfully";
            return $message;
        }else{
            $message = "An error occurred";
            return $message;
        }
    }else{
        return false;
    }
}

通常,查询不会出现任何错误,所以我不应该太担心,但是哪个是更好的编码实践?或者你有什么建议吗?

提前非常感谢!

【问题讨论】:

    标签: php rowcount mysql-num-rows


    【解决方案1】:

    其实这两个代码的作用是不同的。

    如果查询成功执行,第一个将打印“更新成功”。但是查询也可以成功执行而不会影响任何行,即您有一个不匹配的WHERE statamenet。如果没有行受到影响,第二个代码将不会打印“更新成功”。

    当然,如果您确定您的 WHERE 语句必须匹配,您可以毫无区别地使用这两个代码,并且使用第二个代码可以帮助您发现任何潜在的错误,即它不匹配并且所以出了点问题(可能 id 与您预期的不同)。

    一般来说,要回答您的问题,只有在您想知道有多少行受到影响时才需要mysql_num_rows。完全不需要使用它。

    所以,这取决于你想要什么。两者都很好,但它们是不同的。

    【讨论】:

      【解决方案2】:

      如果您 100% 确定变量是由您而不是其他人创建的,您可以这样做,但您可以进一步最小化代码:

      public function update_username(){
          $q = "UPDATE usertable SET username = '$user_name' WHERE id = '$user_id'";
          if($db->query($q)){
              return "Updated successfully";
          }
          return false;
      }
      

      【讨论】:

        【解决方案3】:

        首先,因为查询成功执行,并不一定意味着任何内容都已更新。因此,如果您需要区分查询有效性或更新更改之间的差异,那么是的,rowCount 将是一个很好的做法。

        其次,在分配变量(SQL 注入等)时使用准备好的语句会更明智。

        public function update_username(){
          $q = "UPDATE usertable SET username = :user_name WHERE id = :user_id LIMIT 1";
          $r = $db->prepare($q);
          $r->bindValue(':user_name', $user_name);
          $r->bindValue(':user_id', $user_id);
          if($r->execute()){
            $message = "Updated successfully: updated ".$r->rowCount();
            return $message;
          }else{
             return false;
          }
        }
        

        为避免代码重复,也许您应该考虑避免为查询编写相同的执行代码,并将其移至为您完成所有操作的方法/函数,例如

        public function validateStmt($r) {
          // validate query
          if($r->execute()) {
            // check result set
            if($r->rowCount() > 0) {
              return $r;
            }
            else {
              // if a result set IS expected, then you might consider to handle this as
              // a warning or an error
            }
          }
          else {
            // query invalid
          }
        }
        

        【讨论】:

          【解决方案4】:

          根据情况,您必须选择应该使用的部分。 mysql_num_rows() 用于检查您执行的查询影响了多少行。因此,由您决定是否真的有必要将 mysql_num_rows() 函数添加到您的代码中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-06
            • 1970-01-01
            • 2015-12-18
            • 1970-01-01
            • 1970-01-01
            • 2017-03-22
            • 1970-01-01
            相关资源
            最近更新 更多