CREATE TABLE IF NOT EXISTS `producten` (
`product_id` int(11) NOT NULL AUTO_INCREMENT,
`cat_id` int(11) NOT NULL,
`titel` varchar(50) NOT NULL,
`beschrijving` text NOT NULL,
`foto_url` varchar(225) NOT NULL,
`prijs` varchar(5) NOT NULL,
`korting` enum('ja','nee') NOT NULL,
`korting_verschil` varchar(10) NOT NULL,
`beginpagina` enum('spotlight','beginpagina','nee') NOT NULL,
`korting_prijs` varchar(5) NOT NULL,
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
CREATE TABLE IF NOT EXISTS `categorie` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`titel` varchar(30) NOT NULL,
`soort` enum('standaard','korting','laatst','beginpagina') NOT NULL,
`aantal` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;
CREATE TABLE IF NOT EXISTS `producten` (
`product_id` int(11) NOT NULL AUTO_INCREMENT,
`cat_id` int(11) NOT NULL,
`titel` varchar(50) NOT NULL,
`beschrijving` text NOT NULL,
`foto_url` varchar(225) NOT NULL,
`prijs` varchar(5) NOT NULL,
`korting` enum('ja','nee') NOT NULL,
`korting_verschil` varchar(10) NOT NULL,
`beginpagina` enum('spotlight','beginpagina','nee') NOT NULL,
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.
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
Thomas - 04/04/2016 15:25 (laatste wijziging 04/04/2016 15:28)
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.
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 ?
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
- 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:
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.
@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.
Thomas - 04/04/2016 22:22 (laatste wijziging 04/04/2016 22:22)
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?
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 ?
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.
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).
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
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.
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..?