【问题标题】:pregmatch break a where clause [duplicate]preg_match 打破 where 子句 [重复]
【发布时间】:2013-07-06 17:25:30
【问题描述】:

上面的问题^^^^^没有正确答案

由于该问题中接受的答案导致 MYSQL 页面将查询分开,我仍然需要 PHP 中的解决方案,并且此问题中提供的答案中的链接实际上是我需要的。

我正在尝试用 SQL 中的 where 子句创建一个有用的数组

让我们假设这些:

where a=b and b=c or d=g and (a=f or x=6)

where a=b and b='d and f' or d=g and (a=f or x=6)

where a=b and b="d and f (or just text)" or d=g and (a=f or x=6)

where "a"=b andb="Note that colum names might be quoted differently in different databases" or d=g and (a=f or x=6)

where "a"='b' andb="as well as values" or d=g and (a=f or x=6)

where "a"='b' andb="multiple levels" or d=g and (a=f or x=6 or (x=5 and v=7))

我想尝试将任何 where 子句(使用 key=value ... 也就是没有子查询)分解成有用的数组? 类似:

x= array(
array('a' => 'b' , 'b' => 'c'),
array('d' => 'g' , array(array('a' => 'f'),array('x' => '6')),
);

AND 在一个数组中或在新数组中

或任何其他格式,只是为了能够将整个查询重建为我想要的任何内容。

这里的 preg_match 足够了吗?

【问题讨论】:

  • 这在家庭作业之外有什么用?
  • @Ronan Dejhero 每个人的问题在哪里?
  • SQL 解析器在这里会更有意义。
  • @Ronan Dejhero 我也在尝试这些,但还没有成功。感谢您发布这些问题。我无法发布问题,因为它已被阻止
  • 我正在发布我的示例研发代码之一

标签: php sql regex


【解决方案1】:

根据@Jack's comment,SQL 解析器在这里是有意义的。例如,使用PHP SQL Parser:

$sql = 'where a=b and b=c or d=g and (a=f or x=6)';

require_once('php-sql-parser.php');
$parser = new PHPSQLParser();
$parsed = $parser->parse($sql);
print_r($parsed);

【讨论】:

  • 请不要重复,我们已经在这个网站上有这个答案,每个评论的链接就足够恕我直言了:stackoverflow.com/a/12109334/367456
  • @hakre:我怀疑这是否真的是一个骗局;这些问题问的是不同的事情——这个问题是关于解析特定的子条款,而另一个是关于解析整个命令的问题。虽然两者都可以使用相同的工具来完成,但从链接的答案中并不能立即看出这一点。
  • 这就是我需要的!谢谢兄弟
【解决方案2】:

以下函数用于我的 codeigniter 框架 - 用于更新表格

function updateCT($options = array(),$where=array())
{
    // required values
    if(!$this->_required(
        array('id'),
        $where)
    ) return false;

    // set values for updating
    foreach($options as $key=>$val)
    {
        $this->db->set($key,$val);
    }

    // set where clause for updating
    foreach($where as $key=>$val)
    {
        $this->db->where($key,$val);
    }

    $this->db->update(TBL_COMPANY_TYPE);
    return $this->db->affected_rows();
}

对于定义条件和子句,数组格式如下:-

$options=array(
                 'key1'=>array('val1' , 'and'), 
                 'key2'=>array('val2' , 'or'),
             );

现在处理数组如下:-

foreach($options as $key=>$val)
{
    foreach($val as $value=>$condition)
    {
        // now write sql format as your framework
    }
}

【讨论】:

  • 这如何帮助将现有 SQL 字符串中的 WHERE 子句解析为诸如 OP 之后的数据结构(这是问题所要问的,我的阅读)?跨度>
  • @eggyal 我认为 OP 正在尝试解析一个数组并处理该数组以形成“where”子句。 OP 希望避免手动创建 where 子句。我上面的代码将作为通用函数工作......但到目前为止,上述函数处于研发阶段。我需要对这个功能做很多更新......
  • @ripa:如果我没有读错问题,情况恰恰相反。如果您进行研发,也会寻找现有的解决方案。他们可能会向您展示如何做事的更好方法(并且可能已经可用)。非常适合学习完成工作。
  • @hakre 如果相反的是 OP 的问题,那么我将发布一个回溯过程。我正在编辑我的答案...
  • 反对票!!!!!!没关系。但请给出理由...
猜你喜欢
  • 2012-06-11
  • 2013-08-11
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多