dpc57092 2014-04-25 18:43
浏览 43
已采纳

如何使用PHP PDO枚举/计算查询中的所有参数?

I have the following query:

$query = "SELECT * FROM a_table WHERE col1=:param1 AND col2=:param2 OR col3=:param3"

Does PHP PDO (or any other thing/library) have some function that lists all parameters names presents on this query, that writing something like this:

print_r(list_query_parameters($query));

Produces a output like this:

Array ( [0] => :param1 [1] => :param2 [2] => :param3 )
  • 写回答

1条回答 默认 最新

  • doudan5136 2014-04-25 18:46
    关注

    EDIT:Final solution to the answer (see below for other alternatives)

    Function

    function list_query_parameters($query) {
        preg_match_all('/=(:\w+)/', $query, $params, PREG_PATTERN_ORDER);
        return $params[1]
    }
    

    Usage:

    $query = "SELECT * FROM a_table WHERE col1=:param1 AND col2=:param2 OR col3=:param3"
    print_r(list_query_parameters($query));
    

    Program Output

    Array
    (
        [0] => :param1
        [1] => :param2
        [2] => :param3
    )
    

    DEMO


    You can also make use of debugDumpParams() for that

    $stmt->debugDumpParams();
    

    Description

    public void PDOStatement::debugDumpParams ( void ) Dumps the informations contained by a prepared statement directly on the output. It will provide the SQL query in use, the number of parameters used (Params), the list of parameters, with their name, type (paramtype) as an integer, their key name or position, and the position in the query (if this is supported by the PDO driver, otherwise, it will be -1).


    Things to note:

    You can only get the dumps after you run execute() so your code would look like this:

    $stmt = $pdo->prepare($query)
    $stmt->execute($params);
    $stmt->debugDumpParams();
    

    debugDumpParams() is not doing what you really wanted.

    I just wrote this function that should do what you wanted.

    please note it is quick and dirty:

    function

    function list_query_parameters($query) {
    $params = explode(":", $query);
    unset($params[0]);
    foreach ($params as $param) {
        $param = split(" ", $param);
        $result[] = $param[0];
    }
    
    return $result;
    }
    

    Usage:

    $query = "SELECT * FROM a_table WHERE col1=:param1 AND col2=:param2 OR col3=:param3"
    print_r(list_query_parameters($query));
    

    Output

    Array ( [0] => param1 [1] => param2 [2] => param3 ) 
    

    DEMO


    Using Regex:

    Here is the ReGex

    preg_match_all('/\s*\w+\s*[=<>]\s*\:(\w+)/', $subject, $matches); 
    print_r($matches[1]);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名