【问题标题】:Error: Unterminated quoted string during PHP exec错误:PHP exec 期间未终止的引用字符串
【发布时间】:2015-08-14 07:29:16
【问题描述】:

我在 PHP 中使用 exec 函数让 mysql 将查询的内容转储到 CSV 文件中。

这是我的代码:

$outfile = '/home/dotslash/file.csv';
$emails_table = 'all_emails';

$host = 'localhost';
$user = 'root';
$pass = 'root';
$dbname = 'test';

$query = "SELECT DISTINCT(emailid), COUNT(emailid), GROUP_CONCAT(DISTINCT offers) FROM '" . $emails_table . "' GROUP BY emailid INTO OUTFILE '" . $outfile . "' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n';";

exec("mysql -h$host -u$user -p$pass $dbname -e '$query'");

我收到了这个错误:sh: 2: Syntax error: Unterminated quoted string

我知道当字符串从 PHP 传递到 bash 时,问题是转义,但我不知道我做错了什么。请帮忙!

【问题讨论】:

  • 这是偶然的吗:'\n';";好像多了一个;
  • @VictorPerez 是什么让你这么认为?第一个分号用于 MySQL。第二个是 PHP 的。
  • 与我的编码方式相比只是视觉上的。除了结束语句之外,我从未使用过这样的分号。你似乎有足够的声誉让我认为你知道你在做什么,所以我开始寻找可能的错字:-)
  • @VictorPerez LOL,我不知道“足够的声誉”是什么意思。我们都可能犯小错误并绊倒。 :)
  • 你的问题肯定出在这部分:ENCLOSED BY '\"'

标签: php mysql bash


【解决方案1】:

您是否已连接到您的数据库?在您的脚本中,它似乎没有...在您的数据库信息之后添加此字符串:

$con = mysql_connect($host, $user, $pass);
mysql_select_db($dbname);

并在脚本末尾添加:

mysql_close($con);

所以你的代码看起来像:

  $outfile = '/home/dotslash/file.csv';
$emails_table = 'all_emails';

$host = 'localhost';
$user = 'root';
$pass = 'root';
$dbname = 'test';

$con = mysql_connect($host, $user, $pass);
    mysql_select_db($dbname);

$query = "SELECT DISTINCT(emailid), COUNT(emailid), GROUP_CONCAT(DISTINCT offers) FROM '" . $emails_table . "' GROUP BY emailid INTO OUTFILE '" . $outfile . "' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n';";

exec("mysql -h$host -u$user -p$pass $dbname -e '$query'");

mysql_close($con);

你的SQL可能有问题

   ... ENCLOSED BY '\"' ...

尝试将其替换为:

$enc = '"';

... ENCLOSED BY '".$enc."' ...

所以你的最终代码是:

$outfile = '/home/dotslash/file.csv';
    $emails_table = 'all_emails';

    $host = 'localhost';
    $user = 'root';
    $pass = 'root';
    $dbname = 'test';

    $con = mysql_connect($host, $user, $pass);
        mysql_select_db($dbname);

$enc = '"';

    $query = "SELECT DISTINCT(emailid), COUNT(emailid), GROUP_CONCAT(DISTINCT offers) FROM '" . $emails_table . "' GROUP BY emailid INTO OUTFILE '" . $outfile . "' FIELDS TERMINATED BY ',' ENCLOSED BY '".$enc."' LINES TERMINATED BY '\n';";

    exec("mysql -h$host -u$user -p$pass $dbname -e '$query'");

mysql_close($con);

如果这不能解决您的问题,请尝试使用串联来传递 $query var,如下所示:

exec("mysql -h$host -u$user -p$pass $dbname -e ".$query."");

也尝试像这样 var_dump 你的 $query:

var_dump($query);

因为您可能需要在将结果传递给 exec 命令之前获取结果。

专业提示:检查您的 SQL 命令是否正确,直接从 phpmyadmin 上的数据库传递命令并检查它是否引发错误。

【讨论】:

  • 哇,感谢您的广泛回答!我能够通过将$query 括在双引号中 将 ENCLOSED BY 中的双引号转义为 \\\" 来使其工作。
  • 完美!如果您有其他问题,请告诉我;)
【解决方案2】:

做一个$query的var_dump,然后把你返回的字符串通过var_dump放到phpmyadmin或其他sqlmanager的sql控制台中,看看结果。

对不起我的英语是法语

【讨论】:

  • 好建议,但我认为它没有帮助。其中一个问题是查询作为'$query' 传递给exec。您无法使用 var_dump 复制它并将其粘贴到 MySQL 控制台。
猜你喜欢
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多