login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Fout bij het uploaden (Opgelost)

Offline advertentiep - 04/04/2016 14:08 (laatste wijziging 04/04/2016 14:29)
Avatar van advertentiepPHP interesse Aangezien het zo rustig is schotel ik nog een probleem voor.

Structuur mappen:
  1. index.php
  2. 404.php
  3. config.php
  4.  
  5. -- Admin
  6. ---- product_toevoegen.php (probleem)
  7.  
  8. -- Toevoeging
  9. ---- CSS
  10. ---- IMG
  11. ------ Producten (hier moeten de afbeeldingen komen).


Tabel categorien / producten:
  1. CREATE TABLE IF NOT EXISTS `producten` (
  2. `product_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `cat_id` int(11) NOT NULL,
  4. `titel` varchar(50) NOT NULL,
  5. `beschrijving` text NOT NULL,
  6. `foto_url` varchar(225) NOT NULL,
  7. `prijs` varchar(5) NOT NULL,
  8. `korting` enum('ja','nee') NOT NULL,
  9. `korting_verschil` varchar(10) NOT NULL,
  10. `beginpagina` enum('spotlight','beginpagina','nee') NOT NULL,
  11. `korting_prijs` varchar(5) NOT NULL,
  12. PRIMARY KEY (`product_id`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
  14.  
  15. CREATE TABLE IF NOT EXISTS `categorie` (
  16. `id` int(11) NOT NULL AUTO_INCREMENT,
  17. `titel` varchar(30) NOT NULL,
  18. `soort` enum('standaard','korting','laatst','beginpagina') NOT NULL,
  19. `aantal` int(11) NOT NULL,
  20. PRIMARY KEY (`id`)
  21. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;


Uitleg php code
1. Ik controleer of de map "producten" bestaat, anders aanmaken.
2. simpele controle input (moet nog aangescherpt worden).
3. In het voorbeeld komen er meerder upload-forms, daarom $_FILES = array();
4. Controle afbeelding grote (moet ik beter berekenen) en formaat.
5. Ik filter de extensie na de punt.
6. Verplaats de afbeeldingen naar map "producten".
7. zet de (in de toekomst 6 upload-forms) afbeeldingen weg: titel_(1 t/m 6) . extensie.
8. vervolgens foutmeldingen wegzetten in array.
9. Controle of er 1 of meerdere fouten zijnn.
10. inserten in DB, anders mysql_error.

wat we kunnen uitsluiten
- Of er is een DB connectie gemaakt, ja en getest.
- Wordt de pagina ge-include ? ja.

foutmelding
Geen, ondanks error_reporting(E_ALL);

Script:
Plaatscode: 142502

PS; focus ligt op PHP, HTML validatie volgt.
PS2; ik zet alle data 'rauw' weg, in me config worden alle $_POST en $_GET verzorgd op input / output.

EDIT: INSERT INTO (8 kolommen) VALUES (7 waarden) - dit is aangepast.
EDIT2: id = value geworden in me dropdown.

16 antwoorden

Gesponsorde links
Offline Thomas - 04/04/2016 15:25 (laatste wijziging 04/04/2016 15:28)
Avatar van Thomas Moderator
Citaat:
3. In het voorbeeld komen er meerder upload-forms, daarom $_FILES = array();

Maar daar gooi je $_FILES leeg... Alles wat hierin stond ben je dus kwijt. Je hoeft $_FILES ook niet te initialiseren.

Daarnaast, als je een bestand upload onder de naam afbeeldingen[] (met array-haken), dan is de structuur van $_FILES anders. Je kunt dan het eerst bestand vinden onder $_FILES['afbeeldingen']['name'][0], $_FILES['afbeeldingen']['type'][0] et cetera.

Daarbij zou je $_FILES[<uploadveldnaam>]['error'][<index van bestand>] moeten controleren of deze geen fouten heeft, oftwel foutcode 0, of beter vergelijken met de constante UPLOAD_ERR_OK.

En tot slot is een extensie niet echt een fantastische indicatie of je daadwerkelijk met een afbeeldingen van doen hebt. Je zou een hele rudimentaire check uit kunnen voeren met getimagesize(). Wanneer deze functie false retourneert heb je waarschijnlijk niet met een afbeelding van doen.

EDIT: en waarom geen array-constructie (noem alle velden gewoon afbeeldingen[] ofzo) maar afbeelding_1, afbeelding_2 et cetera? Die laatste methode lijkt mij een stuk foutgevoeliger en omslachtiger.
Offline advertentiep - 04/04/2016 15:57 (laatste wijziging 04/04/2016 16:05)
Avatar van advertentiep PHP interesse Duidelijk. array(); van maken is inderdaad niet nodig. forms dezelfde naam toekennen is dus mogellijk (want het is een array). ['error'] kende ik niet. En de constante UPLOAD_ERROR_OK was ik ook niet bekend mee.

wat betreft de uploadhack is het wel een goede, ik was hier al over aan het nadenken.
Ik dacht in eerste instantie dat ik een php code niet kon opslaan als png maar dat lukt dus wel.
Als ik er naar surf en de afbeelding (code) opvraag krijg ik gelukkig wel de foutmelding "de afbeelding kan niet worden weergegeven, omdat deze fouten bevat" (wordt als img weergegeven!).

print_r(); gaf inderdaad duidelijkheid over de volgorde van $i in de array (foutje)

edit: is de array_push / implode constructie wel correct ?
Offline Rens - 04/04/2016 16:18
Avatar van Rens Gouden medaille

Crew algemeen
Regel 49: http://php.net/...d-file.php
move_files_upload bestaat niet 

Wat is (verder) nog het probleem?
Je titel is "Fout bij het uploaden" maar je geeft niet aan wat er fout gaat.
Of is het dat bestanden niet naar de juiste map worden verplaatst?
Dat zal door bovenstaande waarschijnlijk opgelost worden 
Offline advertentiep - 04/04/2016 16:27 (laatste wijziging 04/04/2016 16:34)
Avatar van advertentiep PHP interesse Hi Rens bedankt!

Uploaden is weer even een nieuwe tak van sport voor mij, dus het is nog zoeken (ook met die 3d array's etc).

Gek genoeg krijg ik geen foutmeldingen op deze pagina (er gebeurt nu niks).

Edit; ik heb de functie aangepast Rens.

Ok vergelijking met de error constante:
  1. switch ($_FILES['afbeelding']['error'])
  2. {
  3. case UPLOAD_ERR_OK:
  4. break;
  5.  
  6. case UPLOAD_ERR_NO_FILE:
  7. $aError[] = 'Geen bestand';
  8.  
  9. case UPLOAD_ERR_INI_SIZE:
  10. case UPLOAD_ERR_FORM_SIZE:
  11. $aError[] = 'Te groot.';
  12.  
  13. default:
  14. $aError[] = 'Onbekende error';
  15. }





Offline Thomas - 04/04/2016 16:28
Avatar van Thomas Moderator Dunno, maar:

- split() is een (verouderde) alias, gebruik explode()
- $sFoto wordt nergens gebruikt?
- $aExtensie is geen array van extensies, maar een array van MIME types; getimagesize() retourneert ingeval het een afbeelding betreft ook een MIME type, wellicht kun je hier iets mee

Ook geeft split() / implode() niet altijd de extensie.

Beschouw de volgende invoer: dit.is.een.test.jpg, ook bestaat een extensie niet altijd uit 3 karakters (denk aan pjpeg, jpeg etc.). Een betere manier om de extensie te vangen is wellicht:
  1. <?php
  2. $invoer = 'dit.is.een.test.jpg';
  3. $extensie = array_pop(explode('.', $invoer));
  4. ?>

Uiteraard zijn vele varianten mogelijk.

Ook zou ik iets niet eerst uit elkaar halen en dan weer in elkaar zetten, de invoer was al goed, dus zou ik hier niet meer in modderen. Het enige waar je in geinteresseerd bent is de extensie, deze mag je best (tijdelijk) in een aparte variabele onderbrengen. Maar je zou dus ook gebruik kunnen maken van getimagesize().

Ook wil je waarschijnlijk enige controle over de uiteindelijke naam van een afbeelding. Bijvoorbeeld dat deze een vast stramien krijgt. Je kunt dan altijd nog ergens de oorspronkelijke naam (waaronder deze is geupload) bijhouden.
Offline advertentiep - 04/04/2016 16:36 (laatste wijziging 04/04/2016 16:44)
Avatar van advertentiep PHP interesse @thomas ok; deze had ik inderdaad uit een oud script van je.
Ik weet dat er verschil zit in aantal karakters tussen gif vs jpeg (3 om 4), daarom substr -4 zit je altijd goed toch ?


Citaat:
$sFoto wordt nergens gebruikt ?


ik had het bericht aangepast (de missende value was idd $sFoto).
EDIT: INSERT INTO (8 kolommen) VALUES (7 waarden) - dit is aangepast.

Offline Thomas - 04/04/2016 22:22 (laatste wijziging 04/04/2016 22:22)
Avatar van Thomas Moderator
Citaat:
Ik weet dat er verschil zit in aantal karakters tussen gif vs jpeg (3 om 4), daarom substr -4 zit je altijd goed toch ?

De extensie van een bestand is alle tekst na de laatste punt in een bestandsnaam.

Mijn voorgaande codesnippet dekt dit altijd, ongeacht het aantal karakters.

Welke problemen zijn er nu nog? Hoe ziet je code er op dit moment uit?
Offline advertentiep - 05/04/2016 13:22 (laatste wijziging 05/04/2016 13:35)
Avatar van advertentiep PHP interesse Plaatscode: 142503

Het is een beetje een rommeltje door de if-statements en vervolgens de switch. Ik wil heel erg graag een output in de vorm van een error dat ik kan testen/spelen met formaten en extensies om het script de juiste settings mee te geven.

Op dit moment gebeurt er helemaal niks..en ik "zie het even nier meer" kijk al te lang naar een niet-werkende code.

EDIT: is de directe controle met getimagesize() goed of moet de array vergelijken zowel breedte als hoogte ?

<> == != ?

edit 2: 2 dropdown menu's aangepast id -> value
Offline Thomas - 05/04/2016 13:49
Avatar van Thomas Moderator Is dat alle code? Wordt deze nog geinclude in een ander bestand?

De output vormt op dit moment geen geldig HTML document :/

---

Anyway,
Ik zou getimagesize(...) gewoon vergelijken met false (=== false). Als deze vergelijking opgaat weet je zeker dat het géén afbeelding betreft. Zoniet, dan heb je enige garantie dat het een afbeelding betreft.

Ik zie trouwens geen breaks in je switch-statement? Als je deze weglaat kan het zijn dat meerdere cases worden behandeld, en de default wordt dan altijd uitgevoerd...

Net zoals bij het installatiescript (dit was ook een vraag van jou geloof ik?) zou ik hier ook gaan voor een aanpak die de verschillende stappen wat meer uit elkaar trekt. Enerzijds heb je het formulier + eventueel feedback van fouten, en anderzijds de verwerking hiervan. Je zult dan nog wel op een of andere manier de fouten van het ene naar het andere deel moeten overhevelen (en dit is dus wat overhead die je introduceert), maar het eindresultaat is wel dat je het weergeven en het verwerken in afzondering kunt behandelen, en daarmee ook de fouten die in beide gevallen mogelijk optreden in afzondering kunt oplossen.

Door deze verdeel-en-heers strategie wordt het eenvoudiger om deze functionaliteit te ontwikkelen en... te debuggen. De stappen zijn in dat geval veel minder (eigenlijk in het geheel niet) met elkaar verweven dan nu het geval is, wat ook een positief gevolg heeft voor de complexiteit van je code.
Offline advertentiep - 05/04/2016 14:06 (laatste wijziging 05/04/2016 15:56)
Avatar van advertentiep PHP interesse Het is een ongeldig form omdat dit er staat:
<option id="value"> wat natuurlijk <option value="waarde"> moest zijn.

=== false aangepast.

switch tijdelijk verwijdert.

Thomas ik ben deze weg ingeslagen en ik heb al toegegeven aan een snellere / nette / efficiënte wijze van scripten in de toekomst. Echter heb ik nog 10 pagina's te gaan om dit hobbymatige project af te ronden en doe ik dat op deze wijze van scripten.

Hoe weet jij of het document ongeldig is, heb jij het draaiend ? krijg jij een php foutmelding ?

Ik include deze file via (navigatie ?pagina=) en dus ook de config (deze wordt vanuit de index?pagina= geinclude).

  1. if ($_FILES['size'][$i] < 1000)
  2.  
  3. is
  4.  
  5. if ($_FILES['afbeelding']['size'][$i] < 1000)

geworden.
----------------------------------------------------


Ik ben aan het winnen van PHP!
http://develop....voegen.php

- bij een include pagina=nieuw_product werkt het alleen nog niet.
- png kan ik nog niet uploaden, maar dat komt goed.

PS wat is een een gangbaar file size die je toe moet laten ? (6 afbeeldingen per product) max 10 categorieën met max 10 producten per categorie.
Offline Thomas - 05/04/2016 15:55
Avatar van Thomas Moderator
Citaat:
Hoe weet jij of het document ongeldig is, heb jij het draaiend ? krijg jij een php foutmelding ?

Ik include deze file via (navigatie ?pagina=) en dus ook de config (deze wordt vanuit de index?pagina= geinclude).

Bovenstaande code is dus niet volledig. Dan kan ik niet zeggen of deze geldig of ongeldig is (of deze uiteindelijk al dan niet een kloppend HTML document oplevert).

Werkt het nu?

Zo niet, herhaal het volgende:
- wat gaat er mis
- waar blijkt dit uit
- welke code ligt hier aan ten grondslag
- pas deze code aan
- bedenk wat de functionaliteit idealiter zou moeten doen en test de aanpassing om dit te toetsen
- indien dit nog steeds niet het gewenste resultaat oplevert, terug naar de eerste stap

Net zolang totdat het werkt.
Offline advertentiep - 05/04/2016 15:58 (laatste wijziging 05/04/2016 16:22)
Avatar van advertentiep PHP interesse Ik ben aan het winnen van PHP!
http://develop....voegen.php

  1. if (getimagesize($_FILES['afbeelding']['tmp_name'][$i]) === false)

De bijhorende foutmelding (else) krijg ik weergegeven.

var_dump resultaat $_FILES
  1. array(1) { ["afbeelding"]=> array(5) { ["name"]=> array(6) { [0]=> string(8) "logo.png" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } ["type"]=> array(6) { [0]=> string(9) "image/png" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } ["tmp_name"]=> array(6) { [0]=> string(14) "/tmp/phpli7l2P" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } ["error"]=> array(6) { [0]=> int(0) [1]=> int(4) [2]=> int(4) [3]=> int(4) [4]=> int(4) [5]=> int(4) } ["size"]=> array(6) { [0]=> int(4465) [1]=> int(0) [2]=> int(0) [3]=> int(0) [4]=> int(0) [5]=> int(0) } } }


EDIT: ik gebruikte /mapnaam, slash weggehaald en het werkt nu ook in me include (pagina systeem). Ik krijg nog wel de melding dat het bestand niet een afbeelding bevat.

EDIT: het werkt voor 90% data wordt keurig weggezet, tmp -> name (dus bovestaande is opgelost). Echter alleen nog de map aanmaken.
Offline Thomas - 05/04/2016 16:24
Avatar van Thomas Moderator Het if-statement die kijkt of het type voorkomt in $aExtensie is dan mogelijk nog verkeerd ($_FILES heeft hier wellicht nog niet de goede opbouw?).
Offline advertentiep - 05/04/2016 16:29 (laatste wijziging 05/04/2016 17:01)
Avatar van advertentiep PHP interesse werkt voor 95% nu zijn we echt dicht bij.

map producten is aangemaakt (zag de map alleen niet in me FTP client terug maar wel op de server):
afbeeldingen zien er in de map zo uit:
test_0.png

Inde database:
0png

EDIT HET WERKT
  1. array_push ($aFotoURL, $_POST['titel'] . '_' . $i . '.'. $sExtensie . ';');


was voorheen incompleet!

Ik heb nu ook wel geleerd om te debuggen op de pagina zelf:
www.website.nl/index/map/pagina.php

ipv
www.website.nl/index.php?pagina=pagina.php
want daar geeft de pagina blijkbaar geen foutmelding(en)

super bedankt Thomas en Rens!

EDIT: iets te snel op het knopje 'opgelost' gedrukt.
Offline Rens - 05/04/2016 16:57
Avatar van Rens Gouden medaille

Crew algemeen
advertentiep schreef:
Ik heb nu ook wel geleerd om te debuggen op de pagina zelf:
www.website.nl/index/map/pagina.php

ipv
www.website.nl/index.php?pagina=pagina.php
want daar geeft de pagina blijkbaar geen foutmelding(en)


Heb je misschien op je "index.php" ook een error_reporting staan die NONE aangeeft?
Misschien overruled die error_reporting dan wel degene die je op "pagina.php" aangeeft..?
Offline advertentiep - 05/04/2016 17:03 (laatste wijziging 05/04/2016 17:18)
Avatar van advertentiep PHP interesse Rens, De volgorde gezien de include regelnummering:
eerst: pagina.php (ERROR_REPORTING(E_ALL);
Dan: index.php (ERROR_REPORTING(E_ALL);

Goeie suggestie, ik zal de regel uit de pagina's laten en bij de index.php behouden!

wordt de m_u_f() in de for-lus eenmalig uitgevoerd ?
  1. for ($i = 0; $i < count($_FILES); $i++)
  2. {
  3. if ($_FILES['afbeelding']['size'][$i] < 10000)
  4. {
  5. if (in_array($_FILES['afbeelding']['type'][$i], $aExtensie))
  6. {
  7.  
  8. if (getimagesize($_FILES['afbeelding']['type'][$i]) === false)
  9. {
  10.  
  11. $sExtensie = array_pop(explode('.', $_FILES['afbeelding']['name'][$i]));
  12.  
  13.  
  14. if (move_uploaded_file($_FILES['afbeelding']['tmp_name'][$i], 'Toevoeging/IMG/producten/' . trim($_POST['titel']) . '_' . $i . '.' . $sExtensie))
  15. {
  16. array_push ($aFotoURL, trim($_POST['titel']) . '_' . $i . '.'. $sExtensie . ';');
  17.  
  18. }
  19. else
  20. {
  21. $aError[] = 'Er ging wat mis bij het verplaatsen van de afbeeldingen.';
  22. }
  23. }
  24. else
  25. {
  26. $aError[] = 'Afbeelding is niet geupload. Controleer of de bestanden ook daadwerkelijk een afbeelding is.';
  27. }
  28. }
  29. else
  30. {
  31. $aError[] = 'Afbeelding (veld: ' . $i . ') bevat niet de juiste extensie (*.png, *.jpg, *.jpeg en *.gif).';
  32. }
  33. }
  34. else
  35. {
  36. $aError[] = 'Afbeelding (veld: ' . $i . ') is te groot, maximale groote is (1000).';
  37. }
  38. }
  39. print_r($aFotoURL);

Er wordt maar 1 afbeelding in de map "producten" geplaatst en de array_push(); plaatst maar 1 item ?

DEFINITIEF OPGELOST:
  1. for ($i = 0; $i < count($_FILES); $i++)

is
  1. for ($i = 0; $i < count($_FILES['afbeelding']); $i++)


geworden
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.289s