[php/mysql] upload

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
majcok
Posty: 6
Rejestracja: wt lis 02, 2004 3:40 pm

[php/mysql] upload

Post autor: majcok »

Witam. Mam problem z uploadem pliku, tzn. nie pokazuje zadnego komunikatu, a w bazie w odpowiednim katalogu nie ma nic nowego. Ponizej kod:

Kod: Zaznacz cały

<?
function add_image()
{
    if(isset($_GET["id_cat"]))
    {
        $temat = "Przesylanie Plikow";
        html_header($temat, 800);

        ?>
        <form method="post" action="<?php echo $PHP_SELF ?>" enctype="multipart/form-data">
        Sciezka:<input type="file" name="userfile" size="20" maxlength="40">
        Nick:
        <input type="text" name="nick" size="20" maxlength="20">
        Opis:<textarea rows="5" cols="40" name="description"></textarea>
        <input type="submit" value="Dodaj">
        </form>
        <?
        html_footer();


        if(isset($_POST["userfile"]) && isset($_POST["nick"]) && isset($_POST["description"])) 
        {            
            global $userfile, $nick, $description;
            $dir = "/galeria";
            

            if(empty($nick)) 
            {
                error_message("Musisz podac nick!");
                exit;
            }
            if(empty($description)) 
            {
                error_message("Musisz podac opis!");
                exit;
            }
            if($userfile_size <= 0)
            {
                error_message("Musisz podac sciezke do obrazka!");
                exit;
            }
            if($userfile_size > 2000000)
            {
                error_message("Plik jest za duzy. Maksymalna wielkosc to 2 Mb!");
                exit;
            }

            $filename=basename($userfile_name);
            if(!@copy($userfile, "$dir/$filename"))
                echo("Blad nie mozna skopiowac $filename.");
            else echo "Udane przysylanie pliku $filename";
            header("Location: index.php");

            $img_path = "$dir/$filename";

            $query = "INSERT INTO gal_images VALUES(NULL, '$img_path', 'W', '$nick', '$_GET[id_cat]', '$description')";
            $wynik = mysql_query($query);
            if(!$wynik) error_message(sql_error());
            
            
        }

    }
}
?>
Nie wiem co jest nie tak, moze cos w php.ini albo z chmodem, ale na tym sie nie znam
Thx

Pzdr
_ash_
Nowy
Nowy
Posty: 37
Rejestracja: wt lut 22, 2005 8:19 am
Kontakt:

Re: [php/mysql] upload

Post autor: _ash_ »

Po pierwsze usun @ sprzed copy(), to sie dowiesz jaki blad ;)
Po drugie sprobuj uzyc move_uploaded_file() zamiast copy().
Po trzecie czy serwer ma safemode on, bo jesli tak, to trzeba bardzo uwazac na to dokad co sie chce kopiowac.
majcok
Posty: 6
Rejestracja: wt lis 02, 2004 3:40 pm

Re: [php/mysql] upload

Post autor: majcok »

To chyba narazie mi sie nie przyda, bo pod formularzem, mam warunek:

[php]<?php
if(isset($_POST["userfile"]) && isset($_POST["nick"]) && isset($_POST["description"]))
?>[/php]

