【问题标题】:PHP list() error: "Undefined offset"PHP list() 错误:“未定义的偏移量”
【发布时间】:2017-11-07 21:05:57
【问题描述】:

我正在处理一个系统,它会将任何意外错误以错误类型、消息和详细信息的字符串形式发回给我,例如:

      Error Type - Database
      Error Message - Error Executing Database Query.
      Error Detail - [Macromedia][SQLServer JDBC Driver][SQLServer]String or binary data would be truncated. 

现在为了创建更好的 UI,我需要处理这些错误,所以我想到了 explode(),发现 this user's response in the PHP Manual 帮助我用两个分隔符而不是一个分隔符来分隔结果:

然后我需要更深入地研究代码,因为我想要 $key => $val 对,所以我遇到了this answer on StackOverflow

然后我将两者结合起来并遇到了这个解决方案:

private function string_to_array( $delimiters, $string )
{
    // start by replacing the $delimiters
    $ready = str_replace( $delimiters, $delimiters[0], $string );
    
    // create new list() item:
    // $key => $value
    list( $err_typ,     $err_typ_cont,
          $err_mess,    $err_mess_cont,
          $err_det,     $err_det_cont ) = explode( $delimiters[0], $ready ); # line 238
    
    $result[ trim( $err_typ ) ]     = trim ( $err_typ_cont );
    $result[ trim( $err_mess ) ]    = trim ( $err_mess_cont );
    $result[ trim( $err_det ) ]     = trim ( $err_det_cont );
    
    return $result;
}

要调用我正在使用的函数array('-', PHP_EOL)$delimiters$string 是作为string 的错误消息


当我在字符串中插入一个随机错误并调用该函数时,它工作得非常好。但是,当我从服务器触发随机错误时,我开始遇到问题,特别是 Undefined offset 用于我的 list() 函数

PHP 错误

<br />
<b>Notice</b>:  Undefined offset: 5 in <b>C:\xampp\htdocs\application\_backend\class\class.program.php</b> on line <b>238</b><br />
<br />
<b>Notice</b>:  Undefined offset: 4 in <b>C:\xampp\htdocs\application\_backend\class\class.program.php</b> on line <b>238</b><br />

另外,请注意数组的出现很奇怪和错误:

以数组格式响应

Array
(
    [Error Type] => Database
          Error Message
    [Error Executing Database Query.
          Error Detail] => [Macromedia][SQLServer JDBC Driver][SQLServer]String or binary data would be truncated.
    [] => 
)

这与我在上面看到的错误相同。

我该如何解决这个问题?我在这里错过了什么?

【问题讨论】:

  • 我只能想象调整$string$ready的内容实际上不能爆炸成6个项目......就像分隔符不匹配一样。你能在爆炸前把它们都 print_r() 来调试他们认为自己拥有的东西吗?
  • @Randall 实际上我可以:Error Type - Database Error Message - Error Executing Database Query. Error Detail - [Macromedia][SQLServer JDBC Driver][SQLServer]String or binary data would be truncated.
  • @Randall 这将与顶部的错误相同
  • 我在想 PHP_EOL 认为的返回值,而不是 $string 中的内容,因此它只是没有用破折号 str_replaceing 它们?
  • 您使用的 API 可能不是用 PHP 编写的,因此它没有使用与 PHP 相同的换行符约定。

标签: php arrays error-handling


【解决方案1】:

您正在处理的系统显然使用了与运行 PHP 脚本的系统不同的换行符。我建议你处理所有类型的换行符:

$delimiters = array('-', "\r\n", "\n", "\r");

【讨论】:

  • "chr(13)" 添加到该数组的末尾。为了预防起见,在str_replace:$string = preg_replace("/(-){2,}/","-",$string); 之后运行此命令以将多个破折号截断为 1。
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多