ข้อคำแนะนำจากผู้เชี่ยวชาญด้าน php หน่อยครับ

เริ่มโดย worldwidewsc, 21 สิงหาคม 2017, 14:16:42

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

worldwidewsc

เนื่องมาจากผมอัพเดท เวอร์ชั่น php แล้วทำให้โค้ด php บางจุดเกิดเอ่อเร่อ ตามด้านล่างนี้ ต้องแก้ยังไงครับ

Warning: Invalid argument supplied for foreach()

เป็นระบบที่ใช้กันภายในออฟฟิตซึ่งทำขึ้นมาด้วย ภาษา php ทั้งหมดครับ

:wanwan005: :wanwan005:

smapan

เป็นไปได้ว่า หลังเปลี่ยน version PHP แล้ว
object ที่รับเข้ามายัง foreach() มันจะผิดพลาด

ลอง ดูว่าตอนเข้ามาครบรึเปล่า ถ้าไม่ครบ ก็เป็นตรงนี้แหละ ...
(จะครบได้ไง ก็ error อยู่  :P)
[direct=http://cp.siamhostweb.com/cart.php?gid=1]จูมล่าโฮส สยามโฮสเว็บ[/direct] [direct=http://www.modty.com]modty.com[/direct]
[direct=http://www.apartment.in.th]รวมที่พัก เช่ารายวัน ที่พักเช่ารายเดือนมากที่สุดแจ่มจริง[/direct]
***Tel 083-757-1515 ติดปัญหา Joomla ตรงไหนรับปรึกษาฟรี โทรมาเถอะครับ ถ้าตอบได้ช่วยแน่นอน ไม่มีกั้ก. ***

kondam

ผมเองก็มือใหม่ครับ

แนะนำ
http://php.net/manual/en/control-structures.foreach.php
เขาบอกเวอร์ชั่นของโค้ดที่รองรับด้วย
ขอแนะนำ : :wanwan034:

1. จดโดเมน ต่ออายุ godaddy ลด 40% ถูกที่สุดในตอนนี้! [direct=http://bit.ly/2HhtxzY]คลิก[/direct]

2.จดโดเมน + private 8.88$ [namecheap]   [direct=http://bit.ly/2kuZoG4]คลิก[/direct]

3.แนะนำคลาวด์โฮสติ้งไทย ที่ผมใช้อยู่ [Thaidata]   [direct=https://goo.gl/Jvpgzs]คลิก[/direct]

tanat29

ลองไปโพสถามใน Thaicreate ดูก็ได้ครับ 

เด่วนี้ Php ปัญหาเยอะ แนะนำใช้ Docker ช่วยครับ

ปล. ผมว่าถ้าไม่จำเป็นต้องใช้ Php ผมว่าไปใช้พวก Ruby , Python นี้น่าจะสะดวกกว่า

sputtaro

อ้างถึงจาก: smapan ใน 21 สิงหาคม 2017, 14:19:45
เป็นไปได้ว่า หลังเปลี่ยน version PHP แล้ว
object ที่รับเข้ามายัง foreach() มันจะผิดพลาด

ลอง ดูว่าตอนเข้ามาครบรึเปล่า ถ้าไม่ครบ ก็เป็นตรงนี้แหละ ...
(จะครบได้ไง ก็ error อยู่  :P)

ตามท่านนี้ว่ามาเลยครับ
ส่วนใหญ่ปัญหานี้จะเกิดจากการเขียนโค๊ดแบบง่ายๆแบบดั้งเดิมที่ PHP ผ่อนปรมค่อนข้างมาก

เมื่อเข้มงวดการเขียนโค๊ดขึ้นมาในเวอร์ชั่นใหม่ (V7) คนที่เคยเขียนแบบเดิมจึงมักจะเกิดปัญหา
โดยการกลับไปแก้ไขของเก่า ไม่งั้นจะใช้ไม่ได้

กรณีของคุณลองเช็คค่าว่าใน loop นั้นต้องมีค่า(object...)อะไรมาเกี่ยวข้องบ้าง
เช่น เมื่อพบ ของเดิมเป็น
if($object){

ลองใส่ประมาณ if(isset($object)){
เป็นตัวอย่างนะครับ

นอกเหนือจากนี้ก็ลองเช็คดูว่า Version ใหม่ ที่คุณใช้ ได้ยกเลิกฟังชั่นเก่าตัวไหนไปบ้าง
เผลอๆ อาจมีอีกหลายจุดที่ต้องกลับไปแก้ไข

หวังว่าจะพอช่วยได้บ้าง

worldwidewsc

ขอบคุณทุกคำแนะนำ จะลองหาทางปรับแก้ครับ ปล. หากแก้ได้หรือใช้โดยวิธีไหนจะนำมาแจ้งให้ทราบเพื่อเป็นกราบอกกล่าวให้ท่านที่เจอปัญหาได้นำไปแก้ไขต่อไปครับ (แต่ตอนนี้ยัง เอ่อเร่ออยู่  :wanwan009::wanwan014: :wanwan014:

insidecom

อ้างถึงจาก: worldwidewsc ใน 21 สิงหาคม 2017, 14:16:42
เนื่องมาจากผมอัพเดท เวอร์ชั่น php แล้วทำให้โค้ด php บางจุดเกิดเอ่อเร่อ ตามด้านล่างนี้ ต้องแก้ยังไงครับ

Warning: Invalid argument supplied for foreach()

เป็นระบบที่ใช้กันภายในออฟฟิตซึ่งทำขึ้นมาด้วย ภาษา php ทั้งหมดครับ

:wanwan005: :wanwan005:

ให้เช็คตัวแปร Array ว่ามีข้อมูลอยู่หรือเปล่า หรือ ตัวแปรที่จะเข้า foreach ไม่ใช่ Array 

if (is_array($values) || is_object($values))
{
    foreach ($values as $value)
    {
        ...
    }
}

หรือ

if (count($values) >0)
{
    foreach ($values as $value)
    {
        ...
    }
}

buakaew

Affiliate ไทยจ่ายจริงกินหลายชั้นลึกหลากหลายผลิตภัณฑ์[direct=https://affiliateinthai.blogspot.com/]Affiliate ไทย[/direct]
รีวิว คูปองฟรี Hosting ไทยและเทศ[direct=https://www.hostingdee.com/]รีวิว Hosting[/direct]
ดูดวงออนไลน์ฟรี[direct=https://duduangfree.com/]ดูดวง[/direct]
พระเครื่องออนไลน์[direct=http://www.siampraboran.com/]พระเครื่อง[/direct]


esanza.com

อ้างถึงจาก: insidecom ใน 21 สิงหาคม 2017, 16:18:45
อ้างถึงจาก: worldwidewsc ใน 21 สิงหาคม 2017, 14:16:42
เนื่องมาจากผมอัพเดท เวอร์ชั่น php แล้วทำให้โค้ด php บางจุดเกิดเอ่อเร่อ ตามด้านล่างนี้ ต้องแก้ยังไงครับ

Warning: Invalid argument supplied for foreach()

เป็นระบบที่ใช้กันภายในออฟฟิตซึ่งทำขึ้นมาด้วย ภาษา php ทั้งหมดครับ

:wanwan005: :wanwan005:

ให้เช็คตัวแปร Array ว่ามีข้อมูลอยู่หรือเปล่า หรือ ตัวแปรที่จะเข้า foreach ไม่ใช่ Array 

if (is_array($values) || is_object($values))
{
    foreach ($values as $value)
    {
        ...
    }
}

หรือ

if (count($values) >0)
{
    foreach ($values as $value)
    {
        ...
    }
}


ถ้าตัวแปรมีค่าว่าง แล้ววิ่งเข้า foreach  เกิด Error แน่นอนครับ
ต้องเช็คค่าว่างก่อนส่งเข้าไป foreach  ครับ  :wanwan016:
ใครต้องการเช่าโฮสที่มี Control Panel ดีๆ
และ Support ดี แนะนำ => [direct=https://support.hostatom.com/aff.php?aff=456]โฮสอะตอม[/direct]

goragod

วิธีที่ถูกต้องที่สุดคือ ตรวจสอบย้อนกลับไปว่า ตัวแปรที่ส่งให้กับ foreach คืออะไร เพราะถ้าให้เดา (จากข้อมูลเท่าที่มี) คือการประมวลผลก่อนหน้าไม่สำเร็จ ควรแก้ไขให้การประมวลผลก่อนหน้าเรียบร้อยเสียก่อน ซึ่งถ้าตัวแปรดังกล่าวมีข้อมูลถูกต้อง ก็จะไม่มีปัญหาในการส่งค่าให้กับ foreach

ยกตัวอย่างที่เจอบ่อยๆ คือมีการใช้ @ กับตัวแปรก่อนหน้า

$array = @function();

ซึ่งถ้าเกิดข้อผิดพลาดมันจะคืนค่า false กลับมา และเมื่อส่งให้ foreach จะ error แน่นอน

ก็อาจใช้วิธี ตรวจสอบว่า ไม่ใช่ False ก็ได้

if ($array !== false){
  foreach($array as $key => $value){
  }
}

จริงๆ การใช้ is_array() หรือ is_object() ก็ใช้งานได้แต่ไม่จำเป็นต้องตรวจทั้งสองอย่าง เพราะปกติถ้ามันไม่เป็น array ก็ต้องเป็น object อยู่แล้ว

การใช้ count() ไม่จำเป็น เพราะถึงแม้จะเป็นแอเรย์ว่างๆ ก็ยังส่งเข้า foreach ได้ (ขอแค่เป็นแอเรย์) แต่ถ้าอยากจะใช้แนะนำให้ใช้ is_empty() จะดีกว่า เพราะมันสามารถตรวจสอบได้ทั้ง false null และ empty

infamous

1. เกิดจากไม่ได้ประกาศค่าของตัวแปรเบื้องต้นไว้ก่อนเข้า logic
2. เกิดจากตัวแปรไม่สามารถใช้งานได้กับโครงสร้างของ foreach loop

ลองทดสอบโค๊ดได้เพิ่มเติมที่ http://phptester.net/

worldwidewsc

ขอบคุณทุกคำแนะนำนะครับ ตอนนี้สามารถแก้ได้แล้วครับ ปัญหาเกิดจากค่าส่ง และค่ารับใน foreach ไม่ตรงกัน ลองนั่งไล่โค้ดดูใหม่ทั้งหมดเลยเจอ ตอนนี้แก้ไขแล้วเรียบร้อย