web-dev-qa-db-ja.com

CodeIgniterでMySQL更新クエリが成功したかどうかをテストするにはどうすればよいですか?

CodeIgniterアプリケーションでユーザーを更新するモデル関数があります。

// updates first of a user, return true if successful, false if not.
public function updateFirstName($userId, $newFirstName) {
    $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId");
    return // whether request was successful?
}

ID $userIdのユーザーが更新されたことを確認するブール値を返すにはどうすればよいですか?たとえば、ID $userIdのユーザーが見つからなかった場合、falseを返す必要があります。

21
John Hoffman

コメントどおり$this->db->affected_rows()を試しましたか?

これにより、更新された行数がわかります。

36
ChrisK
if ($this->db->affected_rows() > 0)
{
  return TRUE;
}
else
{
  return FALSE;
}

または

if ($this->db->affected_rows() > 0)
  return TRUE;
else
  return FALSE;

または

return ($this->db->affected_rows() > 0) ? TRUE : FALSE; 

[〜#〜] edit [〜#〜]

また(はるかに良い)

return ($this->db->affected_rows() > 0);
11
Andre Dublin

詳しくはこちらをご覧ください。 アクティブレコード

public function updateFirstName($userId, $newFirstName) {

   return $this->db
               ->where('id', $userId)
               ->update("users", array('firstName' => $newFirstName));
}

この方法を使用すると、以前のSQLインジェクションも回避できます。

11
safarov

私が見つけたより良い解決策は、ERRORと0の影響を受ける行の違いを管理することです。 0の影響を受ける行は必ずしも悪いことではありませんが、エラーはあなたが知りたいことです:

if ($this->db->_error_message()) {
    return FALSE; // Or do whatever you gotta do here to raise an error
} else {
    return $this->db->affected_rows();
}

今、あなたの機能は区別することができます...

if ($result === FALSE) {
    $this->errors[] = 'ERROR: Did not update, some error occurred.';
} else if ($result == 0) {
    $this->oks[] = 'No error, but no rows were updated.';
} else {
    $this->oks[] = 'Updated the rows.';
}

ちょっとしたハッキン​​グ-他の人がそれを使用している場合は、明らかにコードをもっと冗長にする必要があります。

重要なのは、_error_messageを使用して、更新された0行と実際の問題を区別することを検討することです。

10
Berto

Codeigniterで$this->db->affected_rows()を使用すると、「書き込み」タイプのクエリ(挿入、更新など)を行うときに数値を返します。

MySQLでDELETE FROM TABLEは、影響を受ける0行を返します。データベースクラスには、影響を受ける行の正しい数を返すことができる小さなハックがあります。デフォルトでは、このハックは有効になっていますが、データベースドライバーファイルで無効にすることができます。 (CIユーザーガイドから)。 Ciで削除された行の場合、1を返します。

4
Devendra Verma

このコードを使用して、更新クエリを確認しました。

$status = $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId"); 
if($status)
   return true;
else
    return false;
3
user1133648

$this->db->affected_rows();を使用して、クエリが正常に実行されるかどうかを確認できます

3
Code Prank

ストアドプロシージャを使用すると、結果を確認できます。

以下はストアドプロシージャの例です。

CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_UpdateInfo`(tableId int,tableName varchar(100) charset utf8,description varchar(400) charset utf8)

BEGIN

    declare exit handler for sqlexception select 0 as `result`;

    update table
    set `name` = tableName,
        description = description
    where id = tableId;
    select 1 as `result` ;
END

PHPのサンプルコード:

$this->load->database();

$rs = $this->db->query('call usp_UpdateInfo(?,?,?)',array($tableId,$tableName,$description));
$this->db->close();     
return $rs->result_array();

これを試して:

public function updateFirstName($userId, $newFirstName) {
    $this->db->where('id', $userId);
    $this->db->set('firstName', $newFirstName);
    $sql = $this->db->update('users');

    if ($sql) { return TRUE; }  // $sql - boolean true or false
}
0
Null Undefined
public function updateInfo($newinfo) {
    $this->db->update("some_table", $newinfo);
    return ($this->db->affected_rows() > 0);
}

これはtrueまたはfalseを返します

0
Rafik Bari