如何测试我的 MySQL 更新查询在 CodeIgniter 中是不是成功? [复制]

Posted

技术标签:

【中文标题】如何测试我的 MySQL 更新查询在 CodeIgniter 中是不是成功? [复制]【英文标题】: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 注入 【参考方案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

【讨论】:

以上是关于如何测试我的 MySQL 更新查询在 CodeIgniter 中是不是成功? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用PHP将数据表记录插入MYSQL数据库[重复]

如何在 MySQL 中运行更新查询并替换匹配的字符串

mysql 我如何查询一批数据后,并更新这批数据

你如何正确地用 NULL 更新 mysql 字段?

MySQL 和 PHP 的 CRUD [关闭]

如何执行选择查询,而不锁定更新查询