问题是它显示数据库中的所有行,而不是仅显示包含搜索关键字的那些行。
public function search($data)
{
$name = $data["name"];
$surname = $data["surname"];
$this->db->select('*');
$this->db->from('workers');
$this->db->like('name', '%' . $name . '%');
$this->db->or_like('surname', '%' . $surname . '%');
$query = $this->db->get();
你以错误的方式编写了类似于查询的 CI。查看文档如何正确编写它
您的查询应该是这样的。无需添加
%
。如果您不传递类似函数的第三个参数,则 CI 添加它们。
$this->db->select('*');
$this->db->from('workers');
$this->db->like('name', $name);
$this->db->or_like('surname', $surname);
$query = $this->db->get();
最好使用一些像这样的有效数据。
$this->db->select('*');
$this->db->from('workers');
if($name)
{
$this->db->or_like('name', $name);
}
if($surname)
{
$this->db->or_like('surname', $surname);
}
$query = $this->db->get();
Shaiful 是正确的,您的 like 语句写得不正确,但我想扩展这一点,您必须小心 Active Record 中的
or_
子句。在 Codeigniter 中,这些不使用括号,因此以下内容很好:
$this->db->select('*');
$this->db->like('name', $name);
$this->db->or_like('surname', $surname);
$query = $this->db->get('workers');
它产生:
SELECT * FROM `workers` WHERE `name` LIKE `%$name%` OR `surname` LIKE `%$surname%`;
但是,如果您稍后扩展查询,则以下内容将无法正常工作:
$this->db->select('*');
$this->db->where('id', $id);
$this->db->like('name', $name);
$this->db->or_like('surname', $surname);
$query = $this->db->get('workers');
这会产生:
SELECT * FROM `workers` WHERE `id`=`$id` AND `name` LIKE `%$name%` OR `surname` LIKE `%$surname%`;
第二个示例的问题在于,由于 SQL 中后面的
WHERE
,因此 OR
子句变为可选。
Codeigniter 3 引入了使用括号的功能,如果以后您的查询有可能变得更加复杂,我建议您使用以下方法。
因此,我认为使用
or_
子句时更安全的方法是:
$query = $this->db->select('*')->from('workers')
->group_start()
->like('name', $name)
->or_like('surname', $surname)
->group_end()
->get();
在您当前的示例中,Shaiful 提供的内容没有任何问题,并且它完全兼容 Codeigniter 2。