i skrypt dzialal tak jakby w ogole warunek nie nie byl spelniony, tzn. po wyslalniu formularza, albo ponownie sie pojawial albo wyswietlal sie blad o braku sciezki. Gdy usunalem z warunku 'isset($_POST["userfile"])' skrypt, dzialal w pewnym stopniu (tzn. nie zapisywal obrazka, bo nie mial teoretycznie co) ale zapis do bazy byl.
Zmienielm na tak:
[php]<?php
if(isset($_FILES["userfile"]) && isset($_POST["nick"]) && isset($_POST["description"]))
?>[/php]
i niestety to samo :(
Btw. nie wiem czy mam ustawione safemode, mam zainstalowanego krasnala z domyslymi opcjami.

PZdr
_ash_
Nowy
Nowy
Posty: 37
Rejestracja: wt lut 22, 2005 8:19 am
Kontakt:

Re: [php/mysql] upload

Post autor: _ash_ »

majcok pisze:Btw. nie wiem czy mam ustawione safemode, mam zainstalowanego krasnala z domyslymi opcjami.
Użyj phpinfo(); [ http://de.php.net/manual/en/function.phpinfo.php ]
majcok
Posty: 6
Rejestracja: wt lis 02, 2004 3:40 pm

Re: [php/mysql] upload

Post autor: majcok »

safe_mode jest na off.
[php]<?php
if(isset($_FILES["userfile"]) && isset($_POST["nick"]) && isset($_POST["description"]))
{
global $userfile_name, $userfile_size;
$dir = "/galeria";

if(empty($_POST["nick"]))
{
error_message("Musisz podac nick!");
exit;
}
if(empty($_POST["description"]))
{
error_message("Musisz podac opis!");
exit;
}
if($userfile_size <= 0)
{
error_message("Musisz podac sciezke do obrazka!");
exit;
}
if($userfile_size > 2000000)
{
error_message("Plik jest za duzy. Maksymalna wielkosc to 2 Mb!");
exit;
}

$filename=basename($userfile_name);
if(!copy($_FILES["userfile"], "$dir/$filename"))
echo("Blad nie mozna skopiowac $filename.");
else echo "Udane przysylanie pliku $filename";


$img_path = "$dir/$filename";

$query = "INSERT INTO gal_images VALUES(NULL, '$img_path', 'W', '$_POST[nick]', '$_GET[id_cat]', '$_POST[description]')";
$wynik = mysql_query($query);
if(!$wynik) error_message(sql_error());
header("Location: index.php");

}


?>[/php]
Jednak cos jest jeszcze nie tak, bo nie kopiuje pliku.

PZdr
paszczak
Nowy
Nowy
Posty: 123
Rejestracja: ndz paź 03, 2004 2:21 pm
Lokalizacja: Sopot
Kontakt:

Re: [php/mysql] upload

Post autor: paszczak »

hmm.... a troche z innej strony

czy masz ustawiony "upload_tmp_dir" i czy napewno masz taki katalog?
FanFataL
Nowy
Nowy
Posty: 113
Rejestracja: pn lut 28, 2005 1:33 am
Lokalizacja: Kraków / Katowice / Bydgoszcz
Kontakt:

Re: [php/mysql] upload

Post autor: FanFataL »

if(!copy($_FILES["userfile"], "$dir/$filename"))
Zastanawia mnie jak plik może mieć nazwę w postaci tablicy, hmmm :?

zrób [php]<?php
echo '<pre>';
print_r($_FILES['userfile']); // <-- To jest tablica [Array]
?>[/php]
W manualu [manual]copy[/manual]
bool copy ( string źródło, string przeznaczenie)
także dlatego nie kopiuje

Proponuje zrobić tak:[php]<?php
if(!copy($_FILES['userfile']['tmp_name'], "$dir/$filename"))
echo("Blad nie mozna skopiowac $filename.");
else echo "Udane przysylanie pliku $filename";
?>[/php]
Generalnie to ja zamiast [manual]copy[/manual] używam [manual]move_uploaded_file[/manual] i wtedy to by wyglądało tak ...[php]<?php
$file_tmp=$_FILES['userfile'];
$tmp=$file_tmp['tmp_name'];
if(!move_uploaded_file($tmp,$dir.'/'.$filename)) {
return getUploadError($file_tmp['error']);
}
return true;

// Dodatkowo masz funkcje do obsługi błędów podczas uploadu
function getUploadError($error_id=UPLOAD_ERR_OK) {
switch($error_id) {
default:
return true;
break;
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
return 'Plik jest za duży ...';
break;
case UPLOAD_ERR_PARTIAL:
return 'Nastąpił błąd podczas transmisji danych ... spróbuj jeszcze raz';
break;
case UPLOAD_ERR_NO_FILE:
return 'Musisz wybrać plik';
break;
}
}
?>[/php]

Pozdrawiam :wink:
...
ODPOWIEDZ