test_input - php array associative



فب-حلقات من خلال $_FILES للتحقق من نوع الملف (5)

أعتقد if الشرطي خاطئ. تحتاج إلى قوسين حول المجموعة الأولى من البولينز التي هي أور، مثل هذا:

   if ( (($_FILES["image$i"]["type"] == "image/gif")
    || ($_FILES["image$i"]["type"] == "image/jpeg")
    || ($_FILES["image$i"]["type"] == "image/png" ))
    && ($_FILES["image$i"]["size"] < 500000))

هذا يعني بشكل صحيح "إذا كان الملف هو صورة من (جيف أو جبيغ أو بابوا نيو غينيا) وأقل من هذا الحجم".

الطريقة التي كان عليها من قبل ليس من المرجح المنطق الذي تريده.

سؤالي الأول على سو، وذلك بفضل. :)

أنا تطوير نظام تسجيل قضية دعم لشركتي ويجب أن تسمح للملفات ليتم تحميلها أسويل مثل أي مشاكل قدمت إلى قاعدة البيانات الخاصة بنا. يمكن أن يكون هناك من 0-6 تحميلات مختلفة للتحقق، جنبا إلى جنب مع قضية الدعم. لقد تمكنت من الحصول على متغير دقيق لعدد الملفات هناك من خلال وجود حقل الإدخال الخفي (إمغكونت) التي يتم تحديثها عبر جس كلما تم تحديد صورة من خلال نوع = "ملف" الإدخال، أو إزالتها من النموذج.

بلدي [إدخال نوع = "ملف"] أسماء هي image1، image2، وما إلى ذلك كما اعتقدت انها تريد أن تكون أسهل بهذه الطريقة إلى حلقة من خلالهم.

عند إرسال النموذج، تأخذ الشفرة التالية نظرة لمعرفة ما إذا كانت هناك أية ملفات وتتحقق من أنها صالحة للنوع (جيف / جبيغ / ينغ)، بحيث يمكن تحميلها بأمان. أنا لست قلقا جدا حول الفيروسات كما نظام الدعم لديه تسجيل دخول آمن لطيفة ونحن نثق عملائنا.

$sscount = $_POST['imgcount'];
echo $sscount; //to test the variable
if($sscount>0){
    for($i = 1; $i <= $sscount; $i++){
        if (($_FILES["image$i"]["type"] == "image/gif")
        || ($_FILES["image$i"]["type"] == "image/jpeg")
        || ($_FILES["image$i"]["type"] == "image/png" )
        && ($_FILES["image$i"]["size"] < 500000))
        {

        }
        else
        {
        $errormsg .= "Error: Image $i must be either JPEG, GIF, or PNG and less than 500 kb.<br />";
        }
    }
}

ولكن هذا لا يبدو أن حلقات من خلال بشكل صحيح، أي شخص حصلت على أي أفكار كيف يمكنني الحصول عليه حلقة من خلال والعودة بشكل صحيح؟


Answer #1

حسنا، المنطق المنطقي الخاص بك غامض ومن المحتمل ألا يفعل ما تريد. ومن المحتمل أن يعمل ذلك على نحو أفضل:

    if ((($_FILES["image$i"]["type"] == "image/gif")
    || ($_FILES["image$i"]["type"] == "image/jpeg")
    || ($_FILES["image$i"]["type"] == "image/png" ))
    && ($_FILES["image$i"]["size"] < 500000))

على الرغم من أنه لو كان لدي دروثرز، فإن الأمر كله سيبدو كما يلي:

    $file = $_FILES['image' . $i];
    $type = $file['type'];
    if(($type == 'image/gif' || $type == 'image/jpeg' || $type == 'image/png') && $file['size'] < 500000)

Answer #2

هذه ليست إجابة مباشرة على سؤالك، ولكن يمكنك تمرير قيم النموذج إلى فب كمصفوفة التي ينبغي أن يكون أسهل حلقة من خلال. in_array() مفيد أيضا للتحقق من أن القيمة ضمن قائمة مسموح بها.

HTML:

<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">

PHP:

<?php
if (isset($_FILES['image'])) {
    foreach ($_FILES['image'] as $file) {
        if (!in_array($file['type'], array("image/gif", "image/jpeg", "image/png"))
           || $file['size'] > 500000) {
           //error
        } else {
           //ok
        }
    }
}

Answer #3

يكون للمشغل && أسبقية أعلى من ||، بدلا من (A OR B OR C) AND D كما تقصد، هو في الواقع A OR B OR (C AND D)

يمكنك استخدام الأقواس لفرض التقييم الذي تقصده.

ومع ذلك، شيء من هذا القبيل قد يكون أنظف وأسهل للحفاظ على / قراءة:

$allowed_types=array(
    'image/gif',
    'image/jpeg',
    'image/png',
);


$sscount = $_POST['imgcount'];
if($sscount>0){
    for($i = 1; $i <= $sscount; $i++){

        if (in_array($_FILES["image$i"]["type"], $allowed_types) && 
            ($_FILES["image$i"]["size"] < 500000))
        {

        }

    }
}

Answer #4

كما ذكر آخرون، الطريقة التي جمعت الشروط الخاصة بك كان خطأ. ومع ذلك، بدلا من مجرد إضافة بعض الأقواس، أود أن أقترح عليك فصل الشرطين تماما؛

// this declaration + the use of in_array() isn't necessary,
// it just makes things a bit cleaner.
$file_types = array("image/gif","image/jpeg","image/png"); 

if($_FILES["image$i"]["size"] < 500000)
{
    if(in_array($_FILES["image$i"]["type"], $file_types)))
    {
        // do stuff
    }
    else
    {
        // error about file type
    }
}
else
{
    // error about file size
}

وجود هذا الفصل يجعل التعليمات البرمجية أكثر قابلية للقراءة ويوحي التسلسل الهرمي الشرط أكثر سهولة، بلوس فإنه يسمح رسائل الخطأ الخاصة بك لتكون أكثر وضوحا. من الممارسة السليمة فصل البيانات المشروطة بأنواع مختلفة، بحيث تظل أية رسائل خطأ مفيدة. إذا كان رمز الخاص بك ألقى خطأ كما هو، المستخدم لديه أي وسيلة لمعرفة (دون الحاجة إلى فاف عن أنفسهم) ما إذا كانت صورتها كبيرة جدا أو نوع خاطئ.





loops