Avatar billede Slettet bruger
12. juli 2017 - 19:08 Der er 22 kommentarer og
1 løsning

Registeringssystem

Hej,

Jeg søger et simpelt script eller evt. hjælp til udvikling af et registreringssystem.
Det skal fungere på nogenlunde denne måde;
1. Det skal først og fremmest kunne køre via en mobilside på iPad.
2. Det skal være muligt at kunne registrere deltagere på en given træning/et givent arrangement. Der skal gerne være en form for statistik over hvem der deltager hvor mange gange.
3. Jeg tænker følgende struktur: 1. Vælg ugedag, 2. Vælg arrangementstype, 3. Register medlemmer, 4. Opret evt. nye medlemmer.
4. Evt. side med statistik.
5. Det skal gerne udvikles med en tilknytning til en MySQL-database.

Hvem kan hjælpe?
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 19:57 #1
>Jeg søger et simpelt script
findes ikke, det er relativt komplext

1)
byg det op omkring feks twitter bootstrap http://getbootstrap.com/


2), 3), 4)
så vil det være naturligt med en database

hvordan ser dine tabel structure ud ?? (database design)
hvilke database API (extension) har du tænkt dig at anvende fra PHP ?? (mysqli, PDO, ODBC)
http://php.net/manual/en/mysqlinfo.api.choosing.php


hvor langt er du kommet ??

start med at lave dit database design. når detter er på plads kan du komme vidre, med at lave resten
Avatar billede Slettet bruger
12. juli 2017 - 20:09 #3
Jeg er ikke gået igang endnu. Jeg ville høre om der fandtes et smart system-script allerede man kunne bruge eller om der var en der havde lavet noget lignende tidligere :-) Men jeg vil prøve at arbejde videre med det.
Avatar billede Slettet bruger
12. juli 2017 - 20:32 #4
Hvor får jeg forbundet mine tre tabeller.
Det skal gerne være således at et "Medlem" er tilknyttet nogle "Hold". Hvert "Hold" har nogle specifikke "Traeninger". Hvert "Medlem" skal kunne tilknyttes de enkelte "Traeninger". Se min nuværende tabelstruktur.


-- Struktur-dump for tabellen `Hold`
--

