2010-08-27 32 views
0

我有幾個簡單的PHP函數我正在使用。一個用於檢測用戶是否在iPhone上,另一個用於調整圖像的大小(如果是的話)。簡單的PHP函數和變量混淆

<?php 

/* User agent function */ 
function userAgent(){ 
    $browser = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone"); 
    if ($browser == true) { $var = 1; } 
    return $var; 
} 

/* Image resize function */ 
function imageResize($width, $height) { 

    $var = userAgent($var); 

    if($var == 1){ 
     $width = round($width/2); 
     $height = round($height/2); 
    }else{ 
     $width = round($width); 
     $height = round($height); 
    } 

    echo "width=\"$width\" height=\"$height\""; 
} 

?> 

問題是,如果我手動更改$ VAR爲0或1的userAgent()函數,圖像不調整,但如果我改變$ VAR來== 0的imageResize( )功能,他們這樣做。

爲什麼變量沒有從第一個函數傳遞到第2個函數,還是我在做其他錯誤?

回答

5

strpos永遠不會返回true 。您需要測試$browser != false,否則您的功能將永遠無法識別iPhone。

但是,您的代碼是不必要的複雜,並返回一個整數在這裏沒有什麼用處。我會建議簡化重寫:

// Make it return `true` or `false` instead of `1`, also make it universal 
function isAgent($string) 
{ 
    return (strpos($_SERVER['HTTP_USER_AGENT'],$string) !== false); 
} 


/* Image resize function */ 
function imageResize($width, $height) { 

    if(isAgent("iPhone")){ 
     $width = round($width/2); 
     $height = round($height/2); 
    }else{ 
     $width = round($width); 
     $height = round($height); 
    } 
    // Consider using CSS 
    echo "style=\"width: {$width}px; height: {$height}px;\""; 
} 
+0

謝謝,真的知道這一點,雖然使用雙重否定感覺很奇怪。我不使用CSS,因爲我正在調整圖像大小,並且最好使用內聯HTML。我也將列出多個用戶代理,所以在我原來的問題,我只是改變$ browser = strpos($ _ SERVER ['HTTP_USER_AGENT'],「iPhone」);到$ browser = strpos($ _ SERVER ['HTTP_USER_AGENT'],「$ array」); 雖然真的有用,但再次感謝。 – theorise 2010-08-27 11:16:22

+0

@dani不客氣。請注意'strpos'不接受數組,你必須建立一個循環來檢查多個用戶代理。使用CSS或內聯HTML在任何情況下都不應該有任何區別,只不過CSS是更現代化的做法...... – 2010-08-27 11:18:33

+0

你是對的,我的不好。我認爲它沒有太大的區別,儘管內聯CSS僅僅在這個例子中看起來毫無意義,僅僅是因爲HTML對寬度和高度屬性的本地支持。實際上,談話有趣的話題,因爲我不知道他們的好處。 – theorise 2010-08-27 11:38:20

3

看來你只能返回$var如果用戶代理是iPhone,否則你試圖返回一個未定義的變量(你的userAgent函數內)

嘗試:

function userAgent(){ 
    $browser = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone"); 
    $var = 0; 

    if ($browser !== false) { $var = 1; } 
    return $var; 
} 
+0

完美,服用了一段時間才能習慣這個PHP說大話:)謝謝! – theorise 2010-08-27 10:59:15

+0

我的壞Pekka,改變了,所以它檢查布爾錯誤,而不是真實的。 – 2010-08-27 11:03:34

+0

哦,是的@Pekka是正確的。 ($ browser == true)部分不起作用。這似乎很不直觀,你不得不說,如果$瀏覽器不是假的... – theorise 2010-08-27 11:07:55

0

你期望$var參數由userAgent函數進行處理?在這種情況下,您需要將其指定爲參數。

function userAgent($var) { 
... 

否則,您可能需要初始化函數體中的$var。這是一個明智的策略,讓您的if-then-else小號對稱:

if($browse) { 
    $var = 1; 
} else { 
    $var = 0; 
} 

,你可以寫這個更加簡潔有點像

function userAgent() { 
    $browser = ..... 
    return $browser ? 1 : 0; 
}