A-AA+then

PHP ช่วยข้าน้อยด้วย T-T

1,587
คือผมต้องการเช็คว่าถ้า 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 ค่าเป็นแบบนี้ครับ
  $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);
}

3 ความคิดเห็น

 ถามว่าอะไรรึ ??? อะไรที่มันไม่ได้ ??? ลองตรวจสอบความผิดพลาดเบื้องต้น แล้วถามคำถามที่แคบกว่านี้สักหน่อย
1

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();
}

คือตรงแดง ๆ อ่ะ มันคือฟังชั่นเช็คอะไรต่าง ๆ ของไฟล์ครับถ้ามันมี error แม้แต่ไฟล์เดียวก็จะข้ามไปทำใน else แทน
ผมอยากจะแก้ให้มันเช็คว่าถ้าอันไหนมันไม่ error ก็ให้ทำใน if อ่ะครับแล้วก็แสดง error ด้วย
2

555++++

น่าจะผิดตั้งแต่แนวคิดแล้วละครับ คิดง่ายๆ นะ ถ้ามีอันใดอันหนึ่ง error มันก็จะไปแสดง error เสมอ โดยไม่สามารถไปที่ upload ได้หรอกครับ

ทางออกก็น่าจะต้องเอาออกจากฟังก์ชั่น แล้วทดสอบทีละตัวครับ ตัวไหนที่ไม่ error ก็อัปโหลดไปเลย ถ้ามี error ก็ให้เก็บ error ไว้แล้วค่อยแสดงผลอีกทีหลังจากที่ ตรวจสอบครบทุกตัวแล้ว ลองออกแบบใหม่ดูอีกทีนะครับ
3
^