【问题标题】:Escape Character issues转义字符问题
【发布时间】:2013-07-08 04:47:57
【问题描述】:

我通常理解使用反斜杠转义引号或使用反斜杠进行转义的想法,以便您可以在字符串中使用反斜杠等,但我在尝试通过 odbc_exec() 传递查询时遇到了问题并使用表值函数,我似乎无法让它停止给我

SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark after the character string '0000005'.

这就是我硬编码变量时的样子:

$query = 'SELECT '.$csvCriteria.", googStep, Segment, PrevailingDirection FROM jSelectorCSVCreator('1','1','northbound','0006009','00000050370A2P000004','00060041270B2P000070','1')";

这很好用。请注意, $csvCriteria 没有给我任何问题。这就是我想要的样子:

$query = 'SELECT '.$csvCriteria.", googStep, Segment, PrevailingDirection FROM jSelectorCSVCreator('".$stepNum."', '".$segMarker."', '".$prevDirection."', '".$rdNoA."', '".$re_1."', '".$re_2."', '".$directionA."')";

但是,我不断收到关于 $re_1 和 $re_2 的错误(我在顶部添加的错误)。

我尝试了多种我认为可行的变体,例如:

$query = 'SELECT '.$csvCriteria.", googStep, Segment, PrevailingDirection FROM jSelectorCSVCreator('".$stepNum."','".$segMarker."','".$prevDirection."','".$rdNoA.'\',\''.$re_1.'\',\'00060091100B1P000030\',\'1\')';

但是我在这方面既不熟练,也不知道我是否遗漏了一些明显的东西。只是完全卡住了,需要帮助!

【问题讨论】:

  • 请回显$query,您可能会发现问题出在哪里。
  • 嗨,戴夫,我已经回应了 $query,我让其他人和我一起查看了结果(他们比我更了解他们在做什么),我们仍然可以'不明白为什么它给了我这个错误。
  • SELECT REId rePosition reSpeedLimit reBearing RE RdNo LkNo reLat reLon googStep Segment PrevailingDirection FROM jSelectorCSVCreator(1 1 Westbound "0000005' '0000005370A2P00003' '0000005370A2P00009' '1')

标签: php sql sql-server-2008 escaping odbc


【解决方案1】:

我无法重现您的错误:

有问题的 SQL 是:

SELECT csvcriteria, 
       googstep, 
       segment, 
       prevailingdirection 
FROM   jselectorcsvcreator('1', '1', 'northbound', '0006009', 
'00000050370A2P000004', '00060041270B2P000070', '1');

将数据放入变量中,例如:

$csvCriteria   = 'csvCriteria';
$stepNum       = 1;
$segMarker     = 1;
$prevDirection = 'northbound';
$rdNoA         = '0006009';
$re_1          = '00000050370A2P000004';
$re_2          = '00060041270B2P000070';
$directionA    = 1;

使用第一行有效的代码和无效的代码都返回完全相同的结果:

$correct = 'SELECT ' . $csvCriteria . ", googStep, Segment, PrevailingDirection FROM jSelectorCSVCreator('1','1','northbound','0006009','00000050370A2P000004','00060041270B2P000070','1')";
$query   = 'SELECT ' . $csvCriteria . ", googStep, Segment, PrevailingDirection FROM jSelectorCSVCreator('" . $stepNum . "','" . $segMarker . "','" . $prevDirection . "','" . $rdNoA . "','" . $re_1 . "','" . $re_2 . "','" . $directionA . "')";

echo $correct . "\n";
echo $query . "\n";

var_dump($correct === $query);

回复是(CodePad):

SELECT csvCriteria, googStep, Segment, PrevailingDirection FROM jSelectorCSVCreator('1','1','northbound','0006009','00000050370A2P000004','00060041270B2P000070','1')
SELECT csvCriteria, googStep, Segment, PrevailingDirection FROM jSelectorCSVCreator('1','1','northbound','0006009','00000050370A2P000004','00060041270B2P000070','1')
bool(true)

我的猜测是$csvCriteria 或手头的任何变量都有错误。

我强烈建议在SQL Formatter 中查看$query 的回显查询(选择MS ACCESS)

【讨论】:

  • 看来我在代码中进一步使用了一个名为 stripslashes() 的函数。显然,这实际上并没有像我想象的那样摆脱反斜杠。相反,我刚刚使用 str_replace() 并且它工作正常。如果没有您确认没有任何问题,我将无法做到这一点。谢谢戴夫!
【解决方案2】:
$query = 'SELECT '.$csvCriteria.", .....

应该是

$query = 'SELECT '.$csvCriteria.', ......

【讨论】:

  • 你有没有机会告诉我你认为整行应该是什么样子?我相信我已经走了那条路,但它没有解决任何问题。谢谢!
【解决方案3】:

尝试使用

$query = "SELECT $csvCriteria, googStep, Segment, PrevailingDirection FROM jSelectorCSVCreator('$stepNum','$segMarker','$prevDirection','$rdNoA','$re_1','00060091100B1P000030','1')";

这要简单得多,不需要所有的转义。

【讨论】:

    【解决方案4】:

    事实证明,我试图传递一个看起来像“0000000\000X00X0\0000000”的字符串,但效果不佳。我决定使用 stripslashes() 这样我就可以更轻松地传递变量,并在它出现在 SQL 中时使用它。原来 stripslashes() 不是那样工作的。我用 str_replace() 代替,现在可以正常工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多