2011-07-02 58 views
0

這似乎是PHP的一個非常神祕的部分,我想知道是否有人可以澄清,因爲手冊似乎沒有包含這個(或者我無法在任何地方找到它)。

這些東西會返回什麼?

if($c = mysql_connect($host, $user, $pass)){ 
echo 'Success'; 
}else{ 
echo 'Failure'; 
} 

這會永遠迴響「成功」,因爲$ C被成功分配到真的還是假的?我想知道如果我能做到這一點,或者如果我必須在前一行定義$ c。

謝謝。

+0

mysql_connect返回一個對象或false。在這種情況下,$ c將成功創建MySql對象,並在失敗時創建布爾值false。 –

回答

7

它在Assignment Operators提到:

賦值表達式的值是分配的值。也就是說,「$ a = 3」的值是3

所以$c = ...將導致true如果true被分配到$cfalse如果false分配。

這也是爲什麼在迭代查詢結果

while(($row = mysql_fetch_array(...))) 

作品。

0

它並不總是迴應'​​成功'。 PHP首先將mysql_connect的結果分配給$to,然後評估布爾值$to。但最好是用這種方式來確保可理解:

$c = mysql_connect($host, $user, $pass) 
if($to) { 
    echo 'Success'; 
} else{ 
    echo 'Failure'; 
} 
4

有疑問時,建立一個測試用例!

建立一個測試用例:

if ($c = true) { 
    echo 'Success'; 
} else { 
    echo 'No Success'; 
} 

運行此在線:http://codepad.org/jxylNzOu

你會注意到,第一塊將只執行如果條件調高true(或什麼PHP評估板當被問到時爲true),因此它不是問一個值是否成功應用於$c,而是應用於$c的值是否爲true

關於你提到的具體的例子...

如果你的情況下,當你試圖打開到MySQL的連接,$ctrue如果連接成功,導致了第一塊if-statement正在運行。否則,如果未建立連接,則$c將爲假,從而使if-statement的條件爲false,從而導致運行else塊。

根據the documentation對於mysql_connect(),可以從該函數返回兩件事之一。

  1. 一個MySQL連接標識符(如果建立了連接)
  2. FALSE,其表示未能建立連接。

因此,有下面的代碼示例

$conn = mysql_connect($host, $user, $pass); 
if ($conn) { /*...*/ } 

而且

if ($conn = mysql_connect($host, $user, $pass) { 
    /*...*/ 
} 
+1

Nitpick:如果建立了連接,則$ c將成爲一個*資源*,其計算結果爲'true'。 – deceze

+1

實際上'$ c'不會是真的,但會是一個連接資源。更好地說'$ c'將在成功的情況下爲'!== FALSE'或者在失敗時爲'FALSE' –

+0

+1給你們兩個;你們都是技術上正確的:)我知道一個實際的布爾值不會在成功時返回,但是當評估一個有效的鏈接標識符時會觸發'true'結果而不是'false'結果。 – Sampson

0

PHP是一個「弱類型」的語言,這意味着PHP不要求沒有任何區別(也不支持它那件事)變量的顯式類型聲明。

注重consufe或評價0 1爲真/假(布爾值)

採取這種情況下,樣品:

$s = "0"; //String s = '0' 
$res = strstr($s,'0'); //Search the character zero into the string $s 
if ($res){ 
    echo "Zero found!"; 
}else{ 
    echo "Zero not found!" 
} 
//Hey!! Whats up!!?? Zero is not found! 

這是因爲零,這是該函數的返回值strstr,被評估爲FALSE在某些情況下會產生意想不到的結果。

正確的方法是使用Not Identical運營商!==其中的價值和相比

前面的例子應該是:

$s = "0"; //String s = '0' 
$res = strstr($s,'0'); //Search the character zero into the string $s 
if ($res !== FALSE){//Check for value AND type 
    echo "Zero found!"; 
}else{ 
    echo "Zero not found!" 
} 
//yeah now it works! 

所以你的情況我會寫if語句作爲:

if(($c = mysql_connect($host, $user, $pass)) !== FALSE){ 
echo 'Success'; 
}else{ 
echo 'Failure'; 
} 
+1

這些與OP所要求的問題是完全不同的問題。 'strstr' *可以*返回一個布爾型的'false'或者*成功值,* *可以*評估爲'false'。 'mysql_connect'沒有這個問題,它會返回一個資源,當成功時它的值爲'true',失敗時返回一個布爾值'false'。 – deceze

+0

是的,我同意,只是爲了澄清'if語句'必須注意函數的返回值和類型 –

相關問題