$ _SERVER ['HTTP_USER_AGENT']导致查询UI无法加载

时间:2014-08-31 22:21:04

标签: php jquery-ui mobile

我有一个奇怪的问题。当我使用此代码检测移动设备时,它导致我的查询对话框停止工作(仅在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上运行正常。

2 个答案:

答案 0 :(得分:2)

发生了什么strpos()正在返回一个整数,但您要求它返回的是boolean值。

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

  

strpos

     

(PHP 4,PHP 5)   strpos - 查找字符串中第一次出现子字符串的位置

     

说明

     

混合strpos(字符串$ haystack,混合$ needle [,int $ offset = 0])   在haystack字符串中找到第一次出现针的数字位置。

此外,对于这部分:

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

你的if条件有一些语法错误。这些应该写成:

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 
} 
?>

答案 1 :(得分:0)

正如DrewT指出的那样,您的代码存在输入错误。布尔值FALSE与零不完全相同,也与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 
    }
}