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

问题描述 投票:0回答:10

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

我收到此错误:

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

代码:

$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);

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

php mysql
10个回答
140
投票

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

比如这个

$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';
所有这些都会导致致命错误。


54
投票
您可能已将

$name

$date
$text
$date2
 定义为字符串,例如:

$name = 'String';

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

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

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

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

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


10
投票
此类行为在

从 PHP 7.0.x 迁移到 PHP 7.1.x/ 中进行了描述

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

在我的

案例中,这只是一个初始化。我通过将 $foo=''

 替换为 
$foo=[]
 来修复它。

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

7
投票
这在 php 5.6 中可用 在 php 7+ 中你应该首先声明数组

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

3
投票
将变量声明为字符串然后将其写入数组时,我遇到了相同的错误。 这就是它的工作原理,没有错误

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

1
投票
解决了!

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

1
投票
我同意杰里米·杨对菲尔斯答案的评论:

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


0
投票
我也遇到过类似的情况:

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

0
投票
以这种方式编码将修复错误

$name=array(); $date=array(); $text=array(); $date2=array(); while ($row = mysql_fetch_array($nameresult1, MYSQL_ASSOC)) { $name[] = $row['name']; $date[] = $row['date']; $text[] = $row['text']; $date2[] = $row['date2 ']; }
    

0
投票
这个问题我的另一个错误是:

$arr = []; $arr[] = 'add'; $arr = array_shift($arr); // <-- return array_shift is boolean not array ;) //array_shift(array &$array): mixed $arr[] = 'next'; // become error
    
© www.soinside.com 2019 - 2024. All rights reserved.