PHP ช่วยข้าน้อยด้วย T-T
คือผมต้องการเช็คว่าถ้า file ที่อัพโหลด file ไหนไม่ error (หมายถึงต้องไม่ error อย่างน้อย 1 ไฟล์จาก 4 ไฟล์)
ก็ใ้ห้ทำฟั่งชั่น process form ก่อนอ่ะครับ
แล้วค่อยแจ้ง error โดยฟังชั่น show_error อีกที
include("17-3.php");
if (!empty($_POST["submit"])) {
if (check_file($err)) {
process_form();
} else {
show_error($err["error"]);
show_error($err["type"]);
show_error($err["move"]);
html_form();
}
} else {
html_form();
}
ตรงสีแดงนั่นฟังชั่นจะคืนค่ามาเป็น true ถ้าไม่มี error และ false ถ้ามี error ครับ
รูปแบบการเก็บค่า error ค่าเป็นแบบนี้ครับ
17-3.php
ก็ใ้ห้ทำฟั่งชั่น process form ก่อนอ่ะครับ
แล้วค่อยแจ้ง error โดยฟังชั่น show_error อีกที
include("17-3.php");
if (!empty($_POST["submit"])) {
if (check_file($err)) {
process_form();
} else {
show_error($err["error"]);
show_error($err["type"]);
show_error($err["move"]);
html_form();
}
} else {
html_form();
}
ตรงสีแดงนั่นฟังชั่นจะคืนค่ามาเป็น true ถ้าไม่มี error และ false ถ้ามี error ครับ
รูปแบบการเก็บค่า error ค่าเป็นแบบนี้ครับ
$err = array(
"error" => array(),
"type" => array(),
"move" => array()
);
17-3.php
function show_error($show_e) {
if (!count($show_e) > 0) {
return false;
} else {
foreach ($show_e as $skey => $svalue) {
echo "$svalue<br>
";
}
}
}
function check_file(&$err) {
global $limit_size, $err;
$limit_size = "100000";
$err = array(
"error" => array(),
"type" => array(),
"move" => array()
);
foreach ($_FILES["pic"]["error"] as $ekey => $evalue) {
switch ($evalue) {
case 1:
case 2:
$err["error"][$ekey] = "ขนาดของไฟล์ที่ $ekey มากกว่า " . bytestokb($limit_size) . " KB";
break;
case 3:
$err["error"][$ekey] = "ไฟล์ที่ $ekey ถูกส่งมาแค่เพียงบางส่วน";
break;
case 4:
$err["error"][$ekey] = "ไม่มีการส่งไฟล์ที่ $ekey มา";
break;
}
if ($evalue == 0) {
if (!(($_FILES["pic"]["type"][$ekey] == "image/gif") || ($_FILES["pic"]["type"][$ekey] == "image/pjpeg") || ($_FILES["pic"]["type"][$ekey] == "image/jpeg") || ($_FILES["pic"]["type"][$ekey] == "image/x-png") || ($_FILES["pic"]["type"][$ekey] == "image/png"))) {
$err["type"][$ekey] = "ไฟล์ที่ $ekey ไม่ใช่รูปภาพ";
}
}
}
switch (empty($err["error"]) && empty($err["type"]) && empty($err["move"])) {
case true:
return true;
break;
case false:
return false;
break;
}
}
function html_form() {
global $limit_size;
echo <<<HTMLBLOCK
<form action="{$_SERVER["PHP_SELF"]}" method="POST" enctype="multipart/form-data" name="img_file">
<input type="hidden" name="MAX_FILE_SIZE" value="{$limit_size}">
<input type="file" name="pic[]"><br>
<input type="file" name="pic[]"><br>
<input type="file" name="pic[]"><br>
<input type="file" name="pic[]"><br>
<input type="submit" name="submit" value="upload">
</form>
HTMLBLOCK;
}
function print_array($show) {
echo "<pre>";
print_r($show);
echo "</pre>";
}
function process_form() {
$w = 100;
$h = 100;
foreach ($_FILES["pic"]["tmp_name"] as $tmpkey => $tmpvalue) {
$dir_pic = "upload/" . time() . "-" . $_FILES["pic"]["name"][$tmpkey];
if(!move_uploaded_file($_FILES["pic"]["tmp_name"][$tmpkey], $dir_pic)) {
$err["move"][$tmpkey] = "ไม่สามารถย้ายไฟล์ที่ $tmpkey ได้";
} else {
echo "<B>รายละเอียดไฟล์ที่ $tmpkey : </B><br>
";
echo "ชื่อ : {$_FILES["pic"]["name"][$tmpkey]}<br>
";
echo "ขนาดไฟล์ : " . bytestokb($_FILES["pic"]["size"][$tmpkey]) . " KB<br>
";
echo "ประเภทไฟล์ : {$_FILES["pic"]["type"][$tmpkey]}<br>
";
echo "<img src=\"$dir_pic\" witdh=\"{$w}\" height=\"{$h}\"><br>
";
}
}
}
function bytestokb($num) {
return round($num/1024);
}
ถามว่าอะไรรึ ??? อะไรที่มันไม่ได้ ??? ลองตรวจสอบความผิดพลาดเบื้องต้น แล้วถามคำถามที่แคบกว่านี้สักหน่อย
if (!empty($_POST["submit"])) {
if (check_file($err)) {
process_form();
} else {
show_error($err["error"]);
show_error($err["type"]);
show_error($err["move"]);
html_form();
}
} else {
html_form();
}
คือตรงแดง ๆ อ่ะ มันคือฟังชั่นเช็คอะไรต่าง ๆ ของไฟล์ครับถ้ามันมี error แม้แต่ไฟล์เดียวก็จะข้ามไปทำใน else แทน
ผมอยากจะแก้ให้มันเช็คว่าถ้าอันไหนมันไม่ error ก็ให้ทำใน if อ่ะครับแล้วก็แสดง error ด้วย
น่าจะผิดตั้งแต่แนวคิดแล้วละครับ คิดง่ายๆ นะ ถ้ามีอันใดอันหนึ่ง error มันก็จะไปแสดง error เสมอ โดยไม่สามารถไปที่ upload ได้หรอกครับ
ทางออกก็น่าจะต้องเอาออกจากฟังก์ชั่น แล้วทดสอบทีละตัวครับ ตัวไหนที่ไม่ error ก็อัปโหลดไปเลย ถ้ามี error ก็ให้เก็บ error ไว้แล้วค่อยแสดงผลอีกทีหลังจากที่ ตรวจสอบครบทุกตัวแล้ว ลองออกแบบใหม่ดูอีกทีนะครับ