2014-01-07 184 views
5
$conn = mysql_connect($db_host,$db_user,$db_password) || die('Connection to mysql failed'); 
mysql_close($conn); 

執行此代碼時,顯示以下警告。「或」與「||」之間的區別?

PHP的警告:mysql_close()預計參數1是資源,布爾在script.php的給予上線45

$conn = mysql_connect($db_host,$db_user,$db_password) or die('Connection to mysql failed'); 
mysql_close($conn); 

沒有警告現在!?

+1

'var_dump($ conn);' – zerkms

+1

不要使用mysql函數-.- – jeremy

+2

@Jeremy這不是一個非常有用的評論。我懷疑他是否在使用'mysql'庫,他可能只是不知道有什麼理由不這樣做。至少[鏈接到一些資源](https://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php?rq=1)並幫助他學習。 –

回答

9

&&||logical operators - 它們用於布爾條件語句。作爲@towr和@ChrisHayes點,您可以使用andor代替&&||語法,儘管其優先級低於大多數其他運算符。

or然而,在這方面是完全不同的 - 它是control flow (see section 2.5.7: exit and return)的一部分。

布爾條件:

if ($foo == $bar || $bar != $bob) 

控制流:

mysql etc... or die(); 

您收到錯誤 「PHP的警告:mysql_close()預計參數1是資源......」 因爲你」實際上並沒有寫出正確的語法,因此破壞了你的mysql_connect聲明。

+2

最佳答案,但應解決優先級問題,即使該帖子沒有提出問題並提及優先級不會直接回答問題。 – jeremy

+4

根據文檔http://www.php.net/manual/en/language.operators.logical.php'或'和'和'也只是邏輯運算符,但它們的優先級比'||'差, ''&&。 – towr

+0

另外,你能否引用你的消息來源? – jeremy

5

andor具有比&&||更高優先級低。更精確地,&&||具有比賦值運算符(=)更高的優先級,而andor具有更低的優先級。

http://www.php.net/manual/en/language.operators.precedence.php

通常它不會有所作爲,但有些時候不知道這個區別可能會導致一些意外的行爲的情況。見的例子在這裏:

http://php.net/manual/en/language.operators.logical.php

EDIT(由@towr建議):

適用於手頭上的問題,這意味着,在第一種情況下,我們分配給$connmysql_connect(....) || die('....'),因爲||值比=有更高的優先權。這裏的問題是$conn現在是一個布爾值,而不是資源。

在第二種情況下,我們OR表達$conn = mysql_connect(....)die('....'),因爲=OR一個優先級數字。我們對布爾值不做任何處理,$conn只是我們在第一個表達式中分配給它的資源(如果它沒有失敗)。

+0

-1,不回答問題 – jeremy

+3

@Jeremy它的確如此,因爲這意味着 '$ foo = $ a || $ b'等於'$ foo =($ a || $ b')等於'$ foo =($ a或$ b'),而'$ foo = $ a或$ b'等於'($ foo = $ a) || $ b'等於('$ foo = $ a)或者$ b' – towr

+0

嗯...所以把它應用到OP的問題中,它是如何回答的? – jeremy

相關問題