CREATE TABLE IF NOT EXISTS `Hold` (
`HoldID` int(11) NOT NULL,
  `Navn` varchar(255) NOT NULL,
  `AntalMedlemmer` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `Medlem`
--

CREATE TABLE IF NOT EXISTS `Medlem` (
`MedlemID` int(11) NOT NULL,
  `Navn` varchar(255) NOT NULL,
  `Alder` int(11) NOT NULL,
  `Aldersgruppe` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `Traeninger`
--

CREATE TABLE IF NOT EXISTS `Traeninger` (
`TraeningID` int(11) NOT NULL,
  `Dato` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Begrænsninger for dumpede tabeller
--

--
-- Indeks for tabel `Hold`
--
ALTER TABLE `Hold`
ADD PRIMARY KEY (`HoldID`);

--
-- Indeks for tabel `Medlem`
--
ALTER TABLE `Medlem`
ADD PRIMARY KEY (`MedlemID`);

--
-- Indeks for tabel `Traeninger`
--
ALTER TABLE `Traeninger`
ADD PRIMARY KEY (`TraeningID`);

--
-- Brug ikke AUTO_INCREMENT for slettede tabeller
--

--
-- Tilføj AUTO_INCREMENT i tabel `Hold`
--
ALTER TABLE `Hold`
MODIFY `HoldID` int(11) NOT NULL AUTO_INCREMENT;
--
-- Tilføj AUTO_INCREMENT i tabel `Medlem`
--
ALTER TABLE `Medlem`
MODIFY `MedlemID` int(11) NOT NULL AUTO_INCREMENT;
--
-- Tilføj AUTO_INCREMENT i tabel `Traeninger`
--
ALTER TABLE `Traeninger`
MODIFY `TraeningID` int(11) NOT NULL AUTO_INCREMENT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 20:55 #5
hurtig tanke, du kan lave en samlings / mapnings tabel


CREATE TABLE `map_medlem_hold_traeninger` (
  `id` int(11) NOT NULL,
  `hold_id` int(11) NOT NULL,
  `medlem_id` int(11) NOT NULL,
  `training_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


ALTER TABLE `map_medlem_hold_traeninger`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `map_medlem_hold_traeninger`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Avatar billede Slettet bruger
12. juli 2017 - 21:08 #6
`hold_id` int(11) NOT NULL,
`medlem_id` int(11) NOT NULL,
`training_id` int(11) NOT NULL

Skal ovenstående ikke være identiske med mine PRIMARY KEYs i andre tabeller?
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 21:52 #7
#6
de svare til dine primære nøgler, jeg kalder dem af vane altid tabel_id
og min primære key hedder altid id, men det er hvad man syntes er nemmest.
således ved jeg altid hvor primær nøgle er og fremmed nøgle


nogle bruger sammen navn i bække tabeller, men så kan man ikke se hvor primær nøgle er og hvor fremmes nøgle er.

andre sætter PK_ foran primær nøgle og FK_ foran fremmed nøgler.
feks vil `MedlemID` i Medlem hedde PK_MedlemID og FK_MedlemID i mapnings tabellen / andre tabeller

nogle værktøjer gør det nemmere hvis din primære nøgle altid hedder id




når jeg kigger på tabellen Medlem slår det mig alder er et heltal, jeg havde forvendtet det var at typen date / datetime og kalde det for dob (day of birth)
Aldersgruppe ved jeg ikke hvad dækker over, men er det ikke en fremmed nøgle til en alders gruppe tabel ?? (ikke lavet)
så den burde nok hedde Aldersgruppe_id

jeg ville lave den ca sådan
CREATE TABLE `tbl_medlem` (
  `id` int(11) NOT NULL,
  `Navn` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `dob` datetime NOT NULL,
  `Aldersgruppe` varchar(255) COLLATE utf8_danish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


ALTER TABLE `tbl_medlem`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `tbl_medlem`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 22:00 #8
hvis Aldersgruppe er en fremmed nøgle høer den måke ikke til i medlems tabellen men skal ligge i en mapnings tabel

map_medlem_aldersgruppe
id
medlems_id
aldersgruppe_id

er nok lidt overkill,


men er Aldersgruppe ikke er overflødig ??, da du kan regne det ud ud fra dob
Avatar billede Slettet bruger
12. juli 2017 - 22:04 #9
Aldersgruppe er en inddeling såsom U10 - Under 10 år.
Alder er f.eks. 9.

Men ja, tror du har ret. Det vil være nemmere bare at beregne det udfra spillernes alder.
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 22:04 #10
map_medlem_aldersgruppe er kun nødvendigt, hvis et medlem kan være i flere alders grupper ??, hvis ikke er den overflødig
Avatar billede Slettet bruger
12. juli 2017 - 22:08 #11
Man kan kun være medlem af én aldersgruppe, så det er ikke nødvendigt :-)
Jeg arbejder videre med det. Det kan godt være jeg har nogle flere spørgsmål til dig løbende - det håber jeg er ok?
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 22:14 #12
hvis vi kigger på din hold tabel:
AntalMedlemmer kan du jo regne ud ud fra map_medlem_hold_traeninger, så det felt er overflødigt.

>Det kan godt være jeg har nogle flere spørgsmål til dig løbende - det håber jeg er ok?
ja
Avatar billede Slettet bruger
12. juli 2017 - 22:18 #13
Hvordan vil du beregne hvor mange personer der er tilknyttet de enkelte hold via ovenstående? :-)
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 22:31 #14
#13
test data
CREATE TABLE `map_medlem_hold_traeninger` (
  `id` int(11) NOT NULL,
  `hold_id` int(11) NOT NULL,
  `medlem_id` int(11) NOT NULL,
  `training_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


INSERT INTO `map_medlem_hold_traeninger` (`id`, `hold_id`, `medlem_id`, `training_id`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 1),
(3, 2, 2, 2),
(4, 1, 3, 1);


ALTER TABLE `map_medlem_hold_traeninger`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `map_medlem_hold_traeninger`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;COMMIT;


SELECT count(id) FROM `map_medlem_hold_traeninger` WHERE `hold_id` = 1


svaret er 3

SELECT `hold_id`, count(id) FROM `map_medlem_hold_traeninger` GROUP BY `hold_id`

hold_id, count(id)
1, 3
2, 1

simpelt sql
Avatar billede Slettet bruger
12. juli 2017 - 22:36 #15
Ja, det giver god mening. Tænkte nok egentligt mere på hvordan jeg kan får det vist/udskrevet med PHP/HTML på min hjemmeside?
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 22:56 #16
#15
nu ved jeg ikke hvilke API du anvender med her er et eks på de mest anvendte APIer

pdo
<?php
$hostname = 'localhost';   
$username = 'root';   
$password = '';
$db="test";
try {       
    $conn = new PDO("mysql:host=$hostname;dbname=$db;charset=utf8", $username, $password);       
    // echo 'Connected to database';
}
catch(PDOException $e){
    echo $e->getMessage();
}
   

$sql = "SELECT `hold_id`, count(id) AS antal FROM `map_medlem_hold_traeninger` GROUP BY `hold_id`";
$sth = $conn->query($sql);
while ($row = $sth->fetch(PDO::FETCH_ASSOC)){
            echo $row['hold_id'];
            echo " ..... ";               
            echo $row['antal'];   
            echo "<br>";
}   
?>



mysqli

<?php
$hostname = 'localhost';   
$username = 'root';   
$password = '';
$db="test";
$conn = new mysqli('localhost', 'root', '', $db);
// check connection
if (!$conn) {
    echo 'Der opstod en fejl.';
    exit();
}
$conn->set_charset("utf8");

$sql = "SELECT `hold_id`, count(id) AS antal FROM `map_medlem_hold_traeninger` GROUP BY `hold_id`";
$sth = $conn->query($sql);
while ($row = $sth->fetch_assoc()){
            echo $row['hold_id'];
            echo " ..... ";               
            echo $row['antal'];   
            echo "<br>";
}   
?>
Avatar billede Slettet bruger
12. juli 2017 - 23:04 #17
Jeg benytter mysqli.
Hvornår får jeg så navnet frem for holdene (fra Hold-tabellen) fremfor bare deres id-nummer? :-) Beklager at jeg har så mange spørgsmål, men på et tidspunkt giver det hele sikkert rigtig god mening.
Avatar billede olsensweb.dk Ekspert
12. juli 2017 - 23:25 #18
#17
join


test tabel
CREATE TABLE `tbl_hold` (
  `id` int(11) NOT NULL,
  `Navn` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `tbl_hold` (`id`, `Navn`) VALUES
(1, 'delfin'),
(2, 'søløver'),
(3, 'vandhunde'),
(4, 'motion');


ALTER TABLE `tbl_hold`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `tbl_hold`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;


SELECT hold_id, count(map_medlem_hold_traeninger.id) AS antal, tbl_hold.Navn FROM map_medlem_hold_traeninger JOIN tbl_hold ON tbl_hold.id = map_medlem_hold_traeninger.hold_id GROUP BY hold_id


hold_id, antal, Navn
1,3,delfin
2,1,søløver
Avatar billede Slettet bruger
12. juli 2017 - 23:32 #19
Tusind tak so far :-)
Avatar billede olsensweb.dk Ekspert
13. juli 2017 - 09:53 #20
jeg har omdøbt min map_medlem_hold_traeninger til tbl_map_medlem_hold_traeninger, for at være konsekvent, med at tabeller altid hedder tbl_

i medlems tabellen ville jeg splitte navn i 2 collonner, så jeg har fornavn og efternavn, hvilke gør det nemmere at sortere, og søge
men det komme jo an på dine data i navn om det skal splittes

så alle mine nu ser sådan ud:
CREATE TABLE `tbl_hold` (
  `id` int(11) NOT NULL,
  `Navn` varchar(255) CHARACTER SET latin1 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


INSERT INTO `tbl_hold` (`id`, `Navn`) VALUES
(1, 'delfin'),
(2, 'søløver'),
(3, 'vandhunde'),
(4, 'motion');


CREATE TABLE `tbl_map_medlem_hold_traeninger` (
  `id` int(11) NOT NULL,
  `hold_id` int(11) NOT NULL,
  `medlem_id` int(11) NOT NULL,
  `training_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


INSERT INTO `tbl_map_medlem_hold_traeninger` (`id`, `hold_id`, `medlem_id`, `training_id`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 1),
(3, 2, 2, 2),
(4, 1, 3, 1);


CREATE TABLE `tbl_medlem` (
  `id` int(11) NOT NULL,
  `fornavn` varchar(50) COLLATE utf8_danish_ci NOT NULL,
  `efternavn` varchar(50) COLLATE utf8_danish_ci NOT NULL,
  `dob` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


INSERT INTO `tbl_medlem` (`id`, `fornavn`, `efternavn`, `dob`) VALUES
(1, 'anders', 'and', '2010-06-01 00:00:00'),
(2, 'palle ', 'gulvballe', '2010-07-09 00:00:00');


CREATE TABLE `tbl_traeninger` (
  `id` int(11) NOT NULL,
  `Dato` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


INSERT INTO `tbl_traeninger` (`id`, `Dato`) VALUES
(1, '2017-07-02'),
(2, '2017-07-18');


ALTER TABLE `tbl_hold`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `tbl_map_medlem_hold_traeninger`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `tbl_medlem`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `tbl_traeninger`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `tbl_hold`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

ALTER TABLE `tbl_map_medlem_hold_traeninger`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

ALTER TABLE `tbl_medlem`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

ALTER TABLE `tbl_traeninger`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;


nb nu du har valgt mysqli som API, bør du også kigge på Prepare Statement, som er noget af det nye der er kommet til i mysqli, og det er kraftigt forbedret i PDO
læs denne quick guide
www.computerworld.dk/uploads/eksperten-guider/1480-Prepared-Statements-under-MySQLI-kom-igang.pdf

mysqli er det bedst documenteret, men pdo er det nyeste, og efter min mening det bedste
Avatar billede Slettet bruger
13. juli 2017 - 20:36 #21
Åh ja ok :-)

Nu er jeg kommet til et punkt jeg ikke umiddelbart selv kan løse, så jeg har virkelig brug for programmeringshjælp til det.

Det er følgende:
1. Jeg skal have en dropdown-boks med alle "Hold", så man kan vælge det ønskede hold.
2. Ud fra ovenstående valg skal der fremkomme et komplet liste (tabelvisning) med alle de "Medlemmer" der er tilknyttet det holdet. I visningen skal man kunne se følgende informationer i nævnt rækkefølge; # (nummer), Navn på medlem, Alder, Aldersgruppe, "Tre træninger" og antal træninger.
3. Punktet "tre træninger" skal indeholde nogle select-muligheder, så man kan lave en afkrydsning af hvem der deltager i de enkelte træninger - og samtidig gemme det i databasen.

Kan du hjælpe mig? :-)
Avatar billede olsensweb.dk Ekspert
13. juli 2017 - 22:23 #22
1.
nemt

connect.php

<?php
$hostname = 'localhost';   
$username = 'root';   
$password = '';
$db="test";
$conn = new mysqli($hostname, $username, $password, $db);
// check connection
if (!$conn) {
    echo 'Der opstod en fejl.';
    exit();
}
$conn->set_charset("utf8");
?>




<?php
require('connect.php');
$sql = "SELECT * FROM tbl_hold";
$rs = $conn->query($sql);
echo '<form method="post" action ="'.$_SERVER["PHP_SELF"].'">';
echo '<select name="hold">';
while ($row = $rs->fetch_assoc()){
echo "<option value='".$row['id']."'>".$row['Navn']."</option>";
}
echo "</select>";
echo "<input type='submit'>";   
echo "</form>";
?>


2)
temelig omfattende

så skal du submitte valget til serveren, alternavt bruge AJAX, men det er mere kompliceret
>(tabelvisning) med alle de "Medlemmer" der er tilknyttet det holdet.
>I visningen skal man kunne se følgende informationer i nævnt rækkefølge; # (nummer), Navn på medlem,

SELECT tbl_medlem.id, tbl_medlem.fornavn, tbl_medlem.efternavn FROM tbl_map_medlem_hold_traeninger JOIN tbl_medlem ON tbl_medlem.id = tbl_map_medlem_hold_traeninger.medlem_id WHERE tbl_map_medlem_hold_traeninger.hold_id = 1

alderen kan du beregne ud fra dob, i enten sql eller php
https://www.google.dk/search?q=sql+calculate+age+from+dob
https://www.google.dk/search?q=php+code+to+calculate+age+from+dob

alders gruppe finder du via logik i php
"Tre træninger" kig på LIMIT i sql
og antal træninger. antal træninger kig på count fra tidligere


vi er nok ude i flere sql kald

3)
temelig omfattende

-----

jeg tror det er på tide andre kommer ind med bidrag, luk dette og opret et nyt spm.
Avatar billede Slettet bruger
13. juli 2017 - 22:38 #23
Ok - Tusind tak for hjælpen, @olsensweb.dk! :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester