如何在CodeIgniter中测试我的MySQL更新查询是否成功?

时间:2012-03-28 18:46:41

标签: php mysql codeigniter

我有一个模型函数,可以在我的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。

10 个答案:

答案 0 :(得分:36)

As commented,你试过$this->db->affected_rows()吗?

这将告诉您已更新了多少行。

答案 1 :(得分:11)

检查以获取更多信息。 Active Records

public function updateFirstName($userId, $newFirstName) {

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

通过这种方式,您还可以避免使用之前的SQL注入

答案 2 :(得分:11)

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; 

修改

也(好多了)

return ($this->db->affected_rows() > 0);

答案 3 :(得分:10)

我发现一个更好的解决方案是管理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个更新的行和真正的问题。

答案 4 :(得分:4)

您可以在Codeigniter中使用$this->db->affected_rows(),这会在执行“写入”类型查询(插入,更新等)时返回数值。

在MySQL DELETE FROM TABLE中返回0个受影响的行。数据库类有一个小的hack,允许它返回正确数量的受影响的行。默认情况下,此hack已启用,但可以在数据库驱动程序文件中将其关闭。 (来自CI用户指南)。对于Ci中已删除的行,它返回1.

答案 5 :(得分:3)

您可以使用$this->db->affected_rows();检查查询是否成功运行

答案 6 :(得分:3)

我已使用此代码检查更新查询。

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

答案 7 :(得分:2)

使用存储过程,您可以检查结果。

以下是存储过程示例:

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();

答案 8 :(得分:0)

public function updateInfo($newinfo) {
    $this->db->update("some_table", $newinfo);
    return ($this->db->affected_rows() > 0);
}

这将返回true或false

答案 9 :(得分:0)

试试这个:

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
}