2014-08-31 58 views
0

我遇到一个奇怪的问题。当我使用此代码检测移动设备时,它导致我的查询对话框停止工作(仅在iPhone上 - 未在其他移动设备上测试过),但它在我的浏览器中正常工作。有没有解决的办法?

<?php 

    $iphone = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone"); 
    $android = strpos($_SERVER['HTTP_USER_AGENT'],"Android"); 
    $palmpre = strpos($_SERVER['HTTP_USER_AGENT'],"webOS"); 
    $berry = strpos($_SERVER['HTTP_USER_AGENT'],"BlackBerry"); 
    $ipod = strpos($_SERVER['HTTP_USER_AGENT'],"iPod"); 
    $ipad = strpos($_SERVER['HTTP_USER_AGENT'],"iPad"); 

    if ($iphone || $android || $palmpre || $ipod || $berry || $ipad == true) 
    { 
     //do something 
    } else { ?> 
     <div id="scrollerWrapper"> 
      <div id="left_shopping_cart"> 
      <?php include($_SERVER['DOCUMENT_ROOT']."/scripts/cart_side_products.php"); ?> 
      </div> 
     </div><!-- end#scrollerWrapper--> 
     <?php 
     } ?> 

如果我拿出第一个块,查询在我的iPhone上正常工作。

+0

@GeorgeCummins谢谢。没有它不是我的实际代码。但为了清晰起见,我会解决它。 – vinylDeveloper 2014-09-02 04:56:12

回答

2

发生什么事是strpos()返回一个整数,但你要求它返回的值是boolean值。

来自:http://php.net/manual/en/function.strpos.php

strpos

(PHP 4,PHP 5) strpos - 查找字符串

说明

子串的第一个出现的位置混合strpos(string $ haystack,mixed $ needle [,int $ offset = 0]) 找到第一次出现需要的数字位置在干草堆串。

而且,对于这部分:

if ($iphone || $android || $palmpre || $ipod || $berry || $ipad == true) 

你有一些语法错误在你,如果条件。这些应该写成:

if ($iphone == [target value] || $android == [target value] || $palmpre == [target value] ... // and so on for each` 

还有一些特别需要注意strpos():它会返回0(即int)如果搜索值位于字符串中的起始位置,它将返回FALSE(即boolean)如果在字符串中找不到目标子字符串。

基本上,你正在寻找正确的代码会是这样的:

<?php 
$iphone = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone"); 
$android = strpos($_SERVER['HTTP_USER_AGENT'],"Android"); 
$palmpre = strpos($_SERVER['HTTP_USER_AGENT'],"webOS"); 
$berry = strpos($_SERVER['HTTP_USER_AGENT'],"BlackBerry"); 
$ipod = strpos($_SERVER['HTTP_USER_AGENT'],"iPod"); 
$ipad = strpos($_SERVER['HTTP_USER_AGENT'],"iPad"); 

if ($iphone !== FALSE 
    || $android !== FALSE 
    || $palmpre !== FALSE 
    || $ipod !== FALSE 
    || $berry !== FALSE 
    || $ipad !== FALSE) { 

     //do something 

} else { 
    ?> 
    <div id="scrollerWrapper"> 
     <div id="left_shopping_cart"> 
      <?php 
      include($_SERVER['DOCUMENT_ROOT']."/scripts/cart_side_products.php"); 
      ?> 
     </div> 
    </div> 
    <!-- end#scrollerWrapper--> 
<?php 
} 
?> 
+0

感谢您的意见。虽然你的解决方案更清洁,但我发现我有一个JavaScript错误。显然,当我省略div时,我的javascript给出了一个错误,导致查询对话框无法正常工作。 +1帮助 – vinylDeveloper 2014-09-02 04:54:04

0

正如DrewT所指出的,你的代码有打字错误。布尔FALSE与0不完全相同,并且与NULL不完全相同。您还依赖于$ _SERVER ['HTTP_USER_AGENT'],这实际上并不保证可用 - 即使它是不受信任的(例如,我的普通浏览器始终将其自身标识为Windows Firefox,尽管这不是我的操作系统或我的浏览器)。

这是一种首先检查是否设置了HTTP_USER_AGENT,然后使用preg_match()来检查用户代理字符串是否与您正在查找的平台之一匹配的方法。 (具体的平台名称在数组元素$matches[1][0]抓获,并在用户代理字符串中的偏移量在$matches[1][1]捕捉。)

if (array_key_exists('HTTP_USER_AGENT', $_SERVER) && 
    isset($_SERVER['HTTP_USER_AGENT')){ 
    $matches = array(); 

    // preg_match returns 1 if matched, 0 if not found, or FALSE if error. 
    if(preg_match('/([iPhone|Android|webOS|BlackBerry|iPod|iPad])/i', 
     $matches, PREG_OFFSET_CAPTURE) == 1){ 
     // do something 
    }else{ 
     // do something else 
    } 
}