准备 SQL 语句,在 PHP 中包含成对的单引号和双引号

Preparing a SQL statement that contains paired single and double quotes in PHP

开始了。我有一个 200 行的 MySQL 查询,其中一列包含六个不同的 Excel 公式,如下所示:

SELECT '%%%=""Greg''s #""&INDIRECT(""G""&ROW()&""#"")' AS 'Location'

此代码片段 运行 会在 MySQL 中正确显示,并且由于加倍的标点符号,可以导出到 CSV 文件,而不会在 CSV 文件中造成破坏。但是,现在我必须将此查询放入 PHP 中的准备好的语句中,作为我公司(您猜对了,基于 Excel)报告自动化过程的一部分。我如何针对所有双倍标点符号强化准备好的语句?

我试过在每个引号前用 \ 转义,但这不知何故导致 MySQL 查询 return 只有 Excel 公式,而不是数据库数据必须与它并肩作战。与 heredoc 相同。 PDO::quote() 甚至没有让我走那么远。我半怀疑有一种方法可以使用 fputcsv 来解决这个问题,但我假设我必须在将 fputcsv 带入争论之前准备好声明。 (并不是说我已经以正确的方式完成了这些;我正在尝试 Google 在这一点上所说的任何尝试。)到目前为止,return 中没有查询 PHP他们在 SQL.

做什么

我关心的各种数据都以所有三种格式存在(还有更多...),并且必须在我向下游收集时收集,在本例中是从 PHP 到 MySQL到通过电子邮件发送的 CSV 到 VBA 自动 Excel 报告。我的公司想到了像 Pokémon 这样的数据存储解决方案。必须全部订阅。所以这个问题我不能随便躲。

谢谢各位好心人。我正在尽最大努力控制我们的报告,但到目前为止,这一挑战已被证明是无法 Google 的(可能是因为 Google 不理解“双双引号”或“成对双引号” ").

HEREDOC 可以解决问题。以下代码不会被破坏:

$csv_fields = array("Location","Location ID","Region","Area","Area #","Client","Store #","Signature","AM","AR","AA");

$TechExport = <<<Your_HEREDOC_Tag
    SELECT
        a.location AS 'Location'
        , '%%%=FILTER(''Store Admin''!A:A,(''Store Admin''!A:A<>''Store Admin''!A1)*(''Store Admin''!A:A<>""))' AS 'Location ID'
        , '%%%=INDEX(''Store Admin''!B:B,XMATCH(INDIRECT("B"&ROW()&"#"),''Store Admin''!G:G))' AS 'Region'
        , '%%%=INDEX(''Store Admin''!C:C,XMATCH(INDIRECT("B"&ROW()&"#"),''Store Admin''!G:G))' AS 'Area'
        , '%%%=INDEX(''Store Admin''!D:D,XMATCH(INDIRECT("B"&ROW()&"#"),''Store Admin''!G:G))' AS 'Area #'
        , '%%%=INDEX(''Store Admin''!E:E,XMATCH(INDIRECT("B"&ROW()&"#"),''Store Admin''!G:G))' AS 'Client'
        , '%%%=INDEX(''Store Admin''!F:F,XMATCH(INDIRECT("B"&ROW()&"#"),''Store Admin''!G:G))' AS 'Store #'
        , '%%%=FILTER(UNIQUE(FILTER(SORTBY(FILTER(''Requests''!I:M,(ISNUMBER(''Requests''!F:F))),FILTER(''Requests''!F:F,(ISNUMBER(''Requests''!F:F)))),{1,0,0,0,1})),{0,1})' AS 'Signature'
        , '%%%=INDEX(''Store Admin''!P:P,XMATCH(INDIRECT("B"&ROW()&"#"),''Store Admin''!G:G))' AS 'AM'
        , '%%%=SUMIFS(''Requests''!H:H,''Requests''!M:M,INDIRECT("B"&ROW()&"#"),''Requests''!I:I,INDIRECT("S"&ROW()&"#"))' AS 'AR'
        , '%%%=SUMIFS(''Assembly''!F:F,''Assembly''!A:A,INDIRECT("B"&ROW()&"#"),''Assembly''!E:E,INDIRECT("S"&ROW()&"#"))' AS 'AA'
    FROM 
        `full-database-name`.location a;
Your_HEREDOC_Tag;

$preparedSQL = $db->prepare($SQL);
$preparedSQL->execute();
$results = $preparedSQL->fetchAll(PDO::FETCH_ASSOC);

$f = fopen('./test/Results.csv', 'w+');

fputcsv($f,$csv_fields);

foreach ($results as $result)
{
    fputcsv($f,$result);
}

fclose($f);

我需要做三件事来将我的 SQL 代码转换为准备好的语句: 首先,将 HEREDOC 标记放在整个 SQL 代码块周围。 其次,完全限定 SQL table 引用。 第三,把成对的双引号变成普通的双引号(""this"" 变成"this")。单引号保持成对 (''like this'')。我假设这是在 CSV 创建期间保留双引号的 fputcsv 函数,在 MySQL 中我不得不通过将它们加倍来保留它们,但老实说这只是一个猜测。