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を返す必要があります。
コメントどおり 、$this->db->affected_rows()
を試しましたか?
これにより、更新された行数がわかります。
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);
詳しくはこちらをご覧ください。 アクティブレコード
public function updateFirstName($userId, $newFirstName) {
return $this->db
->where('id', $userId)
->update("users", array('firstName' => $newFirstName));
}
この方法を使用すると、以前のSQLインジェクションも回避できます。
私が見つけたより良い解決策は、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行と実際の問題を区別することを検討することです。
Codeigniterで$this->db->affected_rows()
を使用すると、「書き込み」タイプのクエリ(挿入、更新など)を行うときに数値を返します。
MySQLでDELETE FROM TABLE
は、影響を受ける0行を返します。データベースクラスには、影響を受ける行の正しい数を返すことができる小さなハックがあります。デフォルトでは、このハックは有効になっていますが、データベースドライバーファイルで無効にすることができます。 (CIユーザーガイドから)。 Ciで削除された行の場合、1を返します。
このコードを使用して、更新クエリを確認しました。
$status = $this->db->query("UPDATE users SET firstName='$newFirstName' WHERE id=$userId");
if($status)
return true;
else
return false;
$this->db->affected_rows();
を使用して、クエリが正常に実行されるかどうかを確認できます
ストアドプロシージャを使用すると、結果を確認できます。
以下はストアドプロシージャの例です。
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
}
public function updateInfo($newinfo) {
$this->db->update("some_table", $newinfo);
return ($this->db->affected_rows() > 0);
}
これはtrueまたはfalseを返します