如何解决 PHP 错误“注意:数组到字符串的转换...”

Posted

技术标签:

【中文标题】如何解决 PHP 错误“注意:数组到字符串的转换...”【英文标题】:How to solve PHP error 'Notice: Array to string conversion in...' 【发布时间】:2013-11-29 19:26:34 【问题描述】:

我有一个 php 文件尝试回显 $_POST,但出现错误,代码如下:

echo "<html>";
echo "<body>";
for($i=0; $i<5;$i++)
    echo "<input name='C[]' value='$Texting[$i]' " . 
         "style='background-color:#D0A9F5;'></input>";


echo "</body>";
echo "</html>";
echo '<input type="submit" value="Save The Table" name="G"></input>'

这是回显 POST 的代码。

if(!empty($_POST['G']))
    echo $_POST['C'];

但是当代码运行时,我收到如下错误:

Notice: Array to string conversion in 
C:\xampp\htdocs\PHIS\FinalSubmissionOfTheFormPHP.php on line 8

这个错误是什么意思,我该如何解决?

【问题讨论】:

第8行是哪一个? $Texting[i] 是错字吗?那不应该是$Texting[$i]吗? 请出示var_dump($Texting) 嗨... 第 8 行的意思是,回显 $_POST['C']。而 var_dump($_POST['C']) 是 Arrayarray(3) [0]=> string(1) "A" [1]=> string(4) "Male" [2]=> string(6) “女性” 。而 var_dump($Texting) 是 array(3) [0]=> string(1) "A" [1]=> string(4) "Male" [2]=> string(6) "Female" 。 .. "How does the SQL injection from the "Bobby Tables" XKCD comic work?", "How can I prevent SQL injection in PHP?" 【参考方案1】:

当您有许多名为C[] 的HTML 输入时,您在另一端的POST 数组中得到的是$_POST['C'] 中这些值的数组。所以当你echo 时,你正在尝试打印一个数组,所以它所做的只是打印Array 和一个通知。

要正确打印数组,您可以循环遍历它并echo 每个元素,也可以使用print_r

或者,如果您不知道它是数组还是字符串或其他什么,您可以使用var_dump($var),它会告诉您它是什么类型以及它的内容是什么。仅用于调试目的。

【讨论】:

K 非常感谢您的清晰解释。它会打印出您所说的内容。这意味着我的数组已经发送到 PHP 文件。看来我可以毫无问题地使用。再次感谢。【参考方案2】:

您在 HTML 中使用了&lt;input name='C[]'。这会在发送表单时在 PHP 中创建一个数组。

您正在使用 echo $_POST['C']; 回显该数组 - 这不起作用,而是发出该通知和单词“Array”。

根据您对其余代码所做的操作,您可能应该使用echo $_POST['C'][0];

【讨论】:

【参考方案3】:

PHP 通知的含义以及如何重现它:

如果您将 PHP 数组发送到需要字符串的函数,例如:echoprint,那么 PHP 解释器会将您的数组转换为文字字符串 Array,请抛出此通知并继续。例如:

php> print(array(1,2,3))

PHP Notice:  Array to string conversion in 
/usr/local/lib/python2.7/dist-packages/phpsh/phpsh.php(591) :
eval()'d code on line 1
Array

在这种情况下,函数print 将文字字符串:Array 转储到标准输出,然后将通知记录到标准错误并继续。

PHP 脚本中的另一个示例:

<?php
    $stuff = array(1,2,3);
    print $stuff;  //PHP Notice:  Array to string conversion in yourfile on line 3
?>

更正1:使用foreach循环访问数组元素

http://php.net/foreach

$stuff = array(1,2,3);
foreach ($stuff as $value) 
    echo $value, "\n";

打印:

1
2
3

或与数组键一起

$stuff = array('name' => 'Joe', 'email' => 'joe@example.com');
foreach ($stuff as $key => $value) 
    echo "$key: $value\n";

打印:

name: Joe
email: joe@example.com

请注意,数组元素也可以是数组。在这种情况下,要么再次使用foreach,要么使用数组语法访问这个内部数组元素,例如$row['name']

更正2:将数组中的所有单元格连接在一起:

如果它只是一个普通的一维数组,您可以使用分隔符将所有单元格简单地连接成一个字符串:

<?php
    $stuff = array(1,2,3);
    print implode(", ", $stuff);    //prints 1, 2, 3
    print join(',', $stuff);        //prints 1,2,3

更正3:对结构复杂的数组进行字符串化:

如果您的数组结构复杂,但无论如何您都需要将其转换为字符串,请使用http://php.net/json_encode

$stuff = array('name' => 'Joe', 'email' => 'joe@example.com');
print json_encode($stuff);

打印

"name":"Joe","email":"joe@example.com"

快速了解数组结构:使用内置 php 函数

如果您只想检查数组内容以进行调试,请使用以下函数之一。请记住,var_dump 是其中信息最丰富的,因此通常是首选

http://php.net/print_r http://php.net/var_dump http://php.net/var_export

例子

$stuff = array(1,2,3);
print_r($stuff);
$stuff = array(3,4,5);
var_dump($stuff);

打印:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
array(3) 
  [0]=>
  int(3)
  [1]=>
  int(4)
  [2]=>
  int(5)

【讨论】:

这应该是公认的答案。极大地帮助了我。我还必须在这个答案中使用 json_encode。 print_r ( json_encode ( $AuthData ) );结果与此类似: ["system_id":"61a694d0-3605-4502-952b-38d87b451a56","system_auth_id":"caa5906f-d9ae-4297-8e9f-5ea8d9ed8b51","system_lastauth_id":"ace681bb-48f5-4831- a23d-6608c696f264","system_rundate":"2019-04-27T22:46:07.090Z"] 鉴于此问题被用作规范副本,我冒昧地添加了一些实际示例,因为简单地转储数组内容很少成为目标。【参考方案4】:

Array to string conversion 在最新版本的 php 7.x 中是错误的,而不是通知,并阻止进一步的代码执行。

在数组上使用printecho 不再是一种选择。

抑制错误和通知不是一个好习惯,尤其是在开发环境中并且仍在调试代码时。

使用var_dump,print_r,使用foreachfor 遍历输入值,以输出声明为输入数组的名称的输入数据('name[]')

捕获错误的最常见做法是使用try/catch 块,这有助于我们防止代码执行中断,这可能导致try 块中包含可能的错误。

  try  //wrap around possible cause of error or notice
    
    if(!empty($_POST['C']))
        echo $_POST['C'];
    

  catch(Exception $e)

    //handle the error message $e->getMessage();
  

【讨论】:

那将是一个非常的坏主意。在这个错误中没有什么可以“处理”的。它必须立即修复。在这里添加 try catch 绝对没有意义。【参考方案5】:
<?php
ob_start();
var_dump($_POST['C']);
$result = ob_get_clean();
?>

如果你想在变量中捕获结果

【讨论】:

以上是关于如何解决 PHP 错误“注意:数组到字符串的转换...”的主要内容,如果未能解决你的问题,请参考以下文章

PHP表单返回注意事项:数组到字符串的转换

Symfony - 字符串字段中的持久数组

如何解决使用php发送邮件的错误

如何解决 php artisan key 生成错误?

PHP & mySQL:2038 年错误:它是啥?如何解决?

执行php.exe程序cli提示错误如何解决