【问题标题】:What causes: "Notice: Uninitialized string offset" to appear? [closed]什么原因导致:出现“注意:未初始化的字符串偏移”? [关闭]
【发布时间】:2010-11-18 19:35:51
【问题描述】:

我有一个用户填写的表单,表单上有多个相同的字段,例如“项目名称”、“项目日期”、“类别”等。根据用户提交的表单数量,我的目标是:

  1. 循环表单的数量
  2. 创建单独的 SQL 插入语句

但是,PHP 向我抛出了一个我似乎不明白的通知:

注意:

注意:未初始化的字符串偏移量:1 ...dataPasser.php 在第 90 行

PHP

$myQuery = array();

if ($varsCount != 0)
{
  for ($i=0; $i <= $varsCount; $i++)
  {
    $var = "insert into projectData values ('" . $catagory[$i] . "', '" .  $task[$i] . "', '" . $fullText[$i] . "', '" . $dueDate[$i] . "', null, '" . $empId[$i] ."')";
    array_push($myQuery, $var);     
  }
}

我遇到了这个问题的参考资料,但它们并不准确,我无法推断出实际问题的根源。我将不胜感激任何帮助了解导致数组无法正确初始化的原因。

【问题讨论】:

  • 您在示例中遗漏了很多内容,但是 var_dump($myQuery) 的输出是什么?
  • 第 90 行在哪里,完整的通知是什么?
  • 我只是想补充一点,您根本不需要在这里使用array_push。就这样做吧。 $myQuery[] = $var;
  • 这个问题已经结束,但也许我可以帮助任何喜欢我的人,因为在动态调用一个数组(或实现 ArrayAccess)的类属性时忘记包含大括号而出现此错误同时访问其元素之一。例如。 $this-&gt;$arrayMember[$index] 将首先评估 $arrayMember[$index];所以像这样明确地表示动态成员名称部分:$this-&gt;{$arrayMember}[$index].

标签: php arrays


【解决方案1】:

如果以下任何变量实际上是字符串或 null 而不是数组,则会发生此错误,在这种情况下,使用数组语法 $var[$i] 访问它们就像尝试访问字符串中的特定字符:

$catagory
$task
$fullText
$dueDate
$empId

简而言之,插入查询中的所有内容。

也许$catagory 变量拼写错误?

【讨论】:

  • 伙计,我只想踢自己的头。当然!只有 1 个唯一的 $empId。我专注于 $myQuery 数组,而我没有注意到其他数组。非常感谢!我将 $empID[$i] 更改为 $empId 并且通知消失了,因为 $empId 不是数组。
  • 我认为这里的部分困惑是,当索引$var[$i] 时,它可能是一个字符串或一个数组......
  • +1 完美答案 (Y) ... !
【解决方案2】:

这意味着您的数组之一实际上不是数组。

顺便说一句,您的 if 检查是不必要的。如果 $varsCount 为 0,则 for 循环无论如何都不会执行。

【讨论】:

  • 是的,我以前看过这个评论。不幸的是,我不明白它怎么不是一个数组?我将数据输出到 FirePHP 中,我通过 POST 看到它,然后也在变量中看到它。
  • 好的,谢谢,为了便于阅读,我只发布了部分代码。再次感谢!
【解决方案3】:

当您迭代数组的次数大于数组的实际大小时,可能会出现该错误。例如:

 $one="909";
 for($i=0;$i<10;$i++)
    echo ' '.$one[$i];

将显示错误。 第一种情况你可以采用 i 的 mod .. 例如

function mod($i,$length){
  $m = $i % $size;
  if ($m > $size)
  mod($m,$size)
  return $m;
}

for($i=0;$i<10;$i++)
{
  $k=mod($i,3);
  echo ' '.$one[$k];
}

或者它可能不是一个数组(可能它是一个值并且您尝试像访问数组一样访问它) 例如:

$k = 2;
$k[0];

【讨论】:

    【解决方案4】:

    在使用数组之前尝试测试和初始化它们:

    if( !isset($catagory[$i]) ) $catagory[$i] = '' ;
    if( !isset($task[$i]) ) $task[$i] = '' ;
    if( !isset($fullText[$i]) ) $fullText[$i] = '' ;
    if( !isset($dueDate[$i]) ) $dueDate[$i] = '' ;
    if( !isset($empId[$i]) ) $empId[$i] = '' ;
    

    如果$catagory[$i] 不存在,则创建(未初始化)一个...仅此而已; => PHP 尝试在地址$i 中读取您的表格,但是在这个地址,什么都没有,这个地址不存在 => PHP 返回一个通知,它没有给您的字符串。 所以你的代码不是很干净,它占用了一些资源,降低了服务器的性能(只是一点点)。

    注意你的 MySQL 表默认值

    if( !isset($dueDate[$i]) ) $dueDate[$i] = '0000-00-00 00:00:00' ;
    

    if( !isset($dueDate[$i]) ) $dueDate[$i] = 'NULL' ;
    

    【讨论】:

    • 对,但是如果它应该是一个数组,if(!isset($myarray[$i])) $myarray[$i]=array(); 可能呢?
    【解决方案5】:

    使用

    查看数组的内容
    echo '<pre>' . print_r( $arr, TRUE ) . '</pre>';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2012-09-21
      相关资源
      最近更新 更多