逃避角色问题

时间:2013-07-08 04:47:57

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

我通常理解使用反斜杠转义引号并使用反斜杠转义以便你可以在字符串中使用反斜杠等等的想法,但我遇到了一个问题,试图通过{{1传递查询并使用表值函数,我似乎无法让它停止给我

odbc_exec()

这是我对变量进行硬编码时的样子:

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

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

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

但是我一直在$ re_1和$ re_2附近出现错误(我在这个错误中加入了错误)。

我尝试了多种可能有用的变体,例如:

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

但我并不熟练掌握这一点,也不知道我是否遗漏了一些明显的东西。只是绝对卡住了,需要一只手!

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

应该是

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

答案 2 :(得分:0)

尝试使用

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

这更简单,无需所有逃脱。

答案 3 :(得分:0)

事实证明我试图传递一个看起来像这个“0000000 \ 000X00X0 \ 0000000”的字符串,但效果并不好。我决定使用stripslashes(),因此我可以更容易地传递变量,并在SQL中使用它。结果striplashes()不能像那样工作。我使用了str_replace(),它现在工作正常。