Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Codeigniter中组合mysql和OR查询_Php_Mysql_Codeigniter_Codeigniter 2 - Fatal编程技术网

Php 在Codeigniter中组合mysql和OR查询

Php 在Codeigniter中组合mysql和OR查询,php,mysql,codeigniter,codeigniter-2,Php,Mysql,Codeigniter,Codeigniter 2,我想在CI中组合AND或mysql查询。我已看到此线程:。 但他们没有提供确切的解决方案 如何严格使用CI框架创建以下查询?(我可以轻松创建没有括号的查询,但它不是同一个查询。) 注意:这只是一个示例查询,即使没有意义&不要建议将整个或部分查询写入单个where() 编辑:基本上,我希望实现以下简单查询: SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3') 查询本身没有意义,

我想在CI中组合AND或mysql查询。我已看到此线程:。 但他们没有提供确切的解决方案

如何严格使用CI框架创建以下查询?(我可以轻松创建没有括号的查询,但它不是同一个查询。)

注意:这只是一个示例查询,即使没有意义&不要建议将整个或部分查询写入单个
where()

编辑:基本上,我希望实现以下简单查询:

SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3') 

查询本身没有意义,您正在选择:

  • 托夫·斯文德森,12岁
  • Ola Svendsen,12岁
  • 任何一个叫斯文森的男性,12岁
  • 来自印度的12岁名叫斯文德森的人
Tove看起来像一个男人的名字,所以选择性别是没有必要的。Ola看起来像个女孩的名字,所以选择性别不仅没有必要,而且毫无意义。您的查询将返回任何名为Svendson的12岁男性,任何名为Svenson的来自印度的12岁男性,以及Tove和Ola Svendson,如果他们是12岁的话

为什么不把它放在()括号中呢?出于某种原因,您想用活动记录来完成它吗?

这样就行了吗

$this->db->where('LastName', 'Svendson');
$this->db->where('Age', 12);
$this->db->where("(FirstName='Tove' OR FirstName='Ola' OR Gender='M' OR Country='India')", NULL, FALSE);
$query = $this->db->get('Persons');
return $query->result();

当前,使用CI2,如果不扩展数据库类并将方法的访问类型从私有更改为公共/受保护,则无法访问数据库类的查询生成器方法($this->db->u compile\u select()),这将破坏构建子查询的能力,就像您尝试使用ActiveRecord类进行构建一样。创建一个类似于您试图构建的子查询的唯一方法是只使用db query方法

$table = $this->db->dbprefix('tablename');

$sql = "SELECT * FROM `{$table}` WHERE field1='?' AND (field2='?' OR field3='?') ";
$this->db->query($sql,array($field1,$field2,$field3));  

在上有一篇关于这样做的博文,但它已经过时了,只适用于CI 1.7,希望这会有所帮助。

在CodeIgniter 3中,有一些新方法正好用于此目的

return $this->db
     ->where('LastName', 'Svendson');
     ->where('Age', 12);
     ->group_start()
         ->where('FirstName','Tove')
         ->or_where('FirstName','Ola')
         ->or_where('Gender','M')
         ->or_where('Country','India')
     ->group_end()
     ->get('Persons')
     ->result();

在Codeigniter中,我们可以像这样使用它,这很容易理解

$sql = "SELECT
            *
        FROM
            `Persons`
        WHERE
            LastName = 'Svendson'
        AND Age = '12'
        AND (
            FirstName = 'Tove'
            OR FirstName = 'Ola'
            OR Gender = 'M'
            OR Country = 'India'
        )";

$query = $this->db->query($sql);

return $query->result();

尝试使用
查询分组

它的链接


您可以简单地使用它

$this->db->where("status","live")->or_where("status","dead");
你也可以使用

$this->db->where("(status='live' OR status='dead')");

使用codeigniter 3.0框架,有新功能可用于单独或何处和何处操作,即分组和分组结束

