Invata PHPcu punctsivirgula.ro

C O N T I N U T
Tutorial PHP in limba romana.

Explicatii, exemple si aplicatii in PHP pentru incepatori. Tutorial cu scripturi PHP


Aplicatie: sa se incarce (copieze) un fisier de pe calculatorul personal pe server (upload de fisiere)    11 ! 

Formularul folosit pentru upload este unul special, avand un parametru obligatoriu (enc-type) si metoda POST.
Important de verificat, pentru ca functionalitatea de upload sa fie activata:

  • directiva file_uploads din php.ini trebuie sa fie 'on'
  • directiva upload_tmp_dir din php.ini trebuie sa se refera la o cale existenta pe server si cu permisiuni suficiente pentru ca web-serverul sa poata crea fisiere
  • directivele upload_max_filesize si post_max_size din php.ini specifica marimea maxima a fisierului si respectiv a datelor ce pot fi transmise prin intermediul formularului; este recomandat ca aceste valori sa fie revizuite
  • atributul enctype="multipart/form-data" NU TREBUIE omis, altfel uploadul nu va functiona

Formularul trebuie sa contina un input de tip FILE, ca in exemplul de mai jos.

<!-- Encoding type, specificat de atributul enctype, TREBUIE specificat ca mai jos -->
<form enctype="multipart/form-data" action="upload.php" method="POST">
    Incarca un fisier: <input name="fisier" type="file" />
    <input type="submit" value="Trimite fisier" />
</form>

Nota asupra mecanismului de upload:

  • web serverul copiaza fisierul transmis de utilizator intr-o locatie temporara (specificata de directiva upload_tmp_dir)
  • interpretorul PHP este invocat, avand variabila $_FILES populata cu informatii despre upload
  • Programatorul este responsabil cu prelucrarea fisierului incarcat pe server (mutare intr-o alta locatie, citire, copiere, etc), prelucrare ce se face cu ajutorul functiilor puse la dispozitie de PHP. Daca fisierul incarcat nu este mutat (sau redenumit) din locatia temporara, acesta va fi sters automat la terminarea executiei scriptului (la finalul requestului, mai exact).

Fisierul PHP (upload.php) ce va prelucra uploadul contiune urmatoarea secventa de cod (include si validare).

<?php
# se verifica daca fisierul incarcat a depasit dimensiunea maxima acceptata
# daca acest lucru se intampla, variabilele $_POST si $_FILES se golesc automat
if( empty( $_POST ) && empty( $_FILES ) ) {
	# a fost facut un POST sau nu?
	if( isset( $_SERVER['CONTENT_LENGTH'] ) ) {
		# atunci cand se trimit date prin post variabila $_SERVER['CONTENT_LENGTH']
		# contine valoarea dimensiunii datelor
		$POST_MAX_SIZE = ini_get('post_max_size');
		if( !empty( $POST_MAX_SIZE ) ) {
			# determin limita maxima (care poate fi in KB, MB sau GB
			$mul = substr($POST_MAX_SIZE, -1);
			$mul = ($mul == 'M' ? 1048576 :(
				$mul == 'K' ? 1024 :($mul == 'G' ? 1073741824 : 1)));
			if ( $_SERVER['CONTENT_LENGTH'] > $mul*(int)$POST_MAX_SIZE && 
			     $POST_MAX_SIZE ) {
				print "Fisier prea mare! Ati depasit limita maxima permisa";
			}
		} else {
			print "Eroare nespecificata (probabil fisierul este prea mare)";
		}
	} else {
		# nu s-a facut inca submit la fisier, afisez un mesaj
		print "Apasati pe 'Trimite fisier' pentru a face upload!";
	}
} else {
	# $_POST si $_FILES sunt setate; verific alte erori ce pot sa apara
	if( $_FILES['fisier']['error'] > 0 ) {
		print "A intervenit o eroare (#{$_FILES['fisier']['error']})";
	} else {
		# fisierul uploadat va fi pus in subfolderul 'upload' (care trebuie sa 
		# existe deja in aceeasi locatie ca si fisierul upload.php
		$uploaddir = dirname( __FILE__ ). DIRECTORY_SEPARATOR . 
					'upload' . DIRECTORY_SEPARATOR;
		$uploadfile = $uploaddir . basename($_FILES['fisier']['name']);
 
		if (move_uploaded_file($_FILES['fisier']['tmp_name'], $uploadfile)) {
			print "Fisier incarcat cu succes!";
		} else {
			print "Nu s-a putut incarca fisierul";
		}
	}
}
?>
Mihai a spus Unde se pune fisierul? - 23.11.2009

