STR_REPLACE 为 php 中的 mysql 查询添加前缀
STR_REPLACE to add prefix to mysql query in php
这是我的查询
$q = "
SELECT * FROM tbl_accounts
UNION
SELECT * FROM tbl_transactions
UNION
SELECT * FROM tbl_jobcards
UNION
SELECT * FROM tbl_accounts
";
这是给tables添加前缀的函数(这个函数取自MySqliDB class)
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
table 的前缀。我需要为所有 table 添加前缀。
这里有什么问题吗?
上面的函数只会指向并更改一次。
我建议 preg_replace_callback
和 str_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);
}
如果出于某种原因 table 名称是用户输入的,您还需要有一个白名单来确保您的查询安全。
这是我的查询
$q = "
SELECT * FROM tbl_accounts
UNION
SELECT * FROM tbl_transactions
UNION
SELECT * FROM tbl_jobcards
UNION
SELECT * FROM tbl_accounts
";
这是给tables添加前缀的函数(这个函数取自MySqliDB class)
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
table 的前缀。我需要为所有 table 添加前缀。
这里有什么问题吗?
上面的函数只会指向并更改一次。
我建议 preg_replace_callback
和 str_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);
}
如果出于某种原因 table 名称是用户输入的,您还需要有一个白名单来确保您的查询安全。