【问题标题】:How do I test if my MySQL update query was successful in CodeIgniter? [duplicate]如何测试我的 MySQL 更新查询在 CodeIgniter 中是否成功? [复制]
【发布时间】:2012-04-12 09:59:27
【问题描述】:

我有一个模型函数可以在我的 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()吗?这将告诉您更新了多少行。
  • 不错的 SQL 注入漏洞。比起查询成功/失败,我更担心你的数据库是 pwn3d。
  • $userId = "1 OR 1=1";应该这样做。
  • @ChrisK 如果您可以更改您的用户 ID,您可能不需要使用 SQL 注入

标签: php mysql codeigniter


【解决方案1】:

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

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

【讨论】:

  • 但是,如果用户提交数据而不做任何更改怎么办。在这种情况下,将找到数据,但受影响的行仍然为 0。
  • 没有办法检查,即使没有更新行,也不代表查询失败
  • 您可以通过'last_update'时间戳扩展数据库列,因此至少会有一个更新的列并且$this->db->affected_rows()的结果> 0。
【解决方案2】:
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);

【讨论】:

  • 或者直接返回 (bool)($this->db->affected_rows() > 0);
  • 这篇文章完美地代表了初级php开发者的进化:D
  • 或者这个 !!$this->db->affected_rows()
  • 影响行=0,不代表有错误。
【解决方案3】:

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

【讨论】:

  • 我不确定,但if ($result == 0) { $this->oks[] = 'No error, but no rows were updated.'; } 似乎对我无效。($result == 1) 用于成功查询,即使更新了 0 行也不会出错。 ($result == 0) 用于错误查询-mysql_affected_rows() 有效!!
【解决方案4】:

查看此处了解更多信息。 Active Records

public function updateFirstName($userId, $newFirstName) {

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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

        • return (bool) $status; 将在此处为您节省三行代码。
        【解决方案8】:
        public function updateInfo($newinfo) {
            $this->db->update("some_table", $newinfo);
            return ($this->db->affected_rows() > 0);
        }
        

        这将返回真或假

        【讨论】:

          【解决方案9】:

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

          下面是一个存储过程示例:

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

          【讨论】:

            【解决方案10】:

            试试这个:

            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
            }
            

            【讨论】:

              猜你喜欢
              • 2013-03-12
              • 1970-01-01
              • 1970-01-01
              • 2010-10-12
              • 2019-02-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多