8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

非法字符串偏移量警告 PHP

DarthGizka 1月前

119 0

将我的 php 版本更新到 5.4.0-3 后,我收到一个奇怪的 PHP 错误。我有这个数组:Array( [host] => 127.0.0.1 [port] => 11211) 当我尝试像这样访问它时,我收到奇怪的

将我的 php 版本更新到 5.4.0-3 后,出现一个奇怪的 PHP 错误。

我有这个数组:

Array
(
    [host] => 127.0.0.1
    [port] => 11211
)

当我尝试像这样访问它时,我收到奇怪的警告

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ...

我真的不想仅仅编辑我的 php.ini 并重新设置错误级别。

帖子版权声明 1、本帖标题:非法字符串偏移量警告 PHP
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由DarthGizka在本站《codeigniter》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 这是一个老问题,但希望有人能从中受益。如果数组为空,您也会收到此错误。

    就我的情况来说:

    $buyers_array = array();
    $buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
    ...
    echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 
    

    我将其改为:

    $buyers_array = array();
    $buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
    ...
    if(is_array($buyers_array)) {
       echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 
    } else {
       echo 'Buyers id ' . $this_buyer_id . ' not found';
    }
    
  • 以防万一它能帮助到任何人,我之所以收到此错误是因为我忘记反序列化已序列化的数组。如果它适用于您的情况,我肯定会检查这一点。

  • 就我而言:在获取数据库记录时,确保使用 result_array(); 而不是 row(); row_array();

  • rxon 1月前 0 只看Ta
    引用 5

    对于 PHP

    //Setup Array like so
    $memcachedConfig = array(
      "host" => "127.0.0.1",
      "port" => "11211"
    );
    
    //Always a good practice to check if empty
    
    if(isset($memcachedConfig['host']) && isset($memcachedConfig['port'])){
    
        //Some codes
    
        print_r ($memcachedConfig['host']);
        print_r ($memcachedConfig['port']);
    
    }
    

    只需确保检查返回的值不为空。所以这个例子是针对 PHP 的,因此找出如何在其他语言中检查数组是否为空。

  • 我认为出现此消息的唯一原因是目标数组实际上是一个类似字符串等的数组 (JSON -> {\'host\':\'127.0.0.1\'}) 变量

  • 我使用 trim() 函数解决了这个问题。问题出在空间上。

    所以让我们尝试一下

    $unit_size = []; //please declare the variable type 
    $unit_size = exolode("x", $unit_size);
    $width  = trim ($unit_size[1] );
    $height = trim ($unit_size[2] );
    

    我希望这对你有帮助。

  • 只需使用

    $memcachedConfig = array();
    

     print $memcachedConfig['host'];
     print $memcachedConfig['port'];
    
    
     Warning: Illegal string offset 'host' in ....
     Warning: Illegal string offset 'port' in ....
    

    这是因为您从未定义什么是 $memcachedConfig,所以默认情况下它按字符串而不是数组处理。

  • 它对我有用:

    我的测试代码:

    $var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
    foreach($var2 as $result)
    {  
        $test = $result['c'];
    }
    print_r($test);
    

    输出: 55

    大家检查一下。谢谢

  • 引用 10

    就我而言,当我更改执行 sql queryafter: return json_encode($array) then 的函数时,我解决了这个问题: return $array

  • 在我的例子中,我将 mysql_fetch_assoc 更改为 mysql_fetch_array 并解决。花了 3 天时间才解决 :-( 而我的项目的其他版本使用 fetch assoc 运行。

  • 引用 12

    在检查数组之前,请执行以下操作:

    if(!is_array($memcachedConfig))
         $memcachedConfig = array();
    
  • 从 PHP 5.4 开始,我们需要传递函数期望的相同数据类型值。例如:

    function testimonial($id); // This function expects $id as an integer
    

    调用此函数时,如果提供了如下字符串值:

    $id = $array['id']; // $id is of string type
    testimonial($id); // illegal offset warning
    

    由于数据类型不匹配,这将生成非法偏移警告。为了解决这个问题,你可以使用 settype :

    $id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
    testimonial($id); // now running smoothly
    
  • $varName 从一个应该是数组但可能为空字符串的值初始化,强制该值可以避免这种情况,例如:$varName = (array) $shouldBeArray

  • 这个问题有点晚了,但对于其他正在搜索的人来说:我通过使用错误的值(类型)进行初始化而收到此错误:

    $varName = '';
    $varName["x"] = "test"; // causes: Illegal string offset
    

    正确的做法是:

     $varName = array();
     $varName["x"] = "test"; // works
    
  • 我认为这应该是答案。这肯定是 5.4(以及 7 之前的版本)与 7 之间的区别。

  • 这里有很多很好的答案 - 但我发现我的问题要简单得多。

    我试图运行以下命令:

    $x['name']   = $j['name'];
    

    我之所以会遇到这个 illegal string 错误, $x['name'] 是因为我没有先定义数组。因此,在尝试将内容分配给之前,我输入了以下代码行 $x[]

    $x = array();
    

    并且它成功了。

  • 您尝试访问 a , string 就好像它是一个数组一样,而使用 a 的键 string . string 将无法理解这一点。在代码中我们可以看到问题:

    "hello"["hello"];
    // PHP Warning:  Illegal string offset 'hello' in php shell code on line 1
    
    "hello"[0];
    // No errors.
    
    array("hello" => "val")["hello"];
    // No errors. This is *probably* what you wanted.
    

    深入了解

    让我们看看那个错误:

    警告:非法字符串偏移量‘port’在...

    它说了什么?它说我们正尝试使用字符串 'port' 作为字符串的偏移量。像这样:

    $a_string = "string";
    
    // This is ok:
    echo $a_string[0]; // s
    echo $a_string[1]; // t
    echo $a_string[2]; // r
    // ...
    
    // !! Not good:
    echo $a_string['port'];
    // !! Warning: Illegal string offset 'port' in ...
    

    是什么原因造成的?

    由于某种原因,您期望的是 array ,但得到的是 string 。这只是一个混淆。也许您的变量被更改了,也许它从来都不是 array ,这真的不重要。

    我们能做什么?

    如果我们 知道 应该有 array ,我们应该做一些基本的调试来确定为什么我们没有 array 。如果我们不知道我们是否会有 array string ,事情就会变得有点棘手。

    我们 可以 做的是进行各种检查,以确保我们没有收到诸如 is_array isset or array_key_exists :

    $a_string = "string";
    $an_array = array('port' => 'the_port');
    
    if (is_array($a_string) && isset($a_string['port'])) {
        // No problem, we'll never get here.
        echo $a_string['port'];
    }
    
    if (is_array($an_array) && isset($an_array['port'])) {
        // Ok!
        echo $an_array['port']; // the_port
    }
    
    if (is_array($an_array) && isset($an_array['unset_key'])) {
        // No problem again, we won't enter.
        echo $an_array['unset_key'];
    }
    
    
    // Similar, but with array_key_exists
    if (is_array($an_array) && array_key_exists('port', $an_array)) {
        // Ok!
        echo $an_array['port']; // the_port
    }
    

    isset 之间有一些细微的差别 array_key_exists 。例如,如果 $array['key'] is null , isset 返回 false . array_key_exists ,则只会检查键 exists .

  • 出现此错误时,请向后查看变量的定义位置。 在我的例子中,错误是使用 $tables = array_fill_keys( $keys, '' ),然后是 $tables[$key]['name'] = 'something' - 这是不规范的,因为 $table[$key] 不是数组而是字符串。

  • 我不小心在代码的另一部分使用了相同的 $variablename = []; 两次,其中 $variablename = \'test\'; 这导致了错误消息。

返回
作者最近主题: