【问题标题】:Affected_rows always returning false on deleteAffected_rows 在删除时总是返回 false
【发布时间】:2013-03-11 19:14:29
【问题描述】:

我查看了受影响的行返回的确切内容。如果删除了某些内容,它应该返回 > 0,如果没有,则返回 0,对吗?

但是当我删除一个产品时,它会被删除,因为它通过产品 ID 存在。但是,当我想通过尝试在我的模型中执行此操作来测试相关产品是否已被删除时:

function delete_product($id)
{
    $tables = array('products', 'attributes');
    $this->db->where('p_id', $id);
    $this->db->delete($tables);


    if ($this->db->affected_rows() > 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

并将值返回给我的控制器:

public function delete()
{
    $id = $this->uri->segment(3);

    $this->a_model->delete_product($id);

    if($res == FALSE)
    {
        $this->session->set_flashdata('success_delete', 'Product deleted successfully.');
        redirect('admin/index');
    }
    else
    {
        $this->session->set_flashdata('error_delete', 'Product not deleted. We gots an issue.');
        redirect('admin/index');
    }
}

返回的值总是假的,即 0。但是当我检查我的数据库以查看产品是否被删除时,它被删除了。有人可以指出我做错了什么吗?

【问题讨论】:

  • 事务会是更好的删除方式吗?
  • 我用交易进行了测试……一切都很好。

标签: php codeigniter rows-affected


【解决方案1】:

affected_rows() 仅适用于“写入”查询。

在执行“写入”类型查询(插入、更新等)时显示受影响的行数。

注意:在 MySQL 中,“DELETE FROM TABLE”返回 0 个受影响的行。数据库类有一个小技巧,允许它返回正确数量的受影响行。默认情况下,此 hack 已启用,但可以在数据库驱动程序文件中关闭。

您可能需要确保启用了 hack。 http://ellislab.com/codeigniter/user-guide/database/helpers.html

【讨论】:

  • 这是否意味着始终为 0,即使在真实条件下也是如此?
  • 真实条件是什么意思?什么是真的?
  • 您使用的是哪个 CI 版本?此 hack 可能不适用于较旧的 CI 版本。
  • @TrentonTrama - 链接已损坏
【解决方案2】:
$this->a_model->delete_product($id);

if($res == FALSE)

应该是:

$res = $this->a_model->delete_product($id);

if ($res === FALSE)

您没有为$res 赋值,也没有为$this->a_model->delete_product($id) 的值赋值。您还希望在处理布尔值时使用=== 进行严格比较,以确保安全作为最佳实践。

你也可以这样做:

if (!$this->a_model->delete_product($id))

【讨论】:

  • 这也可以,但我决定使用事务,因为我相信如果由于某种原因查询最终为假,它不会提交删除
【解决方案3】:

试试这个:

 if($this->db->delete($tableName))
    return true;
     else
        return false;

【讨论】:

    【解决方案4】:

    帖子很旧,但我遇到了同样的问题。由于该帖子尚未“解决”并且仍然相关,因此我添加了我的解决方案。

    实际上,delete 直接返回一个布尔值,所以函数delete_product 可以简化为:

    function delete_product($id)
    {
      $tables = array('products', 'attributes');
      $this->db->where('p_id', $id);
      $res = $this->db->delete($tables);
      return $res;
    }
    

    【讨论】:

    • 请注意,返回的布尔值仅表示“查询运行成功”,TRUE 值并不一定意味着存在实际受影响的行(如果没有与 where 匹配的记录健康)状况)。您仍应检查 affected_rows() 以确定是否确实删除了任何行。
    【解决方案5】:
    function delete_product($id){
      $this->db->trans_start();
        $tables = array('products', 'attributes');
        $this->db->where('p_id', $id);
        $this->db->delete($tables);
      $this->db->trans_complete();
    
      if($this->db->trans_status() === FALSE){
        return false;
      }else{
        return true;
      }
    }
    

    【讨论】:

      【解决方案6】:

      有一些错误

      你写了:if ($this->db->affected_rows() > 0)

      但应该是:if ($this->db->affected_rows > 0)

      你需要从affected_rows()中移除()并且只写affected_rows...

      【讨论】:

        猜你喜欢
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2021-11-05
        • 2018-11-05
        • 2019-05-06
        相关资源
        最近更新 更多