Возвращаемое значение из PHP-функции - PullRequest
0 голосов
/ 20 августа 2011

У меня проблема с возвратом значения из моей функции. Я думаю, я настроил его, чтобы он возвращал $ filename, но я не получаю пустое значение при его возврате. Я где-то ошибся? Я назначил функцию imageupload переменной $ newfilename, а затем попытался вставить ее в свою базу данных, и у меня нет данных в столбце для этой записи.

Функция загрузки изображения:

    function imageupload()
{
    $allowed_types=array(
    'image/gif',
    'image/jpeg',
    'image/png',
    'image/pjpeg',
    );

if (($_FILES["picupload"]["size"] < 5500000))
  {
      if(in_array($_FILES["picupload"]["type"], $allowed_types))
      {
        if ($_FILES["picupload"]["error"] > 0)
        {
            throw new Exception('Invalid File - No Data In File');
        }
        else
        {
            $dirname = getcwd() . '/userpics/' . $_SESSION['username'];
            if (!file_exists($dirname)) 
            {
                $thisdir = getcwd()  . "/userpics/" . $_SESSION['username']; 

                if(mkdir($thisdir , 0777)) 
                { 
                    $filename = basename( $_FILES['picupload']['name']);
                    $ext = end(explode(".", $filename));
                    $thisdir = getcwd()  . "/userpics/" . $_SESSION['username'] . "/profilepic." . $ext;
                    if(move_uploaded_file($_FILES['picupload']['tmp_name'], $thisdir)) 
                    {
                        return $ext;
                    } 
                    else
                    {
                        throw new Exception('Could not upload file');
                    }
                } 
                else 
                { 
                   throw new Exception('Could not create directory');
                } 
            }
            else
            {
                $filename = basename( $_FILES['picupload']['name']);
                $ext = end(explode(".", $filename));
                $thisdir = getcwd()  . "/userpics/" . $_SESSION['username'] . "/profilepic." . $ext;
                if(move_uploaded_file($_FILES['picupload']['tmp_name'], $thisdir)) 
                {
                    return $ext;
                } 
                else
                {
                    throw new Exception('Could not upload file');
                }
            } 
        }
    }
    else
    {
        throw new Exception('Invalid File Type');
    }
  }
else
  {
    throw new Exception('Invalid File Error, File Too Large');
  } 
}

Код вызова Imageupload:

else if ($type == "update")
{
    if($_POST['changeimage'] == 'true')
    {
        $newfilename = imageupload();
        $sql="UPDATE users SET `FirstName`='$_POST[firstname]', `MiddleInt`='$_POST[middleint]', `LastName`='$_POST[lastname]', `emailAddress`='$_POST[emailaddress]', `website`='$_POST[website]', `Title`='$_POST[title]', `College`='$_POST[collegedropdown]', `Department`='$_POST[deptdropdown]', `Phone`='$_POST[phone]', `Photo`='$newfilename' WHERE `uid` = '$uid';";
    }
    else
    {
        $sql="UPDATE users SET `FirstName`='$_POST[firstname]', `MiddleInt`='$_POST[middleint]', `LastName`='$_POST[lastname]', `emailAddress`='$_POST[emailaddress]', `website`='$_POST[website]', `Title`='$_POST[title]', `College`='$_POST[collegedropdown]', `Department`='$_POST[deptdropdown]', `Phone`='$_POST[phone]' WHERE `uid` = '$uid';";
    }
}
else
{
    echo "Error, please contact the administrator";
}
$result = mysql_query($sql,$con);mysql_close($con);
//header("location: index.php");

}

1 Ответ

0 голосов
/ 20 августа 2011

В вашем коде много ошибок.

Сначала вы ссылаетесь на $_FILES['file'].Но после этого вы ссылаетесь на $_FILES['picupload'].

Во-вторых, $allowed_types не определено.

Кроме того, getcwd() обычно не возвращает завершающий слеш.Так что это:

$thisdir = getcwd() . 'userpics/' . $_SESSION['username'];

..., вероятно, не будет работать.Это:

$ext = end(explode(".", $filename));

... незаконно.end принимает ссылку.Таким образом, вы не можете передать результат функции ему.Вы должны сначала сохранить его в переменной.Тем не менее, лучший способ добиться того же - использовать pathinfo.

. В какой-то момент вы ошибочно делаете file_exists($thisdir) , а затем mkdir($thisdir).Вы также не добавляете имя файла в каталог впоследствии.

Вы излишне дублируете код и используете if...else с исключениями.Вам следует выполнить рефакторинг (это также облегчит отладку):

function imageupload()
{
    // define $allowed_types
    $allowed_types = array('image/png'); 

    // use "picupload" here
    if ($_FILES["picupload"]["size"] >= 5500000)
        throw new Exception('Invalid File Error, File Too Large');

    if (!in_array($_FILES["picupload"]["type"], $allowed_types))
        throw new Exception('File type not allowed');

    if ($_FILES["picupload"]["error"] > 0)
        throw new Exception('Invalid File - No Data In File');

    // fix the getcwd() expression
    $thisdir = getcwd() . '/userpics/' . $_SESSION['username'];

    // create the directory only if it doesn't exist
    if (!file_exists($thisdir)) {
        if (!mkdir($thisdir, 0777))
            throw new Exception('Could not create directory');
    }

    $filename = basename($_FILES['picupload']['name']);

    // fix the end(explode()) illegal call
    $ext = pathinfo($filename, PATHINFO_EXTENSION);

    // make sure this is actually a filename, and not a directory
    $thisdir .= "/profilepic." . $ext;

    if (!move_uploaded_file($_FILES['picupload']['tmp_name'], $thisdir))
        throw new Exception('Could not upload file');

    return $filename;
}

Примечание. Как упоминалось в комментариях, код вызывающей стороны также уязвим для внедрения SQL.

...