【问题标题】:STR_REPLACE to add prefix to mysql query in phpSTR_REPLACE 在 php 中为 mysql 查询添加前缀
【发布时间】:2021-07-13 04:19:26
【问题描述】:

这是我的查询

$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 表中。我需要为所有表添加前缀。

这里有什么问题?

【问题讨论】:

    标签: php str-replace


    【解决方案1】:

    上面的那个函数只指向和改变一个事件。

    我建议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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-12-05
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2011-08-24
      相关资源
      最近更新 更多