[Project MediaDB] Update #1

Door rusman op zaterdag 2 mei 2009 19:50 - Reacties (10)
Categorie: Project MediaDB, Views: 4.399

Inmiddels al weer een tijdje verder, en eigenlijk weinig opgeschoten. Helaas waren er dingen die meer prioriteit vroegen, dus die dingen voor. Toch zijn er al wel wat vorderingen. Afgelopen week ben ik met vakantie geweest, en daar heb ik de tijd gevonden om toch even bezig te gaan met dit project.

Wat is er gebeurd?
Ik richt me in de beginfase van dit project eerst zoveel mogelijk op de basis van het programma. Dit heeft op dit moment ervoor gezorgd dat ik nu een overzicht kan tonen met informatie uit de database, en items kan toevoegen aan deze database. Geen lastige klus, maar er zijn toch een paar dingen waar ik nog over aan het nadenken ben.

Ten eerste de al meermaals besproken categorieŽn. Ik heb in het bestand toevoegen.php een formulier zitten waarin je de naam kan ingeven, en de categorie kunt kiezen. De categorieŽn staan in een dropdown box die zijn informatie rechtstreeks uit de database haalt. Tot zover geen probleem zou je zeggen. Het probleem zit hem een beetje in het feit dat ik in de huidige code de categorieŽn in de dropdown box met de naam ophaal, en zodra een item in de database word geplaatst met een id genoemd word. Om de goede naam bij het nummer te krijgen heb ik een if-else constructie gebruikt:

PHP:
1
2
3
4
5
6
7
if($_POST["catNaam"] == "Serie"){
            $catId = 1;
        }
        else if($_POST["catNaam"] == "Film"){
            $catId = 2;
        }
}


Dit werkt natuurlijk, maar ik vind het zelf geen mooie optie. Het grootste nadeel is dat je niet makkelijk een extra categorie kunt toevoegen via een web-based admin. Je moet hiervoor dan ook de code aanpassen, door een extra else-if erin te zetten. Nu kan dit natuurlijk anders door gewoon in de database ook met categorie namen te werken in plaats van een categorie id. Maar mijn vraag is nu, is dat wel slim? Ik zelf denk dat er niet zoveel mis mee is. Omdat je de categorie toch uitkiest door op de betreffende naam te klikken, dus er kan geen typefout gemaakt worden.

Het 2e probleem is in tegenstelling tot het eerste probleempje wat moeilijker. De locatie van een item in mijn “kaartenbak” word bepaald door het item-id. Ik heb geprobeerd dit automatisch te laten doen door de database met de functie “auto_increment”. Dit werkte dacht ik, tot dat ik een item verwijderde en een nieuwe toevoegde. Nu werd het verwijderde nummer overgeslagen, en verder geteld waar hij gebleven was. Dit is nou net niet de bedoeling. Ik wil namelijk een systeem dat automatisch zoekt naar lege plekken in de database en daar een nieuw item neerzet. Stel ik heb een database met een inhoud van 5 plaatsen:

1. Bezet
2. Bezet
3. Vrij
4. Bezet
5. Vrij

Nu zou er wanneer ik iets toevoeg aan de database eerst iets op plek 3 moeten zetten, voordat hij overgaat naar plek 5. Dit is wel te realiseren natuurlijk door een status mee te geven aan ieder item. Alleen wanneer je de query ‘Delete from overzich where naam=”test”’ dan verwijder je in principe de hele row uit de database. Ik zou dus eigenlijk moeten kiezen een query waarin ik de row update naar null waardes. Ik kan dan in het overzicht alle rows waar de waarde null is eruit filteren. Maar… Wat wanneer ik een nieuwe row moet toevoegen aan de database. Hoe zou ik dit moeten doen als ik het zou doen op bovenstaande manier. Mij lijkt het meest voor de handliggende om hier een if-else te gebruiken. In de if de constructie voor wanneer er nog vrije plekken zijn, en in de else voor als er een nieuwe rij moet worden aangemaakt.

