问题:致命错误:[]运算符不支持字符串

时间:2011-05-04 07:00:25

标签: php mysql

我从数据库中获取信息,将其保存在数组中并以循环结构的形式回显它,当我尝试将修改后的信息保存到数据库时,我遇到了问题。

我收到了这个错误:

  

致命错误:[...]中的字符串不支持[]运算符。

代码:

$namesql1 = "SELECT name,date,text,date2 FROM table WHERE something= '$something'";
$nameresult1 = mysql_query($namesql1);
$countrows = mysql_num_rows($nameresult1); 
while ($row = mysql_fetch_array($nameresult1, MYSQL_ASSOC))
{
    $name[]= $row['name'];
    $date[]= $row['date'];
    $text[] = $row['text'];
    $date2 [] = $row['date2 '];
}
.
.
.
FORM
.
.
.
$wrotesql = "UPDATE service_report SET  name ='$name' , $date = '$date',$text = '$text[$nro]', ser_date = '$date2[$nro]' WHERE something = '$something')";

$wroteresult=mysql_query($wrotesql);    

有人可以给我一个暗示我做错了吗?

谢谢。

8 个答案:

答案 0 :(得分:84)

尝试在字符串上使用短数组推送语法时会出现此错误。

例如,这个

$foo = 'foo';
$foo[] = 'bar'; // ERROR!

我猜测您的$name$date$text$date2个变量中的一个或多个已初始化为字符串。

编辑:再次查看您的问题,看起来您实际上并不想将它们用作数组,因为您将它们视为字符串进一步向下。

如果是,请将作业更改为

$name = $row['name'];
$date = $row['date'];
$text = $row['text'];
$date2 = $row['date2'];

使用 empty-index 数组推送语法,PHP 7和代码似乎存在一些问题。

为清楚起见,这些在PHP 7 +中正常工作

$previouslyUndeclaredVariableName[] = 'value'; // creates an array and adds one entry

$emptyArray = []; // creates an array
$emptyArray[] = 'value'; // pushes in an entry

无法正常工作试图使用 empty-index 推送任何声明为字符串,数字,对象等的变量,即

$declaredAsString = '';
$declaredAsString[] = 'value';

$declaredAsNumber = 1;
$declaredAsNumber[] = 'value';

$declaredAsObject = new stdclass();
$declaredAsObject[] = 'value';

所有都会导致致命错误。

答案 1 :(得分:38)

您可能已将$name$date$text$date2定义为字符串,例如:

$name = 'String';

然后,如果你将它视为一个数组,它将给出致命的错误:

$name[] = 'new value'; // fatal error

要解决您的问题,只需在循环开头添加以下代码:

$name = array();
$date = array();
$text = array();
$date2 = array();

这会将它们的值重置为数组,然后您就可以将它们用作数组。

答案 2 :(得分:5)

Migrating from PHP 7.0.x to PHP 7.1.x/

中描述了这种行为
  

字符串不再支持空索引运算符   将空索引运算符应用于字符串(例如$ str [] = $ x)会引发致命错误,而不是无声地转换为数组。

在我的case中,这仅仅是初始化。我通过将$foo=''替换为$foo=[]来解决了这个问题。

$foo='';
$foo[]='test';
print_r($foo);

答案 3 :(得分:1)

解决了!

$a['index'] = [];
$a['index'][] = 'another value';
$a['index'][] = 'another value';
$a['index'][] = 'another value';
$a['index'][] = 'another value';

答案 4 :(得分:1)

我同意杰里米·杨(Jeremy Young)对Phils答案的评论:

我发现这可能是与从迁移有关的问题 php 5到php7。php 5在是否 变量是数组还是不是PHP 7。在大多数情况下,解决方案 如在此答案中所述,是显式声明数组。

在将php5迁移到php7之后,我只是在拍摄Wordpress插件时遇到了麻烦。 由于插件代码依赖用户输入,并且在代码中固有地以字符串或数组形式使用,因此我添加了以下代码以防止发生致命错误:

if(is_array($variable_either_string_or_array)){
    // if it's an array, declaration is allowed:
    $variable_either_string_or_array[]=$additionalInfoData[$i];
}else{
    // if it's not an array, declaration it as follows:
    $variable_either_string_or_array=$additionalInfoData[$i];
}

这是我需要添加的唯一修改,以使插件php7-proof。显然不是“最佳实践”,我宁愿阅读并理解完整的代码..但需要快速修复。

答案 5 :(得分:0)

这在php 5.6中可用 在php 7+中,您应该先声明数组

$users = array(); // not $users = ";
$users[] = "762";

答案 6 :(得分:0)

我有类似的情况:

$foo = array();
$foo[] = 'test'; // error    
$foo[] = "test"; // working fine

答案 7 :(得分:0)

在将变量声明为字符串然后将其写入数组时,我遇到了同样的错误。 这是它没有错误的工作方式

$name = array();
$name[] = $row['name'];