1

我应该使用mysql_num_rows( rowCountin PDO) inupdate还是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

4 回答 4

2

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

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

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

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

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

于 2012-09-11T10:42:46.423 回答
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;
}
于 2012-09-11T10:40:35.953 回答
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
  }
}
于 2012-09-11T10:54:25.253 回答
1

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

于 2012-09-11T10:55:31.510 回答