• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • PDOStatement::debugDumpParams()

    (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.9.0)

    打印一条 SQL 预处理命令

    说明

    PDOStatement::debugDumpParams(void): bool

    直接打印出一条预处理语句包含的信息。提供正在使用的SQL查询、所用参数(Params)的数目、参数的清单、参数名、用一个整数表示的参数类型(paramtype)、键名或位置、值、以及在查询中的位置(如果当前 POD 驱动不支持,则为-1)。

    此为一个用于调试的功能,在正常输出的情况下直接输出数据。

    Tip

    和直接将结果输出到浏览器一样,可使用输出控制函数来捕获当前函数的输出,然后(例如)保存到一个string中。

    只打印此时此刻语句中的参数。额外的参数不存储在语句中,也就不会被输出。

    返回值

    没有返回值。

    范例

    PDOStatement::debugDumpParams()使用命名参数的例子

    <?php
    /* 通过绑定 PHP 变量执行一条预处理语句 */
    $calories = 150;
    $colour = 'red';
    $sth = $dbh->prepare('SELECT name, colour, calories
        FROM fruit
        WHERE calories < :calories AND colour = :colour');
    $sth->bindParam(':calories', $calories, PDO::PARAM_INT);
    $sth->bindValue(':colour', $colour, PDO::PARAM_STR, 12);
    $sth->execute();
    $sth->debugDumpParams();
    ?>
    

    以上例程会输出:

    SQL: [96] SELECT name, colour, calories
        FROM fruit
        WHERE calories < :calories AND colour = :colour
    Params:  2
    Key: Name: [9] :calories
    paramno=-1
    name=[9] ":calories"
    is_param=1
    param_type=1
    Key: Name: [7] :colour
    paramno=-1
    name=[7] ":colour"
    is_param=1
    param_type=2
    

    PDOStatement::debugDumpParams()使用未命名参数的例子

    <?php
    /* 通过绑定 PHP 变量执行一条预处理语句 */
    $calories = 150;
    $colour = 'red';
    $name = 'apple';
    $sth = $dbh->prepare('SELECT name, colour, calories
        FROM fruit
        WHERE calories < ? AND colour = ?');
    $sth->bindParam(1, $calories, PDO::PARAM_INT);
    $sth->bindValue(2, $colour, PDO::PARAM_STR);
    $sth->execute();
    $sth->debugDumpParams();
    ?>
    

    以上例程会输出:

    SQL: [82] SELECT name, colour, calories
        FROM fruit
        WHERE calories < ? AND colour = ?
    Params:  2
    Key: Position #0:
    paramno=0
    name=[0] ""
    is_param=1
    param_type=1
    Key: Position #1:
    paramno=1
    name=[0] ""
    is_param=1
    param_type=2
    

    参见

    • PDO::prepare() 准备要执行的语句,并返回语句对象
    • PDOStatement::bindParam() 绑定一个参数到指定的变量名
    • PDOStatement::bindValue() 把一个值绑定到一个参数
    This function doesn't print parameter values despite the documentation says it does. See https://bugs.php.net/bug.php?id=52384 (filed back in 2010).
    As noted, this doesn’t actually simply print the prepared statement with data to be executed.
    For trouble shooting purposes, I find the following useful:
    <?php
      function parms($string,$data) {
        $indexed=$data==array_values($data);
        foreach($data as $k=>$v) {
          if(is_string($v)) $v="'$v'";
          if($indexed) $string=preg_replace('/\?/',$v,$string,1);
          else $string=str_replace(":$k",$v,$string);
        }
        return $string;
      }
      //  Index Parameters
        $string='INSERT INTO stuff(name,value) VALUES (?,?)';
        $data=array('Fred',23);
      //  Named Parameters
        $string='INSERT INTO stuff(name,value) VALUES (:name,:value)';
        $data=array('name'=>'Fred','value'=>23);
      print parms($string,$data);
    ?>
    
    This function doesn't have a return, so if you want to do something with it you'll have to do something like
    <?php
    function pdo_debugStrParams($stmt) {
     ob_start();
     $stmt->debugDumpParams();
     $r = ob_get_contents();
     ob_end_clean();
     return $r;
    }
    // omitted: connect to the database and prepare a statement
    echo '<pre>'.htmlspecialchars(pdo_debugStrParams($stmt)).'</pre>';
    ?
    Source: http://stackoverflow.com/questions/22157331/something-like-debugdumpparams-in-pdo-settable-to-a-string
    It's not you, in PHP 5.2.6 and close versions this has an infinite loop bug. Upgrade to the latest php where it has been fixed.