【问题标题】:How to prevent wildcard to be interpreted in exec()?如何防止通配符在 exec() 中被解释?
【发布时间】:2014-01-08 09:04:11
【问题描述】:

我想将我的 SQL 语句打印到调试文件中:

$dbh = new PDO( "mysql:host=$db_host;dbname=$db_name" , $db_user, $db_password );
$sql = "SELECT * from $db_table";

// do somethings ... 

// Print SQL statement to file for debugging
exec( " echo DEBUG: $sql > /tmp/sql.debug " );

$statement = $dbh->prepare($sql);
$statement->execute();
$result = $statement->fetchAll();

但是通配符会被解释为工作目录中的文件列表,所以我得到了喜欢这个的结果

$ cat /tmp/sql.debug   
SELECT **1.php 2.php 3.php** from syslog WHERE program = xxx AND ip = 192.168.1.1

如何防止通配符在 exec() 中被解释,以获得正确的调试消息?

【问题讨论】:

  • shell 接受反斜杠作为转义字符。您必须在 PHP 中再次转义反斜杠,因此请尝试:select \\* from $db_table
  • 再次转义反斜杠会得到正确的调试信息,但 PDO 查询会失败。

标签: php sql shell wildcard


【解决方案1】:

您无需使用exec 来调用echo 命令。

PHP原生函数error_log可以满足你的要求。

error_log($sql, 3, '/tmp/sql.debug');

您的代码的修复方法是引用您的 sql 字符串以进行回显。

exec( " echo 'DEBUG: $sql' > /tmp/sql.debug " );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多