In codul acesta unde se pune fisierul unde va fi incarcat documentul...adica unde se va incarca documentul celui ce il uploadeaza?

Alexandru a spus Re: Unde se pune fisierul? - 23.11.2009

Fisierul uploadat va fi pus in subfolderul 'upload', in aceeasi locatie cu scriptul upload.php. Spre exemplu, daca scriptul tau se afla in "C:\Program Files\EasyPHP5.3.0\www\", atunci, ca sa-ti functioneze upload-ul trebuie sa creezi un folder numit "upload" cu drepturi de scriere (atentie la Linux/Vista/Windows7 - folderul trebuie sa aiba permisiile corecte de scriere).
Asadar, fisierul uploadat se salveaze in "C:\Program Files\EasyPHP5.3.0\www\upload\"

Bineinteles, poti schimba asta din cod. Trebuie sa inlocuiesti calea din linia urmatoare:

$uploaddir = dirname( __FILE__ ). DIRECTORY_SEPARATOR . 'upload' . DIRECTORY_SEPARATOR;

Poti sa pui, spre exemplu:

$uploaddir = "D:\Uploads\Music\";

Mihai a spus Eroare - 23.11.2009

am easy php 3.0 si imi da eroare la:
<form enctype="multipart/form-data" action="upload.php" method="POST">

Mihai a spus Ma poti ajuta? - 23.11.2009

Scuze ca te deranjez atat dar mie imi da eroare la acel cod si cred ca este de la " <form "

off:cam cat timp imi ia sa invat php daca stau cam 1-2 h pe zi si daca eu fac o pagina php dar la fiecare chestie bagata in pagina ma uit pe niste notite...inseamna ca stiu php sau nu? si php are legatura cu pascal?

iulian a spus esti la marina? - 08.02.2010

Dude (Mihai) fii si tu mai serios si nu mai pune intrebari imbecile. Probabil ca esti la inceputul liceului, asa ca mai roaga profii sa te indrume.

vlad a spus sal.. - 15.03.2010

ma poti ajuta cu ceva?
eu vreau ca atunci cand o persoana uloadeaza ceva sa se faca automat pe o pagina linkul cu acel fisier ,ca dupa ce la uploadat sa nu stau eu sal indexez sa se faca automat dupa cateva secunde dupa upload.Se poate?

stefan a spus Salut ! - 06.06.2010

Am si eu doua intebari.
1. Cum administrez userii unui site? Adica daca vreau ca cineva sa se inregistreze pe site-ul meu si sa aibe cont, eu cum pot sa administrez restrictiile acelui user? Cum pot sa creez rank-uri pt useri?
2. Cum fac ca sa se uploadeze automat o poza pe pagina, adica atunci cand userul vrea sa puna spre exemplu pe un magazin on-line o poza la anuntul sau , adminul site-ului sa nu mai trebuiasca sa indexeze manual anuntul userului.

Stefan a spus Ma las de PHP , e prea greu ! - 06.06.2010

Ma chinui degeaba. Nu stiu de unde sa incep , nu stiu ce sa invat , nu stiu nimic. O las balta, php cred ca nu e pt oricine. Raman cu HTML ,CSS si Photoshop, atat pot. Majoritatea tutorialelor te invata variabile , operatorii etc. "nimic util".......eu vreau exemple de coduri pe care sa le invat si sa le pun pe viitorul meu site, nu chestii banale cu adunari si scaderi.

Daniel a spus Frumos - 30.06.2010

Salut Alexandru...frumos tutorial. Crezi ca m-ai putea ajuta la o chestie?...vreau ca acel fisier incarcat pe server(el fiind video .avi,.mpeg..etc) sa il transform in flv ...eventual cu un nume generat....ma gasesti la id mess drk_alien ..si eventual facem aici un tutorial mai grozav .:D.
Iar voi ceilalti nu va plangeti de mila ..va trebe exercitiu si atat.Ar fi fost bine sa stiti ceva mai bine C++ 3.1 (asta se invata in liceu--te ajuta mult).Toate bune.

Alexandru a spus Pentru Daniel - 05.07.2010

Salut,

Este destul de dificil sa faci o conversie dintr-un format in altul - in orice caz, trebuie folosita o librarie pentru asta.

Eu iti sugerez in schimb altceva:
- fisierul uploadat il salvezi intr-o locatie
- faci un script php care sa construiasca un XML ce cuprinde fisierele din acea locatie (toate sau doar unele dintre ele)
- folosesti un player flash/silverlight care sa incarce acel XML ca playlist si sa-ti redea fisierele (ex. http://www.longtailvideo.com/players/jw-flv-player/ )

Planuiesc sa fac un mic tutorial pentru punctul 2. Daca faci tu restul si vrei sa il imparti cu ceilalti, as fi bucuros sa-l public :)

