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


79

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

我收到此错误:

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

码:

$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 '];
}

/** SOME CODE HERE **/

    
$wrotesql = "UPDATE service_report SET  name ='$name' , $date = '$date',$text = '$text[$nro]', ser_date = '$date2[$nro]' WHERE something = '$something')";

$wroteresult = mysql_query($wrotesql);

有人可以给我一个提示我做错了什么吗?


5
在...?你能告诉我们热线吗?
鞋子

起到了魅力,改变了括号。
艾伦·马斯特斯

请分享更多详细信息-哪个确切的行引发了该问题?此外,这与MySQL有何关系?
Nico Haase

Answers:


112

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

例如这个

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

我大胆猜测的一个或多个你的$name$date$text$date2变量已经被初始化为一个字符串。

编辑:再次查看您的问题,似乎您实际上并不想将它们用作数组,因为您将它们当作更进一步的字符串来对待。

如果是这样,请将您的分配更改为

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

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

明确地说,这些在PHP 7+中可以正常工作

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

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

什么是不工作正在尝试使用空指数上宣布为字符串,数字,对象等,即任何变量推

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

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

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

所有这些都会导致致命错误。


19
我发现这可能是与从php 5迁移到php 7相关的问题。php 5对于变量是否是数组而不是php 7的容忍度更高。在大多数情况下,解决方案是显式声明数组,如本答案所述。
杰里米·杨

@JeremyYoung您的评论对我的情况有所帮助,我的Wordpress实例停止工作,当我从7.2切换到5.6时,它起作用了。
米海尔·明科夫

46

你可能已经定义$name$date$text或者$date2是一个字符串,如:

$name = 'String';

然后,如果您将其视为数组,则会出现致命错误:

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

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

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

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


或宣布这一点$name = null
阿尔伯特·伊达尔戈

我尝试了此解决方案,但仍然遇到相同的问题。我对PHP不熟悉。$ taxquery = array(); <-我添加了这一行。$ taxquery = $ q-> get('tax_query'); $ taxquery [] = array('taxonomy'=>'product_type','field'=>'slug','terms'=>'auction','operator'=>'NOT IN');
安德斯·佩尔森



1

解决了!

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

1

我同意Jeremy Young对Phils答案的评论:

我发现这可能是与从php 5迁移到php 7相关的问题。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。显然不是“最佳实践”,我宁愿阅读并理解完整的代码..但需要快速修复。


0

我有类似的情况:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.