PHP Web服务报错:[]运算符不支持字符串类型,非重复问题求助
解决“[]运算符不支持字符串类型”的致命错误
咱们先揪出你代码里的问题根源:
$posts = array(); // ... while($post = mysql_fetch_assoc($result)) { $posts[] = $post; $posts = array_shift($posts); }
问题拆解
第一次进入循环时:
$posts[] = $post把第一条查询结果塞进了数组,此时$posts是包含单个元素的数组。- 紧接着
$posts = array_shift($posts)会把数组的第一个元素(也就是那条post数据)取出来,赋值给$posts。这时候$posts已经不再是数组类型,变成了单个的关联数组(或者字符串类型,取决于你的数据结构)。
等循环第二次执行时,你又尝试用$posts[] = $post——这就相当于给非数组变量用数组追加运算符,自然触发了“[]运算符不支持字符串类型”的致命错误。
修复方案
根据你的实际需求,有两种常用修复方式:
方式1:只需要获取匹配的第一条数据(从你用array_shift的操作来看,大概率是这个需求)
既然只需要第一条数据,完全没必要用循环,直接一次获取就行:
$query = "SELECT * FROM Journey WHERE Token='{$token}';"; $result = mysql_query($query,$link) or die('Errant query: '.$query); $posts = array(); $dto = new Journey(); $dta = new Dta(); if(mysql_num_rows($result) > 0) { $posts = mysql_fetch_assoc($result); // 这里写后续处理$posts的逻辑 }
方式2:需要获取所有匹配token的数据
如果你的token可能对应多条结果,那就去掉array_shift那行,让$posts始终保持数组类型:
$query = "SELECT * FROM Journey WHERE Token='{$token}';"; $result = mysql_query($query,$link) or die('Errant query: '.$query); $posts = array(); $dto = new Journey(); $dta = new Dta(); if(mysql_num_rows($result) > 0) { while($post = mysql_fetch_assoc($result)) { $posts[] = $post; } // 这里写后续处理$posts数组的逻辑 }
额外提示
另外要注意:你现在用的mysql_*系列函数已经在PHP 5.5后被废弃,PHP 7更是直接移除了它。为了代码的安全性和兼容性,建议尽快换成mysqli_*或者PDO扩展。同时,你直接把$token拼进SQL语句的写法存在SQL注入风险,换成预处理语句就能解决这个问题。
内容的提问来源于stack exchange,提问作者Nodoid
相关产品推荐
相关产品推荐