Graag hoor ik even hoe jullie hierover denken, en wat er anders/beter zou kunnen. Ik weet dat dit soort dingen voor de meesten natuurlijk heel makkelijk zijn, maar ik wil me ook richten op mensen die hier nog wel van kunnen leren. Verder wil ik jullie ook betrekken bij dingen die mij bezig houden wat betreft het programmeren. En voor doordat ik hier mijn gedachten neerschrijf aan het typen ben, krijg ik tijdens het schrijven ook weer nieuwe ideeŽn hoe ik mijn problemen zou kunnen oplossen.
Wanneer ik tijd heb ik zal ik meteen een plek zoeken waar ik mijn project online kwijt kan. (open source)

Tot zover, nu eerst mijn tas maar eens uitpakken!

Volgende: Back to normal life... 09-'09 Back to normal life...
Volgende: [Project MediaDB] Inleiding + de eerste stappen 04-'09 [Project MediaDB] Inleiding + de eerste stappen

Reacties


Door Tweakers user sanzut, zaterdag 2 mei 2009 20:06

Ik zou je eerste probleem oplossen door de value van de option in te stellen op het ID. Het tweede probleem is in mijn ogen niet zo relevant, ik zou gewoon auto_increment gebruiken.

Door Tweakers user Kwastie, zaterdag 2 mei 2009 20:29

Je kunt beter i.p.v. dit een Switch statement gebruiken:

PHP:
1
2
3
4
5
6
7
if($_POST["catNaam"] == "Serie"){
            $catId = 1;
        }
        else if($_POST["catNaam"] == "Film"){
            $catId = 2;
        }
}




Zoiets dus:

PHP:
1
2
3
4
5
6
7
8
switch($_POST['catName']) {
    case 'Serie':
      $catId = 1;
      break;
    case 'Film':
      $catId = 2; 
      break;
}



Maar zo kun je in de toekomst nooit gemakkelijk een extra type toevoegen. Wat je zou kunnen doen is alle 'soorten' ophalen uit de database (Aannemend dat je een extra tabel hebt waarin categorieŽn zijn gedefinieerd) en deze weergeven in het formulier. Dan hoef je alleen maar te controleren of dit Id echt bestaat. En als je een extra categorie toevoegt word deze ook automatisch weergegeven op je formulier. :9

En maak je niet druk over 'verwijderde' velden (dus missende getallen). Waarom zou je? De data die er ooit in zat is nu weg. En een Id is alleen bedoelt om data uniek te kunnen identificeren. :Y)

[Reactie gewijzigd op zaterdag 2 mei 2009 20:42]


Door Tweakers user magiel, zaterdag 2 mei 2009 20:45

Zoals 'Kwastie' al zegt, een extra tabel waarin de catagorien staan. Deze tabel heeft dan 2 kolommen, CatID en CatNaam (oid). Vervolgens maak je in de tabel waarin je de informatie over de serie/film/meuk hebt staan, een kolom 'CatID' waarin je het script het ID van de catagorie laat wegschrijven.

PHPhulp.nl heeft een mooie uitleg over databasenormalisatie.
http://www.google.nl/sear...ogle+zoeken&meta=&aq=f&oq=

Door Tweakers user rusman, zaterdag 2 mei 2009 20:46

Waarom ik mij zo druk maak om de verwijderde velden is omdat ik hoesjes heb met een nummer erop. Deze wou ik laten corresponderen met de nummers in de database. Hiervoor zou ik ook een extra veld kunnen aanmaken, meer een id zou net zo makkelijk zijn dan.

In de praktijk moet het als volgt gaan:
Ik voeg een item toe, systeem geeft nummer terug aan mij in welk hoesje ik de cd/dvd kan stoppen. Ik wil namelijk niet eerst moeten zoeken naar een leeg hoesje (zijn er teveel om te zoeken)

Door Tweakers user Patriot, zondag 3 mei 2009 00:53

Een extra veld voor het nummer van het hoesje is in mijn ogen dan toch beter, dan dat waar je nu mee wilt gaan werken. Zo'n id moet je eigenlijk nooit veranderen, omdat je dan het risico loopt dat je later verwijzingen gaat krijgen naar objecten die opeens anders zijn. Dat risico is op dit moment wellicht klein, maar als je later gaat uitbreiden zal het risico alleen groter worden.

