STR_RELACE为php中的mysql查询添加前缀



这是我的查询

$q = "
SELECT *  FROM tbl_accounts
UNION 
SELECT * FROM tbl_transactions
UNION 
SELECT * FROM tbl_jobcards
UNION 
SELECT * FROM tbl_accounts
";

这是为表添加前缀的函数(此函数取自MySqliDB类(

function rawAddPrefix($query,$prefix){
$query = str_replace(PHP_EOL, null, $query);
$query = preg_replace('/s+/', ' ', $query);
preg_match_all("/(from|into|update|join) [\'\´]?([a-zA-Z0-9_-]+)[\'\´]?/i", $query, $matches);
list($from_table, $from, $table) = $matches;
return str_replace($table[0], $prefix.$table[0], $query);   
}

当我回显rawAddPrefix($q,"demo_")时,我只得到添加到tbl_accounts表中的前缀。我需要为所有表添加前缀。

这里怎么了?

上面的函数只指向一个事件并对其进行更改。

我建议使用preg_replace_callbackstr_replace:

function rawAddPrefix($query, $prefix){
$query = str_replace(PHP_EOL, null, $query);
$query = preg_replace('/s+/', ' ', $query);
return preg_replace_callback('/(from|into|update|join) ['´]?([a-zA-Z0-9_-]+)['´]?/i', function($match) use ($prefix) {
return str_replace($match[2], $prefix . $match[2] . PHP_EOL, $match[0]);      
}, $query);
}

如果出于某种原因,表名是用户输入,则需要有一个白名单,以确保查询的安全性。

最新更新