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