2010-08-27 66 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; 
}