วิธีแก้ข้อผิดพลาด PHP 'หมายเหตุ: การแปลงอาร์เรย์เป็นสตริงใน ... '


117

ฉันมีไฟล์ 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]แทน?
Amal Murali

var_dump($Texting)กรุณาแสดง
Barmar

1
สวัสดี ... บรรทัดที่ 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"} ..
t4thilina

คำตอบ:


110

เมื่อคุณมีอินพุต HTML จำนวนมากที่ตั้งชื่อC[]สิ่งที่คุณได้รับในอาร์เรย์ POST ที่ปลายอีกด้านหนึ่งคืออาร์เรย์ของค่าเหล่านี้ใน$_POST['C']. เมื่อเป็นเช่นechoนั้นคุณกำลังพยายามพิมพ์อาร์เรย์ดังนั้นสิ่งที่ต้องทำก็คือการพิมพ์Arrayและประกาศ

ในการพิมพ์อย่างถูกต้องอาร์เรย์คุณห่วงทั้งผ่านมันและแต่ละองค์ประกอบหรือคุณสามารถใช้echoprint_r

หรือหากคุณไม่รู้ว่าเป็นอาร์เรย์หรือสตริงหรืออะไรก็ตามคุณสามารถใช้var_dump($var)ซึ่งจะบอกคุณได้ว่าเป็นประเภทใดและเนื้อหาคืออะไร ใช้เพื่อวัตถุประสงค์ในการดีบักเท่านั้น


K ขอบคุณมากสำหรับคำอธิบายที่ชัดเจนของคุณ มันพิมพ์ออกมาว่าคุณพูดอะไรกันแน่ หมายความว่าอาร์เรย์ของฉันถูกส่งไปยังไฟล์ PHP แล้ว ดูเหมือนว่าฉันสามารถใช้ได้โดยไม่มีปัญหาใด ๆ Thankz อีกครั้ง.
t4thilina

56

ความหมายของประกาศ 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ไปที่ stdout จากนั้นบันทึกประกาศไปยัง stderr และดำเนินการต่อไป

อีกตัวอย่างหนึ่งในสคริปต์ PHP:

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

คุณมี 2 ตัวเลือกเช่นแคสต์อาร์เรย์ PHP ของคุณเป็น String โดยใช้อาร์เรย์เพื่อแปลงสตริงหรือระงับประกาศ PHP

การแก้ไข 1: ใช้ฟังก์ชัน php ในตัว print_r หรือ var_dump:

http://php.net/manual/en/function.print-r.phpหรือhttp://php.net/manual/en/function.var-dump.php

$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)
}

การแก้ไข 2: ใช้ json_encode เพื่อยุบอาร์เรย์เป็นสตริง json:

$stuff = array(1,2,3);
print json_encode($stuff);   //Prints [1,2,3]

การแก้ไข 3: การรวมเซลล์ทั้งหมดในอาร์เรย์เข้าด้วยกัน:

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

การแก้ไข 4: ระงับการแจ้งเตือน:

error_reporting(0);
print(array(1,2,3));    //Prints 'Array' without a Notice.

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ช่วยฉันอย่างมาก ฉันต้องใช้ 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-48-48b31-481 a23d-6608c696f264 "," system_rundate ":" 2019-04-27T22: 46: 07.090Z "}]
แอนดรูว์

5

คุณกำลังใช้<input name='C[]'ใน HTML ของคุณ สิ่งนี้จะสร้างอาร์เรย์ใน PHP เมื่อส่งแบบฟอร์ม

คุณกำลังใช้echo $_POST['C'];เพื่อสะท้อนอาร์เรย์นั้น - สิ่งนี้จะไม่ได้ผล แต่จะส่งเสียงประกาศนั้นและคำว่า "Array" แทน

ขึ้นอยู่กับสิ่งที่คุณทำกับโค้ดที่เหลือคุณควรใช้ echo $_POST['C'][0];


3

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['G'])){
        echo $_POST['C'];
    }

  }catch(Exception $e){

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.