2015-10-15 58 views
2
while ($row = mysqli_fetch_array($result) && strlen($row['url_key']) > 4) 
{ 
.... 
} 

我想到這所取得的陣列分配給$row然後檢查數組中的元素之一的長度,而是我得到爲什麼在PHP中執行布爾測試後發生變量賦值?

「PHP公告:未定義的變量:排在/ home/dwilkins/stage_image_update.php on line ...「

如果$row未被分配,我期望測試短路,並且url密鑰的長度不被測試。我知道正在分配$行,因爲當我將&& strlen...取出時,它正常運行。那麼導致這種行爲的'底層'實際上究竟發生了什麼?我查看了logical operators的PHP.net條目,但我沒有得到任何關於此的信息。

+1

'$ row'不存在,直到你'while'開始循環。 –

+0

評估時,我不認爲'$ row ['url_key']'被賦值或索引不存在。同樣在最後一次運行時,沒有'$ row'。 – Twisty

+0

嘗試使用括號,'($ row = mysqli_fetch_array($ result))&& strlen($ row ['url_key'])> 4)' – JCOC611

回答

7

&&有更高的operator precedence=。您需要相應地組織您的表達式(例如,引入parens以改變優先級)。這是理解和意識到的一個非常重要的基本概念。

+0

我錯誤地認爲不是「=」作爲操作符,如果我有,我會在我引用的頁面上看到答案。謝謝 –

7

運算符優先級。

用圓括號包裹$row = mysqli_fetch_array($result),它會沒事的。

($row = mysqli_fetch_array($result)) && strlen($row['url_key']) > 4 

它現在作爲

$row = (mysqli_fetch_array($result) && strlen($row['url_key']) > 4) 
               ^^^^^ 
               Undefined 
-2

您必須聲明在嚴格模式下PHP變量在循環之前或使用「如果」的語句時,嚴格的錯誤檢查模式下,它被解釋的方式。如果你設置爲null,那麼它們無關緊要,因爲PHP會自動轉換類型。

$row = ''; 

$row = null; 

$row = array(); //EMPTY ARRAY 

,或者您可以使用

settype($row, "null");