代码像

$this->db->where('LastName', 'Svendson');
$this->db->where('Age', 12);
$this->db->group_start();
$this->db->or_where('FirstName','Tove');
$this->db->or_where('FirstName','Ola');
$this->db->or_where('Gender','M');
$this->db->or_where('Country','India');
$this->db->group_end();
$query = $this->db->get('Persons');
return $query->result();

对于CodeIgniter 2,我需要这个,但我需要的值仍然转义,所以对我来说不好,我不想重写整个查询,就像这样,所以我最终做了以下操作:

$this->db->where('LastName', $lastName);
$this->db->where('Age', $age, false);
$this->db->where('1 AND ( 0', null, false); // This one starts the group
  $this->db->or_where('FirstName', $firstName1);
  $this->db->or_where('FirstName', $firstName2);
  $this->db->or_where('Gender', $gender);
  $this->db->or_where('Country', $country);
$this->db->or_where('0 )', null, false); // This one ends the group
$query = $this->db->get('Persons');
这将生成以下查询:

SELECT *
FROM (`Persons`)
WHERE `LastName` =  'Svendson'
AND Age = 12
AND 1 AND ( 0 -- This one starts the group
OR `FirstName` =  'Tove'
OR `FirstName` =  'Ola'
OR `Gender` =  'M'
OR `Country` =  'India'
OR 0 ) -- This one ends the group
与此相同:

SELECT * FROM (`Persons`) WHERE
`LastName` = 'Svendson' AND Age = 12 AND 1 AND
(0 OR `FirstName` = 'Tove' OR `FirstName` = 'Ola' OR `Gender` = 'M' OR `Country` = 'India' OR 0)

该查询只是一个测试查询。我随意写下我想到的任何东西。基本上,我需要f1=v1和(f2=v2或f3=v3)类的查询&而且我的问题不是关于选择,所以你不必分析我的查询,对否决票的人来说很容易,只是想把事情弄清楚。不管怎样,你有没有试过从(“人”)那里得到$this->db->$这->数据库->其中(“LastName”,“Svendson”)$这->数据库->其中(“年龄”,“12”)$这->数据库->或_,其中_位于('FirstName',$FirstName)$这->数据库->或_,其中_在('gender','M')$此->db->or_,其中位于('Country','India')[/code]的或部分不在括号内。您正在生成的是不带括号的查询。我在问题中清楚地提到,
(我可以轻松创建没有括号的查询,但它不是同一个查询。)
是的,这将起作用&这就是我目前使用的。但这不是严格意义上的CI方式,我必须手动转义字符串。另外,我怀疑在问题
中提到的这类答案不建议将查询的全部或部分写在一个where()中。
我在最初的回答中问您是否有理由使用活动记录来实现这一点,因为在()中定义查询是“严格的codeigniter”,而不是活动记录。无论如何,这在CI中是不可能的,因为它们不允许您在AR中执行嵌套查询。为此,有一个名为IgnitedQuery的查询字符串生成器:。这对我不起作用。第二个where条件覆盖第一个where条件。CodeIgniter V 2.1.4什么是
…NULL,FALSE)
的?NULL是值参数(非强制性),FALSE是删除查询引号(FALSE,因为这会影响括号)。此版本是何时发布的?>现在就是这样做的+如果我错了,请纠正我。除了最后一个分号外,您的声明中是否需要有分号?很抱歉,新到CI,它没有。改变了帖子,展示了如何充分利用这个解决方案让我开心!!!我花了很长时间才想出这个简单的解决办法。谢谢。对我来说,它似乎比内置函数更容易创建!我也会尝试一下
SELECT * FROM (`Persons`) WHERE
`LastName` = 'Svendson' AND Age = 12 AND 1 AND
(0 OR `FirstName` = 'Tove' OR `FirstName` = 'Ola' OR `Gender` = 'M' OR `Country` = 'India' OR 0)