preg_match打破where子句

时间:2013-07-09 07:36:09

标签: php sql regex

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

因为该问题中接受的答案导致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 and B ="Note that colum names might be quoted differently in different databases" or d=g and (a=f or x=6)

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

where "a"='b' and B ="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吗?

2 个答案:

答案 0 :(得分:1)

Per @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);

答案 1 :(得分:0)

我用于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
    }
}