2011-01-11 121 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標記。