Ik heb een insert functie waarbij naast dat er gegevens naar de database worden geschreven er ook een foto wordt geupload. Ik gebruik JQUERY/AJAX om te beoordelen of alles naar wens verloopt. Nu heb ik op dit moment het volgende in de functie:
Nu is mijn vraag is dit wel de juiste benadering? Want als de foto wel word geupload naar de folder maar er gaat iets mis met de insert dan is de gehele query nutteloos en andersom het zelfde. Of zie ik het verkeerd. Hoe zouden jullie dit aanpakken?
Transactie er omheen, rollback als het mislukt als je eerst de insert doet.
En anders foto's verwijderen als er iets mis gaat. Dat moet toch al, want je kan niet garanderen dat na de eerste foto de tweede ook lukt.
Side-note: als je file toch al uit $_FILES komt, dan is het een uploaded file (en kan de gebruiker de tmp_name nooit "faken"), en is die is_uploaded_file() eigenlijk niet meer nodig (tenzij je d'r ergens daarvoor zo'n enorme puinhoop van hebt gemaakt dat je niet kunt garanderen dat $_FILES niet door een gebruiker kan worden aangepast, dan is het een handige check, maar dan moet je je wel even achter je oren gaan krabben mbt die puinhoop).
Die is_uploaded_file() is nog een overblijfsel uit PHP 4, toen er nog geen $_FILES was.
@- Ariën -. Omdat het hier een upload formulier betreft waar de eigenaar van de website de gegevens van een video insert/upload (titel, link, omschrijving, foto) Er is geen enkele reden voor deze persson om een PHP file up te loaden. Als jullie dit anders zouden doen kom dan even met een voorbeeld!
Als iemand (als is het iemand die niet in de beheerbackend mag komen) een PHP-script kan uploaden, kan je de sjaak zijn. Volledige controle over je site is mogelijk, veiligheidsbarrières kunnen worden overruled, data kan uitlekken etc....
Daarom zou ik (en Thomas zou vast hetzelfde zeggen, denk ik) om [php]getimagesize[/php] of [php]FileInfo[/php] te gebruiken. Controleer ook ALTIJD op mime-types en het laatste deel van een extentie.
Nog mooier is om het wiel niet nogmaals uit te vinden, en een bestaande class te gebruiken. Ikzelf gebruik voor mijn uploadsysteem in mijn beheerbackend de UploadClass van Verot.net. Erg veelzijdig en makkelijk in gebruik. Vooral als je nog een PlUpload gebruikt.
Nu is mijn vraag is dit wel de juiste benadering? Want als de foto wel word geupload naar de folder maar er gaat iets mis met de insert dan is de gehele query nutteloos en andersom het zelfde. Of zie ik het verkeerd. Hoe zouden jullie dit aanpakken?
Het is een goede zaak om je "zorgen" te maken en vraagtekens te plaatsen bij de betrouwbaarheid van informatie die wordt aangeleverd door anderen. Hierbij is het een "gezonde" houding om hier altijd (licht) paranoïde over te zijn (Do Not Trust User Data).
Ook is het zaak dat de informatie die wordt aangeleverd in de goede vorm wordt aangeleverd. Daartoe worden formuliergegevens meestal eerst gevalideerd, en daarna (na succesvolle validatie) verwerkt. Dit ook om te garanderen dat het proces voor verwerking goed verloopt want dat proces doet namelijk meestal aannames over de (vorm van) de input.
Als het zaak is dat er pas een record geïnsert wordt als er een afbeelding succesvol is geupload (en op de goede plek is gezet), insert dan pas een record nadat je hebt vastgesteld dat:
- de upload succesvol was
- het inderdaad een afbeelding betrof
- die de juiste afmetingen en grootte had
- waarbij het verplaatsen / hernoemen / resizen / whatever ook allemaal is gelukt en de afbeelding dus op zijn uiteindelijke bestemming in zijn uiteindelijke vorm staat
Het record is als het ware (of zou dit wellicht moeten zijn) een bevestiging / getuige van het slagen van alle bovengenoemde stappen.
En wat @Ben zegt: als alle informatie (afbeelding en anderszins) in één handeling wel of juist niet verwerkt zou moeten worden (zodat er geen onvolledige of ronduit niet kloppende informatie in je db komt te staan) zul je dus van database-transacties gebruik moeten maken.
Dit garandeert dat alle database-bewerkingen in zijn geheel worden doorgevoerd (als alles klopt) of in zijn geheel niet (als er iets niet klopt).
Onderstaand script controleert of het geuploade bestand daadwerkelijk een image is:
// aangenomen dat bestand is gekozen en dan controleren
if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
die("Upload foutgegaan " . $_FILES['file']['error']);
}
$info = getimagesize($_FILES['file']['tmp_name']);
if ($info === FALSE) {
die("Alleen images/afbeeldingen kunt u uploaden. Dit bestand is niet geldig");
}
if (($info[2] !== IMAGETYPE_GIF) && ($info[2] !== IMAGETYPE_JPEG) && ($info[2] !== IMAGETYPE_PNG)) {
die("Let op, bestand is geen gif/jpeg/png");
}
@- Ariën - en @Thomas De vraag is niet of het wel een foto is die wordt geupload 3n of deze wel aan de grote voldoet. De vraag was/is of de volgorde die ik voor ogen had in orde is. Jullie denken toch niet dat ik niet check op extensies of grote van het bestand? Om aan te tonen wat ik van plan was heb ik alleen dat gedeelte van de functie laten zien en als je goed kijkt zien jullie ook dat ik zebra image (image manipulatie) gebruik om te bepalen wat de grote van de images is die worden weggezet. Dus dan is inderdaad de oplossing van Ben
denk ik de oplossing waar ik verder naar moet kijken
@Ben. Bedankt daarvoor.
@Jan te Pas. Bedankt voor deze informatie. Ga ik inderdaad even verder naar kijken