2011-01-11 148 views
2

我想要建立一个简单的SQL语句的一部分:PHP剥离出字符串

// 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是<之间缺少一切>。调试器显示$ sql的值为:

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

这是如此基本我只是迷路了。我不认为<或>是特殊字符吗?我已经尝试转义他们,并使用双引号,而这是相同的。

这是怎么回事?

+0

你是通过某种基于网络的编辑器来做到这一点吗?可能是某些东西的剥离看起来是一个无效的HTML标记。尝试颠倒顺序(所以它是`> ... <`),或者用`</>`实体替换它们,看看是否有帮助。 – 2011-01-11 19:05:33

+1

回显你的$ mydetails ['city']变量。我打赌由于某种原因它是空的。 – dqhendricks 2011-01-11 19:10:02

回答

0

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

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

如果您在Zend Studio中调试时将鼠标悬停在变量上,会弹出一个小窗口向您显示该变量的内容(有时)。这个窗口切断了'<'后面的任何内容。该变量仍包含正确的字符串,但IDE /调试器相当具有误导性。不幸的是,由于这个特殊的字符是一个常见的问题,因为HTML解析这是一个相当混乱的错误识别。如果您尝试比较php页面的输出结果或者查看非常长的输出(对于非常长的字符串,似乎只能在调试变量窗口中看到1024个字符,因此字符串可能会被截断),问题就复杂化了。

不幸的是,这仍然是迄今为止我为PHP推出的最好的IDE。

0

我不确定是什么导致了这个问题。显然有些东西可能会剥离掉html标签。一个建议是尝试与它们的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,这就是你想要实现的。

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()'; 

或反向的顺序运算符:使= =第一个

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

你不会碰巧通过striptags()函数运行$ sql变量,你会吗?这将与它剥离“< = expirydate和expirydate>”一致,因为它会假定它是一个HTML标记。