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

Joh*_*man 22 php mysql codeigniter

我有一个模型函数,用于更新我的Code Igniter应用程序中的用户:

// 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?
}
Run Code Online (Sandbox Code Playgroud)

如何返回一个布尔值,以确保ID的用户$userId已更新?例如,如果未找到具有ID的用户,则应返回false $userId.

小智 36

如评论,你试过$this->db->affected_rows()吗?

这将告诉您更新了多少行.

  • 但是,如果用户提交数据而没有任何更改,该怎么办?在这种情况下,将找到数据,但仍然受影响的行将为0. (7认同)
  • 您可以通过'last_update'时间戳扩展数据库列,因此至少会有一个更新的列,并且`$ this-> db-> affected_rows()`的结果是> 0. (7认同)

saf*_*rov 11

请查看此以获取更多信息.活跃的记录

public function updateFirstName($userId, $newFirstName) {

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

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


And*_*lin 11

if ($this->db->affected_rows() > 0)
{
  return TRUE;
}
else
{
  return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

要么

if ($this->db->affected_rows() > 0)
  return TRUE;
else
  return FALSE;
Run Code Online (Sandbox Code Playgroud)

要么

return ($this->db->affected_rows() > 0) ? TRUE : FALSE; 
Run Code Online (Sandbox Code Playgroud)

编辑

也(好多了)

return ($this->db->affected_rows() > 0);
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章完美地代表了初级php开发人员的演变:D (5认同)
  • 或者简单地返回(bool)($ this-> db-> affected_rows()> 0); (4认同)

Ber*_*rto 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();
}
Run Code Online (Sandbox Code Playgroud)

现在你的功能可以区分......

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.';
}
Run Code Online (Sandbox Code Playgroud)

只是一些快速黑客 - 如果你有其他人使用它,你显然应该使代码更加冗长.

关键是,考虑使用_error_message来区分0个更新的行和一个真正的问题.


Dev*_*rma 5

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

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