1

This is my query

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

This is the function to add prefix to tables (This function is taken from 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);   
}

When I echo rawAddPrefix($q,"demo_") I get only prefix added to tbl_accounts table only. I need to add prefix to all tables.

What's wrong here ?

1 Answer 1

1

That function above does only point and make changes to one occurrence.

I'd suggest a preg_replace_callback and 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);
}

If for some reason the table names are user input you'll need to have a whitelist to make your query safe as well.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.