2012-01-16 57 views
1

爲了記錄,我閱讀了關於PHP中布爾比較的文檔,但我不明白我的代碼在這種情況下如何相關。我想我連接到MySQL時遇到了問題,但事實證明一切正常,我可以毫無問題地進行查詢。所以,MySQL與這篇文章並不相關。無論操作數和操作符如何,PHP MySQL比較總是成立

我使用它來報告試圖連接施工的對象中的錯誤。請注意,我試過==,===,!=和!==只是爲了得到相同的問題。我甚至嘗試將參數轉換爲bool和boolean。

下面的代碼塊中的註釋是相關的。

private function assert($test){ // Tried renaming in case PHP was funny about it. 
    if ($test === FALSE){ // Tried ==, ===, !== and != and casting $test. 
     if ($this->use_exception){ 
      throw new mysql_exception(); 
     }else{ 
      die("MySQL ".mysql_errno()." - ".mysql_error()); 
     } 
    } 
} 

連接是典型的。

$this->con = mysql_connect($host, $un, $pw, false, $ssl ? MYSQL_CLIENT_SSL : 0); 

// I get 'yay' 
echo mysql_ping($this->con) ? "yay" : "nay"; 

// This disagrees. Tried no cast, and a cast to bool. 
$this->assert((boolean)($this->con != FALSE)); 

mysql_ping()表示一切正常,但assert()停止按下不管什麼。

我試過每個操作員和演員組合,甚至將名字衝突中的偏執狂重命名爲功能。爲什麼assert()只能看到真實?

編輯:

爲了使我的問題更清晰,考慮替代實現與尤金的建議使用is_resource的。問題是我不知道爲什麼會發生下面的情況。

private function assert($test){ 
    $test = $test ? true : false; 
    if ($test === FALSE){ 
     echo "$test === false<br />"; 
    } 
    if ($test == FALSE){ 
     echo "$test == false<br />"; 
    } 
    if ($test !== FALSE){ 
     echo "$test !== false<br />"; 
    } 
    if ($test == FALSE){ 
     echo "$test != false<br />"; 
    } 
} 

輸出有故障,經過一次比較後值發生了變化。由於我可以查詢,所以$ test必須是真的。我不應該得到輸出,但我爲每個操作員都做。我也試過用FALSE替換爲0.

錯誤的PHP實例?

1 !== false 
=== false 
!== false 
!= false 
+0

你在路過的$測試? – MrGlass 2012-01-16 16:26:37

+1

你從'mysql_ping'獲得'yay',這意味着'$ this-> con'實際上不是'FALSE',這意味着'$ this-> con!= FALSE'應該評估爲'true'就像它一樣。 – Mchl 2012-01-16 16:27:28

+1

有什麼問題?據我的理解,你的帖子,連接是成功的,該函數返回一個鏈接標識符,因爲它應該總是會聲明爲真.. L.E .:手冊中說:「成功時返回MySQL鏈接標識符或失敗時返回FALSE。所以我想你應該測試'if($ this-> con === FALSE)' – Catalin 2012-01-16 16:27:49

回答

0
$this->assert(is_resource($this->con)); 
+0

謝謝你花時間貢獻!我試過這一行,但結果是一樣的:assert()仍然會殺死腳本,無論我如何告訴它來解釋參數。 – 2012-01-18 22:43:29

+0

我給OP增加了一個新的例子。 – 2012-01-18 22:58:52

0

不能使用你的第二個例子,並結合功能?你已經得到的值(耶/否)

$this->con = mysql_connect($host, $un, $pw, false, $ssl ? MYSQL_CLIENT_SSL : 0); 
$this->assert = mysql_ping($this->con) ? 1 : 0; 

只是想大聲

+0

除非assert是一個可以做某事的函數..抱歉,如果我錯了,斷言不僅僅是一個布爾數據點。 – Silvertiger 2012-01-18 23:04:22

+0

看着你的代碼,你的意思是讓$ this->斷言__set的屬性來處理?至於檢查$ this-> connect()中的值,我寧願將錯誤檢查保存在一個單獨的方法中,這樣我就不必在整個類定義中花費die(),mysql_error()和mysql_errno()。編輯:是的,這是一種方法。 – 2012-01-18 23:07:02

+0

您的代碼是否期望$ this-> assert是一個0或1的布爾值?我的代碼應該做的伎倆,然後你可以添加「如果($斷言){mysqlquery之類的}」... ...斷言不是一個預定義的函數或方法是否正確?看着你上面的代碼,你正在定義assert函數來執行與我的代碼行類似的功能。 – Silvertiger 2012-01-18 23:29:01