【问题标题】:Fatal error: [] operator not supported for strings致命错误:字符串不支持 [] 运算符
【发布时间】:2011-08-18 06:59: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);

有人可以告诉我我做错了什么吗?

【问题讨论】:

  • 在...中?你能告诉我们线路吗?
  • 这很有魅力,改变了括号的括号。
  • 请分享更多细节 - 哪一行会引发这个问题?另外,这与 MySQL 有什么关系?

标签: php mysql


【解决方案1】:

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

比如这个

$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

不起作用是什么试图使用 empty-index 推送声明为字符串、数字、对象等的任何变量,即

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

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

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

都会导致致命错误。

【讨论】:

  • 我发现这可能是与从 php 5 迁移到 php 7 相关的问题。php 5 比 php 7 更能容忍变量是否为数组的歧义。在大多数情况下,解决方案是显式声明数组,如本答案中所述。
  • @JeremyYoung 你的评论对我有帮助,我的 Wordpress 实例停止工作,当我从 7.2 切换到 5.6 时它工作了。
【解决方案2】:

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

$name = 'String';

如果你把它当作一个数组来对待,它会给出致命错误:

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

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

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

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

【讨论】:

  • 或者声明这个$name = null
  • 我尝试了这个解决方案,但我仍然遇到同样的问题。我不熟悉PHP。 $taxquery = 数组(); get('tax_query'); $taxquery []= array('taxonomy' => 'product_type', 'field' => 'slug', 'terms' => 'auction', 'operator'=> 'NOT IN' );
  • $name = array();对我很有用。谢谢!
【解决方案3】:

Migrating from PHP 7.0.x to PHP 7.1.x/ 中描述了这种行为

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

在我的case 中,这只是一个初始化。我通过将$foo='' 替换为$foo=[] 来修复它。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      我也有类似的情况:

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

      【讨论】:

      • 没有。 $foo[] = 'test'; 在这种情况下不会抛出任何错误。 'string'"string" 在 PHP 中是等价的。
      【解决方案6】:

      解决了!

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

      【讨论】:

        【解决方案7】:

        我同意 Jeremy Young 对菲尔斯回答的评论:

        我发现这可能是与从 php 5 到 php 7。php 5 在是否 变量是数组还是不是 php 7。在大多数情况下,解决方案 是显式声明数组,如this answer中所述。

        我只是在将 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。显然不是“最佳实践”,我宁愿阅读和理解完整的代码。但需要快速修复。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-17
            • 2019-02-25
            • 1970-01-01
            • 2021-05-24
            • 2017-07-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多