【问题标题】:Codeigniter query builder class resultsCodeigniter 查询生成器类结果
【发布时间】:2019-07-25 20:25:17
【问题描述】:

在codeigniter查询构建器类中假设每个成功的查询是否安全,如果失败,它会自动返回true和false?

如果是这样,它是否适用于 CRUD?还是仅在插入和删除数据时才成立?对于更新,我必须检查受影响的行吗?或者如果更新成功,它也会返回一个真实的结果?

例如:

控制器:

$data = array('username' => $this->input->post('username'),
    'password' => password_hash($this->input->post('password'), PASSWORD_BCRYPT),
    'date_created' => mdate('%Y-%m-%d', time())
);

$result = $this->account_model->create($data);

if($result == TRUE){
    $this->session->set_flashdata('message', 'Registration Successful');
    redirect('pages/login');
}else{
    $this->session->set_flashdata('message', 'Registration Failed');
    redirect('pages/register');
}

型号:

public function create($new_user){
    $insert = array('username' => $new_user['username'],
        'password' => $new_user['password'], 
        'date_created' => $new_user['date_created']
    );

    $result = $this->db->insert('user', $insert);

    return $result;

}

另外,如果我返回查询语句本身是不是很糟糕?喜欢,

return $this->db->insert('user', $insert);

【问题讨论】:

  • Codeigniter 文档非常简单 - 看看例如codeigniter.com/user_guide/database/… - 插入语句总是返回 truefalse update - 这可能取决于您如何评估这些规范。
  • 我试图输出一个查询的结果,它返回了一个对象数组。也许是因为在 php if($var) 中,如果 var 不为空,则为真。它也没有在用户指南中明确说明成功的查询返回 true ,否则返回 false 。我试着用 ctrl+f 寻找它,但我找不到它。

标签: php codeigniter query-builder


【解决方案1】:

没有。并不真地。 但是,您可以控制模型返回的内容。请记住,例如,空结果集不一定是“失败”查询。在很多用例中,空结果集可能是件好事。

实际运行查询后,您将得到一个带有结果的对象

例如,选择时,你可以$result = $this->db->get(),你的$result变量会变成一个对象,里面有很多你可以访问的信息:

返回的行数:$result->num_rows(); 返回内容:$result->result(); 具体行:$result->row(0); 特定行中的特定字段:$result->row(3)->field_name;

插入或更新时,$this->db->affected_rows() 变为可用,因此您可以检查更新或插入了多少行。如果您需要插入的行的表的主键值,插入也会使 $this->db->insert_id() 可用。

因此,您可以控制逻辑。

选择时,我通常会这样做:

$query = $this->db->get();
if ($query->num_rows() == 0)
{
  return false;
}

else
{
  return $query->row(0);
}

然后我在控制器中检查模型是否返回 false 或真实结果集(如果我只是检查是否存在某些东西,有时我只返回 true 而不是实际结果集)。您可以根据自己的需要定制结果。

插入时,我通常会检查:

if ($this->db->affected_rows() != 0)
{
  return $this->db->insert_id();
}

else
{
  return false;
}

(在控制器中,返回的false 将被视为“插入失败”)。

为了更全面地回答您的问题:不,默认情况下不会发生任何事情,但 Codeigniter 为您提供了根据您的特定需求和品味定制网站行为所需的一切

【讨论】:

  • 对于受影响的行,它仅指查询中的“受影响的行”,而不是数据库/表本身?
  • 正是...它是受更新或插入查询影响的行数(如果您直接在数据库上进行更新/插入,您会看到相同的输出...例如2 row(s) affected Rows matched: 2 Changed: 2 Warnings: 0
  • 一个简单的问题:可以在一个函数中多次使用 $result 变量吗?例如,$result = $this->db->insert('user',$new_user); if($this->db->affected_rows() != 0){ $result = $this->db->insert('profile', $new_profile); if($this->db->affected_rows() != 0){ return true;}}
  • 没关系,我什至不需要将 db insert 分配给变量,因为我只需要知道它是否是一个成功的查询。
  • @Awing 这是可能的,因为随着脚本继续执行,变量将被新的赋值覆盖。如果您以后需要使用该数据,那么我建议您将变量进一步更改为其他内容:)
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多