php剥离部分字符串

时间:2011-01-11 19:00:56

标签: php string strip

我正在尝试构建一个简单的sql语句:

    // build sql statement          
    $sql = "select * from some_tbl where "; 
    if(strlen($mydetails['city']) > 0) { 
        $sql .= "cityname in (".$mydetails['city'].") and "; 
    } 
    $sql .= 'fromdate <= expirydate and expirydate >= curdate() order by rand()';

但$ sql缺少&lt;之间的所有内容。和&gt;。调试器将$ sql的值显示为:

    select * from tbl_adsinfo where fromdate = curdate() order by rand()

这是如此基本我只是迷失了。我不认为&lt;或者&gt;是特殊字符吗?我试过逃避它们并使用双引号而且它是一样的。

这里有什么?

4 个答案:

答案 0 :(得分:1)

你不会碰巧通过striptags()函数运行$ sql变量,不是吗?这与它删除“&lt; = expirydate和expirydate&gt;”是一致的,因为它会假定它是一个HTML标记。

答案 1 :(得分:0)

我不确定导致问题的原因。显然有一些东西剥离html标签作为一种安全可能。一个建议是尝试替换'&lt;'和'&gt;'使用ASCII代码:

 $sql .= 'fromdate '.chr(60).'= expirydate and expirydate '.chr(62).'= curdate() order by rand()';

编辑: 您也可以使用NOT BETWEEN语句,如下所示:

 $sql .= '(expirydate NOT BETWEEN fromdate AND curdate()) AND (expirydate NOT BETWEEN fromdate AND 17530101) ORDER BY rand()

17530101意味着可能的日期时间值最小。在上一个代码中,您正在检查expirydate是否不在fromdate和curdate()之间,并且expirydate不小于其中任何一个。这意味着expirydate应该大于fromdate,curdate使语句返回true,这就是你想要实现的目标。

答案 2 :(得分:0)

为什么不使用BETWEEN运算符?

$sql .= 'expirydate BETWEEN fromdate AND curdate() ORDER BY rand()';

编辑:

仔细观察你也需要等于,尝试分开行动

$sql .= 'fromdate <= expirydate and expirydate >= curdate() order by rand()';

为:

$sql .= 'expirydate >= curdate() ';
$sql .= 'AND fromdate <= expirydate ';
$sql .= 'ORDER BY rand()';

或者颠倒运算符的顺序:make = first

$sql .= 'AND fromdate =< expirydate ';
$sql .= 'ORDER BY rand()';

答案 3 :(得分:0)

好的,我明白了。问题与PHP无关,它是Zend Studio和/或XDebugger。

让Zend使用调试器花了我几天时间,我确信它可能并不完全像我运行它的方式。

如果在Zend Studio中调试时将鼠标悬停在变量上,会弹出一个小窗口,显示该变量的内容(有时)。这个窗口确实切断了'&lt;'后面的任何内容。变量仍包含正确的字符串,但IDE / Debugger非常容易引起误解。不幸的是,因为这个特殊的字符是一个常见的问题,因为html解析这是一个非常令人困惑的错误识别。如果您尝试比较php页面的输出或者查看非常长的输出(对于非常长的字符串,似乎在调试变量窗口中只能看到1024个字符,因此字符串可能会被截断),问题就更复杂了。 / p>

可悲的是,到目前为止,这仍然是我为PHP提出的最好的IDE。