如何测试我的 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 中是不是成功? [复制]的主要内容,如果未能解决你的问题,请参考以下文章