FPDF ตอนเปิดใน localhost เปิดได้ปกติ แต่พออัพโฮสจริง ขึ้นแบบนี้ครับ
ตอนเปิดใน localhost เปิดได้ปกติ แต่พออัพขึ้นโฮสจริงขึ้นแบบนี้ครับ
Code
Notice: Trying to get property 'number' of non-object in /storage/ssd3/685/17318685/public_html/print_tel.php on line 70
Notice: Trying to get property 'first_name' of non-object in /storage/ssd3/685/17318685/public_html/print_tel.php on line 71
Notice: Trying to get property 'last_name' of non-object in /storage/ssd3/685/17318685/public_html/print_tel.php on line 72
Notice: Trying to get property 'position' of non-object in /storage/ssd3/685/17318685/public_html/print_tel.php on line 73
Code (PHP)
$stmt = $db->query('select * from employee where work = "หัวหน้าส่วน" or work = "สารบรรณ" or work = "ขนส่งทั่วไป" and position <> "ลูกจ้างเหมา" order by case position when "%ห%" then 1 when "%พ%" then 2 when "จขร." then 3 when "ลูกจ้าง" then 4 when "ลูกจ้างเหมา" then
5 end');
$stmt2 = $db->query('select * from employee where work = "ขนส่งวัสดุครุภัณฑ์" or position = "ลูกจ้างเหมา" order by case position when "%พ%" then 1 when "จขร." then 2 when "ลูกจ้าง" then 3 when "ลูกจ้างเหมา" then
4 end');
$i = 0;
//ork = "ขนส่งวัสดุครุภัณฑ์" or position = "ลูกจ้างเหมา"');
while($data = $stmt->fetch(PDO::FETCH_OBJ)){$i++;
$data2 = $stmt2->fetch(PDO::FETCH_OBJ);
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data->tel),1,0,'C');
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data2->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data2->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data2->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data2->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data2->tel),1,1,'C');
Tag : PHP, MySQL
ประวัติการแก้ไข 2021-08-06 22:53:02 2021-08-06 22:59:51 2021-08-06 23:33:12 2021-08-06 23:55:25 2021-08-07 00:34:04 2021-08-07 09:44:21
Date :
2021-08-06 22:49:32
By :
boomdaba
View :
719
Reply :
19
เมื่อกี้ผมลองเอา
if (is_object($data)) {
ใส่ไว้ด้านบน แบบนี้
Code (PHP)
if (is_object($data2)) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data->tel),1,0,'C');
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data2->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data2->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data2->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data2->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data2->tel),1,1,'C');
}
มันเปิดได้นะครับ แต่ข้อมูลฝั่งซ้ายถูกตัดออกไปเท่ากับฝั่งขวาเลย ความจริงข้อมูลฝั่งซ้ายต้องเยอะกว่าฝั่งขวาครับ
Date :
2021-08-07 21:48:11
By :
boomdaba
ตัว data ไหนกันแน่ที่มันแจ้งว่าเรียกใช้โดยไม่ได้เป็น object น่ะ ให้ลอง var_dump ตัวนั้นออกมาดู จะได้รู้ก่อนว่ามันคืออะไร มันคือ null หรือ false
ที่มันว่างก็เพราะไม่เข้าเงื่อนไข ที่ไม่เข้าเงื่อนไข is_object เพราะมันไม่เป็น object ถึงบอกว่าต้อง var_dump ออกมาดู
การเปิด exception ก็ดูตัวอย่างลิ้งค์ที่ผมให้ดูข้างบน ดูเทียบจาก config pdo ของคุณ มันจะมี argument 4 ที่ให้ใส่ option ให้กำหนดตรงนั้น หรือดูตัวอย่างของผมที่นี่ https://www.thaicreate.com/php/forum/136316.html
พอเปิด exception แล้วเวลามีปัญหาอะไรมันจะร้องเตือนเลย จะหาจุดแก้ได้ง่าย
Date :
2021-08-07 22:06:12
By :
mr.v
เอางี้ ตัวอย่างการหาแบบเจาะจง
Code (PHP)
while {
if (is_object($data2)) {
// แสดงผล
} else {
var_dump($data2);// ตรงนี้ควรจะมีผลออกมา เอาตรงนี้แหละมาดู จะได้เจาะเข้าหาต้นเหตุ
}
}
Date :
2021-08-07 22:09:02
By :
mr.v
ขึ้น false เป็นไปได้ว่าข้อมูลไม่มี ถ้าเปิด exception แล้วเปิดแสดง error ใน php.ini แล้วไม่มี error ก็คือ false ตรงนี้อย่างที่เขาบอก ไม่มีค่าออกมาใน loop รอบนั้น
อีกปัญหาที่เห็น
จากตัวอย่างมันมี 2 query ดังนั้นผลลัพธ์มันจะมี 2 ชุด แต่คุณเอาไป while ในชุดเดียวกัน คือ while($data = $stmt->fetch(PDO::FETCH_OBJ)){...}
ถ้าหาก $data มีน้อยกว่า $data2 มันก็กลายเป็น $data2 ออกมาไม่หมด
ถ้าหาก $data มีมากกว่า $data2 มันก็อาจจะมีอะไรแปลกๆเช่น วนลูปไปในสิ่งที่ไม่มี อาจจะเกิด error ออกมาหรือเปล่าไม่รู้เพราะไม่เคยทำแบบนี้
ทางที่ดีควรวนรอบของใครของมันแยกกันไป
การใช้ if (is_object()) ก็เช่นกัน ควรแยกของใครของมัน เพราะลองคิดดูถ้าเงื่อนไขเป็นจริงแต่ตัวแปรในเงื่อนไขเป็นคนละตัว ก็มีแต่สร้างปัญหาใหม่ขึ้นมาอีก
ประวัติการแก้ไข 2021-08-07 22:32:00
Date :
2021-08-07 22:30:57
By :
mr.v
ถ้าตารางทางซ้ายขวาต่างกัน 6 บรรทัดเท่ากับจำนวน false นั่นแสดงว่า false ของ fetch() คือไม่มีค่าออกมาครับ
Date :
2021-08-07 22:33:15
By :
mr.v
ตอบความคิดเห็นที่ : 7 เขียนโดย : mr.v เมื่อวันที่ 2021-08-07 22:30:57
รายละเอียดของการตอบ ::
ผมลองจัด while ใหม่แบบแยก ไม่ว่าจะลองวิธีไหน มันจะแสดงผลแปลกๆ ไม่ตรงตามที่ต้องการเลยครับ
แบบบางทีอีกฝั่งเรียงจากบนลงมาข้างล่าง (ปกติ) แต่อีกฝั่ง เรียงจากซ้ายไปขวา
Code (PHP)
while($data = $stmt->fetch(PDO::FETCH_OBJ)){$i++;
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data->tel),1,0,'C');
}
while($data2 = $stmt2->fetch(PDO::FETCH_OBJ)){$i++;
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data2->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data2->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data2->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data2->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data2->tel),1,1,'C');
}
ประวัติการแก้ไข 2021-08-07 22:42:39
Date :
2021-08-07 22:41:30
By :
boomdaba
ถ้าเป็น mysql, mariadb มันจะใช้ rowCount() นับจำนวนข้อมูลได้
https://www.php.net/manual/en/pdostatement.rowcount.php
ก็ให้เอา rowCount() นี้มาใช้นับว่าอันไหนมีมากกว่า
Code (PHP)
$countStmt = $stmt->rowCount();
$countStmt2 = $stmt2->rowCount();
if ($countStmt > $countStmt2) {
$useStmt = $stmt;
} else {
$useStmt = $stmt2;
}
unset($countStmt, $countStmt2);
แล้วเอา $useStmt ไปใช้ในลูปรอบเดียวได้เลย เป็นการแก้ปัญหาแบบค่อนข้างมักง่ายแต่มันได้ผล
Code (PHP)
while ($useStmt->fetch(\PDO::FETCH_OBJ)) {
$data = $stmt->fetch(\PDO::FETCH_OBJ);
$data2 = $stmt2->fetch(\PDO::FETCH_OBJ);
if (is_object($data )) {
// แสดงผล $data->blabla
}
if (is_object($data2)) {
// แสดงผล $data2->blabla
}
}
อันนี้แบบคิดด่วนๆ น่าจะใช้ได้ ง่าย
Date :
2021-08-07 23:11:44
By :
mr.v
ตอบความคิดเห็นที่ : 12 เขียนโดย : mr.v เมื่อวันที่ 2021-08-07 23:28:15
รายละเอียดของการตอบ ::
Code (PHP)
$countStmt = $stmt->rowCount();
$countStmt2 = $stmt2->rowCount();
if ($countStmt > $countStmt2) {
$useStmt = $stmt;
} else {
$useStmt = $stmt2;
}
unset($countStmt, $countStmt2);
while ($useStmt->fetch(\PDO::FETCH_OBJ)) {
$data = $stmt->fetch(\PDO::FETCH_OBJ);
$data2 = $stmt2->fetch(\PDO::FETCH_OBJ);
$i++;
if (is_object($data )) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data->tel),1,0,'C');
}
if (is_object($data )) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data2->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data2->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data2->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data2->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data2->tel),1,1,'C');
}
}
Date :
2021-08-07 23:29:26
By :
boomdaba
if ล่างไม่ใช่ $data2 แต่ดันเรียกใช้ $data2 มันเลยไปเข้าเงื่อนไขผิดอัน สร้างปัญหาใหม่อย่างที่ผมบอกเลยใช่มั้ยล่ะ
ตกไปตัวนึง แก้ให้ถูกก็น่าจะได้แล้วมั้ง?
Date :
2021-08-07 23:39:07
By :
mr.v
ตอบความคิดเห็นที่ : 15 เขียนโดย : mr.v เมื่อวันที่ 2021-08-07 23:39:07
รายละเอียดของการตอบ ::
ออโทษทีครับ ผมพิมพ์ตกไป แต่พอใส่ 2 เข้าไปก็เป็นแบบนี้อยู่ดีครับ
Code (PHP)
$countStmt = $stmt->rowCount();
$countStmt2 = $stmt2->rowCount();
if ($countStmt > $countStmt2) {
$useStmt = $stmt;
} else {
$useStmt = $stmt2;
}
unset($countStmt, $countStmt2);
while ($useStmt->fetch(\PDO::FETCH_OBJ)) {
$data = $stmt->fetch(\PDO::FETCH_OBJ);
$data2 = $stmt2->fetch(\PDO::FETCH_OBJ);
$i++;
if (is_object($data)) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data->tel),1,0,'C');
}
if (is_object($data2)) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data2->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data2->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data2->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data2->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data2->tel),1,1,'C');
}
}
แล้วก็ถ้ากลับไปใช้แบบเดิมแล้วแยก if ก็จะเป็นแบบนี้ครับ
Code (PHP)
while($data = $stmt->fetch(PDO::FETCH_OBJ)){$i++;
$data2 = $stmt2->fetch(PDO::FETCH_OBJ);
if (is_object($data)) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data->tel),1,0,'C');
}
if (is_object($data2)) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data2->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data2->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data2->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data2->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data2->tel),1,1,'C');
}
}
Date :
2021-08-07 23:53:53
By :
boomdaba
ไม่เข้าใจจะให้มันออกมายังไงแน่?
คือถ้าสมมุติว่าใช้วิธีของผม ข้อดีมันจะหาฝั่งที่มากกว่าแล้วเอามาวนลูปให้
การใช้ if (is_object()) ครอบไว้นั้นถูกแล้ว ไม่ควรเอาออก เพราะไม่งั้นมันจะเป้นการเรียก property บน false แล้วมันจะ error
ดังนั้นที่เหลือ.... ซึ่งผมก็ไม่รู้จะแนะนำตรงต้องการมั้ยเพราะไม่รู้จะให้มันออกมาเป็นยังไง
ที่เหลือก็คือ ทั้ง if ของ $data และ $data2 ทั้ง 2 เงื่อนไข ให้ใส่ else
Code (PHP)
if (is_object($data)) {
//
} else {
}
if (is_object($data2)) {
//
} else {
}
และใน else ให้ใช้คำสั่งของ fpdf เติม cell เข้าไปให้มันเต็ม โดยที่ไม่ต้องใส่ค่าอะไรลงไป
ตัวอย่าง
$this->Cell(6,5.1, '', 1,0, 'C');
เติมจำนวน cell ให้เท่าๆกันกับตอนที่คุณเรียกใช้นั่นแหละ แต่ให้มันเป็น cell ว่างๆ
ย้ำว่าจำนวนเท่าๆกัน ที่ผมเห็นแต่ละ loop แต่ละเงื่อนไข จะมี 6 cell ก็ใส่ลงไป
Code (PHP)
if (is_object($data)) {
// เงื่อนไขที่ผ่าน
} else {
// เติม cell ว่างๆ 6 ช่องเท่ากับในเงื่อนไขบน (เงื่อนไขที่ผ่าน)
}
if (is_object($data2)) {
// เงื่อนไขที่ผ่าน
} else {
// เติม cell ว่างๆ 6 ช่องเท่ากับในเงื่อนไขบน (เงื่อนไขที่ผ่าน)
}
แบบนี้ คงเข้าใจนะ พอเติมเซลล์ว่างๆลงไป มันน่าจะได้พอดีๆกันซ้ายขวาแต่ฝั่งที่ไม่มีข้อมูลจะว่างๆไปแค่นั้น
ไม่รู้ใช่แบบนี้เปล่าที่ต้องการ
Date :
2021-08-08 00:13:31
By :
mr.v
ตอบความคิดเห็นที่ : 17 เขียนโดย : mr.v เมื่อวันที่ 2021-08-08 00:13:31
รายละเอียดของการตอบ ::
ทำได้แล้วครับ ดีใจมาก ขอบคุณมากๆนะครับ
ผมลองทำแบบนี้
Code (PHP)
while($data = $stmt->fetch(PDO::FETCH_OBJ)){$i++;
$data2 = $stmt2->fetch(PDO::FETCH_OBJ);
if (is_object($data)) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data->tel),1,0,'C');
} else {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', ''),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', ''),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', ''),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', ''),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', ''),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', ''),1,0,'C');
}
if (is_object($data2)) {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', $i),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', $data2->number),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', $data2->first_name),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', $data2->last_name),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', $data2->position),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', $data2->tel),1,1,'C');
} else {
$this->Cell(6,5.1,iconv('UTF-8', 'TIS-620', ''),1,0,'C');
$this->Cell(14,5.1,iconv('UTF-8', 'TIS-620', ''),1,0,'C');
$this->Cell(18,5.1,iconv('UTF-8', 'TIS-620', ''),'LB',0,'L');
$this->Cell(17,5.1,iconv('UTF-8', 'TIS-620', ''),'RB',0,'L');
$this->Cell(13,5.1,iconv('UTF-8', 'TIS-620', ''),1,0,'C');
$this->Cell(27,5.1,iconv('UTF-8', 'TIS-620', ''),1,1,'C');
}
}
ได้แบบที่ต้องการเลย
ขอบคุณมากจริงๆครับ ที่พยายามช่วยผม
Date :
2021-08-08 00:32:51
By :
boomdaba
เวลาเติม cell ว่างๆ iconv ก็ไม่ต้องใช้แล้วเพราะมันว่างเปล่า เรียกใช้ไปก็เปลือง resource server
Date :
2021-08-08 00:35:05
By :
mr.v
Load balance : Server 04