Piny a spus Problema este: comoditatea ! - 11.08.2010

Am citit toate commenturile de pe site, de la fiecare lectie in parte si am ajuns la concluzia ca majoritatea persoanelor nu doresc sa invete PHP, ci sa gaseasca pe cineva care sa faca scriptul de care au nevoie pentru ei. Majoritatea persoanelor care au postat mai sus, îi cer autorului sa le creeze cate un script (de care probabil au nevoie, si este motivul care ia inpins spre incercarea de a invata PHP).

La fel cum a repetat si autorul de cateva ori, si cum a mentionat la inceputul tutorialului, cititi cu ATENTIE aceasta pagina http://php.punctsivirgula.ro/?despre Daca indepliniti conditiile de pe acea pagina, nu cred ca aveti vreo problema in a intelege PHP urmand acest tutorial.

Tutorialul este absolut fabulos. Indeajuns de detaliat si exemplificat. Acesta este un tutorial unde invatati LUCRURILE DE BAZA ale PHPului. Daca vreti scripturi complicate, puneti-va propriile minti la lucru si creatile.

Exemplele de pe acest site sunt puse ca sa va arate ideologia scripturilor, cum anume trebuie sa ganditi (algoritmic) pentru realizarea scripturilor.

Daca cineva sa simtit ofensat de acest comentariu, inseamna ca il deranjeaza adevarul.


Adauga un comentariu la aceasta sectiune.

 


Aplicatie: sa se incarce mai multe fisiere pe server in acelasi timp    5 ! 

Formularul contine mai multe elemente de tip INPUT FILE, denumite sub forma unui vector (array):

<form action="" method="post" enctype="multipart/form-data">
<p>Fisiere:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Incarca" />
</p>
</form>

Codul PHP pentru prelucrarea uploadului trebuie scris in acelasi fisier ca si formularul (Nota: acesta este o in varianta cu validari minimale)

<?php
# pentru fiecare fisier incarcat, fac o verificare dupa status code
if( !empty( $_FILES ) )
foreach ($_FILES["pictures"]["error"] as $key => $error) {
	if ($error > 0) { # echivalent cu ( $_FILES["pictures"]["error"][$key] > 0 )
		print "Eroare cu fisierul {$_FILES["pictures"]["tmp_name"][$key]}!";
	} else {
		$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
		$name = $_FILES["pictures"]["name"][$key];
		# mut fisierul din locatia temporara in directorul curent (acelasi
		# director in care se afla scriptul PHP)
		move_uploaded_file($tmp_name, "$name");
	}
}
?>
beny a spus cum se face un formular pt comentarii - 04.09.2009

Da si u un exemplu de formular de comentarii,de exemplu al tau sau unul mai simplu.PLS

Alexandru a spus Pentru Beny - 08.09.2009

Salut Beny,

Un exemplu de formular (HTML + cod PHP) a fost pus la urmatoarea pagina http://php.punctsivirgula.ro/aplicatii-formulare/ Tot aici mai sunt si cateva exemple de formulare implementate pe alte site-uri.

Astept comentarii daca ai nelamuriri!

Etic a spus Intrebare - 10.11.2009

Salut !
As fi recunoscator daca ai pune o lectie si despre cum sa facem site-ul public , sa poata fi vizualizat si de alti utilizatori , cum sa urcam o thema etc. ( imi pare rau ca am pus commentariul aici )

Piny a spus @Etic - 11.08.2010

Nu cred ca cererea ta are vreo legatura cu PHPul :-/

..::Ionutz::.. a spus Nu e greu php - 24.11.2010

Fratilor PHP nu e asa de greu cum vi se pare pentru inceput incepeti si voi cu ceva usor de exemplu luati un script de pe un upload luativa de pe google programul filezila ca e mai usor sa incarci scriptul pe host decat ftp si incepeti sa editati scriptul dupa placul vostru, acuma nu editati totul doar unde vine numele site-ului vostru de ex unde va apare aici $sitename va puneti numele site-ului vostru sau unde gasiti semnatura creeatorului powered sau created by$username(numele vostru sau ce vreti voi sa puneti) si vine asa powered by:Alin asta e un exemplu si cu timpul invatati voi si luativa dupa un wapmaster profesionist ca sa intelegeti mai bine:D


Adauga un comentariu la aceasta sectiune.