Wat betreft dat eerste probleem, vind ik je huidige oplossing niet erg goed. Het maken van verschillende categorieŽn is best simpel, en zal uiteindelijk gewoon de meeste mogelijkheden bieden. Je levert nu flexibiliteit in omdat je denkt dat een extra tabel niet goed is, en dat loop je snel op op het moment dat je wilt uitbreiden (ook al is die uitbreiding relatief klein).

Door Tweakers user AndriesLouw, zondag 3 mei 2009 02:20


PHP:
1
2
3
<?php
$catId = array_search($_POST['catName'],array(1=>'Serie',2=>'Film'));
?>


Kan vast korter nog ;)

Door Tweakers user chrashoverraid, zondag 3 mei 2009 11:28

Snap ik je vraag misschien niet over de categorieen?


HTML:
1
2
3
4
<select name="categorie" id="categorie" > 
<option value="1">Serie</option>
<option value="2">Film</option>
</select>



het stukje van hierboven icm met de waardes van een categorie tabel, en dan zou het moeten lukken.

excuus als ik het niet begrepen heb, maar het leek mij dat je je if-else constructie gebruikte om de naam om te zetten naar een categorie-id.

[Reactie gewijzigd op zondag 3 mei 2009 11:28]


Door Tweakers user fleppuhstein, zondag 3 mei 2009 17:38

De categorie vraag is al vaak goed beantwoord, het attribute value vullen met de categorie waarde. Zo is mede de opzet van een selectbox bedoeld. Dat een gebruiker begrijpelijke keuzes heeft, en je code over de goede waardes beschikt. Wil je dynamisch blijven is dit van belang.

Verder is de locatie van de DVD in je DJ-Koffer ? een eigenschap van de DVD, wellicht groeit dit in de toekomst uit naar Koffer nummer - DVD Nummer. Een auto increment ID is puur voor je DB van belang.

Door Tweakers user rusman, zondag 3 mei 2009 23:58

Ok, wat betreft de categorie lijkt het dus beter om de naam te gebruiken in plaats van zijn nummer? Maar wat als ik de naam dan ooit verander? Ik zal de code morgen hier maar even plaatsen.

Edit:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php

include_once("config.php");
$catId = 0;
$catNaam = 0;


if (isset($_POST["knopverstuur"])){
    if($_POST["naam"] == ""){
        print('Niet alle velden zijn ingevuld <br />');
    }
    else {  
        if($_POST["catNaam"] == "Serie"){
            $catId = 1;
        }
        else if($_POST["catNaam"] == "Film"){
            $catId = 2;
        }
        $sqltoev = "INSERT INTO overzicht SET naam = '".$_POST["naam"]."', catId = 1";
        mysql_query($sqltoev) or die (mysql_error());
        print("Item invoeren gelukt!");
    }
}


$sqlcat = mysql_query("SELECT * FROM categorie");


print('<form method="get" action="toevoegen.php">
            <input type="text" name="naam" id="naam"><br />
            Categorie:
            <select name="catNaam">');

            for($i=0;$i<mysql_num_rows($sqlcat);$i++){
                $aRow = mysql_fetch_assoc($sqlcat);
                print("<option>".$aRow["catNaam"]."</option>");
            }
            print('</select> <br />
            <input type="submit" name="knopverstuur" id="Verstuur" value="Toevoegen">
        </form>');
 
?>



Op dit moment is de enige locatie inderdaad een dj-koffer. Deze heeft hoesjes met nummers. In principe moet het systeem weten welke nummers er vrij zijn. Zodat ik niet hoef te zoeken naar een leeg hoesje maar gewoon meteen hoesje nummer XX kan pakken die het systeem aangeeft dat ik de DVD in moet stoppen. In de toekomst wil ik dit uitbreiden met wellicht andere locaties zoals een kast of een rekje.

[Reactie gewijzigd op maandag 4 mei 2009 00:03]


Door Tweakers user ReseTTim, maandag 4 mei 2009 09:58

gebruik anders de 'streepjescode' als uniek getal en maak hier een primary key van.

verder is het misschien inderdaad een idee om een tabel 'categorie' aan te maken.

Reageren is niet meer mogelijk