如何解决 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 中使用了<input name='C[]'
。这会在发送表单时在 PHP 中创建一个数组。
您正在使用 echo $_POST['C'];
回显该数组 - 这不起作用,而是发出该通知和单词“Array”。
根据您对其余代码所做的操作,您可能应该使用echo $_POST['C'][0];
【讨论】:
【参考方案3】:PHP 通知的含义以及如何重现它:
如果您将 PHP 数组发送到需要字符串的函数,例如:echo
或 print
,那么 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 中是错误的,而不是通知,并阻止进一步的代码执行。
在数组上使用print
、echo
不再是一种选择。
抑制错误和通知不是一个好习惯,尤其是在开发环境中并且仍在调试代码时。
使用var_dump
,print_r
,使用foreach
或for
遍历输入值,以输出声明为输入数组的名称的输入数据('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 错误“注意:数组到字符串的转换...”的主要内容,如果未能解决你的问题,请参考以下文章