0

我四处查看了受影响的行返回的确切内容。如果删除了某些内容,它应该返回 > 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。但是当我检查我的数据库以查看产品是否被删除时,它被删除了。有人可以指出我做错了什么吗?

4

6 回答 6

2

受影响的行()仅适用于“写入”查询。

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

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

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

于 2013-03-11T19:16:50.193 回答
1

尝试这个:

 if($this->db->delete($tableName))
    return true;
     else
        return false;
于 2013-03-12T05:53:51.203 回答
1
$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))
于 2013-03-11T20:16:28.403 回答
1

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

实际上,删除直接返回一个布尔值,因此函数delete_product可以简化为:

function delete_product($id)
{
  $tables = array('products', 'attributes');
  $this->db->where('p_id', $id);
  $res = $this->db->delete($tables);
  return $res;
}
于 2018-01-24T04:58:01.520 回答
1
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;
  }
}
于 2018-03-05T13:09:16.347 回答
-1

有一些错误

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

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

您需要从受影响的行()中删除()并只写受影响的行......

于 2014-08-26T07:40:15.630 回答