ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์CMS & Free Scriptข้อคำแนะนำจากผู้เชี่ยวชาญด้าน php หน่อยครับ
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: ข้อคำแนะนำจากผู้เชี่ยวชาญด้าน php หน่อยครับ  (อ่าน 1277 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
worldwidewsc
Newbie
*

พลังน้ำใจ: 0
ออฟไลน์ ออฟไลน์

กระทู้: 22



ดูรายละเอียด
« เมื่อ: 21 สิงหาคม 2017, 14:16:42 »

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

Warning: Invalid argument supplied for foreach()

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

 wanwan005 wanwan005
บันทึกการเข้า
smapan
Global Moderator
เจ้าพ่อบอร์ดเสียว
*****

พลังน้ำใจ: 643
ออฟไลน์ ออฟไลน์

กระทู้: 8,272



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 21 สิงหาคม 2017, 14:19:45 »

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

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

จูมล่าโฮส สยามโฮสเว็บ modty.com
รวมที่พัก เช่ารายวัน ที่พักเช่ารายเดือนมากที่สุดแจ่มจริง
***Tel 083-757-1515 ติดปัญหา Joomla ตรงไหนรับปรึกษาฟรี โทรมาเถอะครับ ถ้าตอบได้ช่วยแน่นอน ไม่มีกั้ก. ***
kondam
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 532
ออฟไลน์ ออฟไลน์

กระทู้: 6,137



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 21 สิงหาคม 2017, 14:21:46 »

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

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

ขอแนะนำ : wanwan034

1. จดโดเมน ต่ออายุ godaddy ลด 40% ถูกที่สุดในตอนนี้! คลิก

2.จดโดเมน + private 8.88$ [namecheap]   คลิก

3.แนะนำคลาวด์โฮสติ้งไทย ที่ผมใช้อยู่ [Thaidata]   คลิก
tanat29
ก๊วนเสียว
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 407



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 21 สิงหาคม 2017, 14:42:02 »

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

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

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

sputtaro
สมุนแก๊งเสียว
*

พลังน้ำใจ: 139
ออฟไลน์ ออฟไลน์

กระทู้: 910



ดูรายละเอียด
« ตอบ #4 เมื่อ: 21 สิงหาคม 2017, 15:13:27 »

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

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

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

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

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

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

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

หวังว่าจะพอช่วยได้บ้าง
บันทึกการเข้า
worldwidewsc
Newbie
*

พลังน้ำใจ: 0
ออฟไลน์ ออฟไลน์

กระทู้: 22



ดูรายละเอียด
« ตอบ #5 เมื่อ: 21 สิงหาคม 2017, 16:01:37 »

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

พลังน้ำใจ: 36
ออฟไลน์ ออฟไลน์

กระทู้: 706



ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: 21 สิงหาคม 2017, 16:18:45 »

เนื่องมาจากผมอัพเดท เวอร์ชั่น 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
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 41
ออฟไลน์ ออฟไลน์

กระทู้: 1,365



ดูรายละเอียด เว็บไซต์
« ตอบ #7 เมื่อ: 21 สิงหาคม 2017, 16:59:40 »

มารอดูเซียน  wanwan011
บันทึกการเข้า

Affiliate ไทยจ่ายจริงกินหลายชั้นลึกหลากหลายผลิตภัณฑ์Affiliate ไทย
รีวิว คูปองฟรี Hosting ไทยและเทศรีวิว Hosting
ดูดวงออนไลน์ฟรีดูดวง
พระเครื่องออนไลน์พระเครื่อง

esanza.com
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 270
ออฟไลน์ ออฟไลน์

กระทู้: 3,673



ดูรายละเอียด
« ตอบ #8 เมื่อ: 21 สิงหาคม 2017, 17:01:49 »

เนื่องมาจากผมอัพเดท เวอร์ชั่น 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 ดี แนะนำ => โฮสอะตอม
goragod
ก๊วนเสียว
*

พลังน้ำใจ: 45
ออฟไลน์ ออฟไลน์

กระทู้: 221



ดูรายละเอียด
« ตอบ #9 เมื่อ: 22 สิงหาคม 2017, 10:36:06 »

วิธีที่ถูกต้องที่สุดคือ ตรวจสอบย้อนกลับไปว่า ตัวแปรที่ส่งให้กับ 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
ก๊วนเสียว
*

พลังน้ำใจ: 14
ออฟไลน์ ออฟไลน์

กระทู้: 295



ดูรายละเอียด
« ตอบ #10 เมื่อ: 22 สิงหาคม 2017, 11:42:55 »

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

ลองทดสอบโค๊ดได้เพิ่มเติมที่ http://phptester.net/
บันทึกการเข้า
worldwidewsc
Newbie
*

พลังน้ำใจ: 0
ออฟไลน์ ออฟไลน์

กระทู้: 22



ดูรายละเอียด
« ตอบ #11 เมื่อ: 24 สิงหาคม 2017, 11:30:00 »

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