1

またはクエリでmysql_num_rows( rowCountin PDO)を使用する必要がありますか? 現在、私のコードは次のようになっています。updateinsert

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

実際には、2 つのコードは異なることを行います。

クエリが正常に実行された場合、最初のものは「更新の成功」を出力します。ただし、行に影響を与えずにクエリを正常に実行することもできます。つまり、WHERE一致しない statamenet があります。行が影響を受けなかった場合、2 番目のコードは「更新成功」を出力しません。

もちろん、WHEREステートメントが一致する必要があると確信している場合は、両方のコードを違いなく使用できます。2 番目のコードを使用すると、潜在的なバグを発見するのに役立ちます。 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 を使用することをお勧めします。

第 2 に、変数 (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 に答える