在更新或插入查询中是否需要使用mysql_num_rows(PDO中的rowCount)?

时间:2012-09-11 10:38:39

标签: php rowcount mysql-num-rows

我应该在mysql_num_rowsrowCount查询中使用PDOupdate中的insert)吗? 目前,我的代码看起来像这样,

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;
    }
}

正常情况下,查询没有任何错误,所以我不应该担心它太多,但是哪一个更好的编码习惯?或者你是否建议别的?

提前非常感谢!

4 个答案:

答案 0 :(得分:2)

实际上这两个代码做了不同的事情。

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

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

通常,要回答您的问题,只有在您想知道受影响的行数时才需要mysql_num_rows。使用它并不是强制性的。

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

答案 1 :(得分:1)

如果您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;
}

答案 2 :(得分:1)

首先,因为查询成功执行,并不一定意味着任何事情都已更新。因此,如果您需要区分查询有效性或更新更改之间的差异,那么是的,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
  }
}

答案 3 :(得分:1)

根据具体情况,您必须选择应使用的部分。 mysql_num_rows()用于检查已执行查询的行数。因此,由您决定是否确实需要将mysql_num_rows()函数添加到您的代码中。