29. januar 2003 - 15:41Der er
19 kommentarer og 1 løsning
Foreach, while, mySQL - Videns- Kompentace database.
Hej
I bedes venligst kigge det hele igennem og ikke hoppe i det da der står nogle lidt vigtige ting... :) (Ved godt det er langt)
Først kommer min kode, der hvor problemet er: ---KODE START---
if ($result_get_all_certifications > 0) { if($result_get_user_certifications > 0) { echo "Du er certificeret:";
foreach($result_get_all_certifications AS $c_row) { foreach($result_get_user_certifications AS $u_row) { if($u_row[knowhow_certifications_id] == $c_row[id]) { echo "<tr><td align='left'>$u_row[certification_fullname]</td><td align='center'><input type='checkbox' name='certification$id' checked></td></tr>"; } else { echo "<tr><td align='left'>$c_row[certification_fullname]</td><td align='center'><input type='checkbox' name='certification$id'></td></tr>"; } } } } else if ($result_get_user_certifications == '') { echo "Du er ikke certificeret:"; foreach($result_get_all_certifications AS $c_row) { echo "<tr><td align='left'>$c_row[certification_fullname]</td><td align='center'><input type='checkbox' name='certification$id'></td></tr>"; } } } ---KODE SLUT---
Beskrivelse: Jeg er ved at udarbejde en vidensdatabase hvor folk kan hakke af i checkboxes hvad de har af certificeringer (og så senere hen uddannelser, kundeerfaring mm.)
Jeg har pt. : En tabel med brugerne, der ligger relevante data for brugerne så som username, id, fornavn etc.
En tabel med certificeringerne, indeholder et unikt ID, det fulde certificerings navn og det korte certificerings navn (ex. Cisco Certified Network Associate & CCNA).
En tabel der indeholder hvem der ved hvad. et unikt ID, brugerens id og certifikations id. På den måde kan man så se at brugerid 1 har certificeringerne 2, 5 og 19. (Man kunne sikkert lave dette smartere ja, men til at starte med benytter jeg dette).
Så har jeg i min kode 2 sqludstræk (mysql).
1 hvor den henter alle certificeringerne ud, og 1 hvor den henter certificeringerne ud der som brugeren har.
Disse 2 udtræk virker fint nok. Og så også det at oprette nye certificeringer mm. men det er ikke noget problem og derfor vil jeg ikke uddybe dette ydeligere.
Det som jeg så vil ha den til er at for hver certificering der er i tabellen skal den trække dem ud og skrive certifications navnet samt lave en checkbox. Det er der heller ikke nogen problemer i MEN det kan jo godt være at personen har nogle certificeringer ex. 3, 6 og 19 og derfor skal disse certificeringer være checket af. Det er HER mit problem kommer ind.
Jeg kan godt hente alle certificeringerne ud men jeg kan og jeg kan godt få lavet den checkbox der er krydset af de rigtige steder men som den kloge læser nok allerede har bemærket så vil det dukke frem for mange gange alt afhængigt af hvor mange certificeringer personen har. Hvis vi her siger han har de 3 som jeg nævnte så vil certificeringerne blive udskrevet 3xcertificeringerne. (Så vidt jeg kan se).
Derfor, det er mine 2x foreach "løkker" der driller mén jeg har brug det dette tjek:
if($u_row[knowhow_certifications_id] == $c_row[id]) { ($c_row[id] er certificerings id'et.
I må helst ikke lige være alt for hårde ved mig, jeg er ikke 110% inde i PHP men jeg lærer da af mine fejl. Bare denne gange føler jeg at mine pande ramte muren.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
hvordan vælger du ud fra databasen? - hvis der er flere forekomster af en post og man kun vi have den ud én gang kan man benytte SELECT DISTINCT direkte i sin MySQL forespørg
avminarm> Den tror jeg lige du må uddybe. Som jeg nævner så har jeg 2 SQL forspørgelser hvor jeg henter data ud.
Den ene henter alt ud om certificeringen, den anden henter certificeringens navn og id ud der hvor personen har certificeringen. Dvs. har personen 3 forskellige certificering (da man kun kan have én af gangen) hentes der 3 forskellige certificering's navne og id ud.
Jeg tror det ville være langt nemmere for dig at lave følgende opslag:
1) Brugerens certificeringer. Du læser alle brugerens certificerings id'er in i et array. Hvis brugeren har certificeret 2, 5 og 15 har du så følgende array: array(2,5,15);
2) Gennemløb alle certificeringer. Ved hver certificering bruger du funktionen in_array til at se om den pågældende certificering er i brugerens array. Er den det, så sætter du "checked"
miraculix> Ja, jeg kigger lige på det - Desværre er min tid noget begrænset i dag da jeg skal til møde hele dagen. Men jeg kigger lige på det og vender tilbage. :)
hmm Jeg har i min mysql select både certifications navn, brugerens id og certificeringens id. Det ved jeg virker, men når jeg forsøger fx. at lave denne:
if (in_array ("Nokia Support Administrator", $result_get_user_certifications)) { echo "jepper"; }
Hastighed betyder ikke det vilde i dette tilfælde mén
jeg prøver lige at udrede noget:
Hvis jeg har en SQL forspørgelse der henter alle certificeringerne ud. Det vil sige, id, certification_fullname, certification shortname. Dette køres igennem en foreach, så for hver uddannelse der er, udskrives der certification_fullname samt der laves en checkbox.
Så har jeg en anden SQL forspørgelse der henter de certificationer ud hvor brugerens id er (det som der ligger i en session).
Den henter følgende ud i mit tilfælde: certification_fullname | nd_users_id | knowhow_certifications_id Cisco Certified Network Profession | 1 | 2 Nokia Support Administrator | 1 | 4
Dvs, at jeg har de certificeringer, der er mit id som bruger (1) og så er der certificeringens id (2,4).
Denne SQL ser således ud: SELECT knowhow_certifications.certification_fullname, knowhow_users_certifications.nd_users_id, knowhow_users_certifications.knowhow_certifications_id FROM nd_users, knowhow_users_certifications, knowhow_certifications WHERE nd_users.id='$id' AND nd_users.id=knowhow_users_certifications.nd_users_id AND knowhow_certifications.id=knowhow_users_certifications.knowhow_certifications_id;
og den anden hvor jeg henter alle certificeringerne ud er basicly en SELECT * FROM ...
Men i tilfældet brugerens certificeringer behøver du faktisk kun slå op i knowhow_users_certifications where nd_users_id = $id og faktiske kun selecte knowhow_certifications_id.
Altså SELECT knowhow_certifications_id FROM knowhow_users_certifications WHERE nd_users_id = '$id';
Herefter løber du resultatet igennem og tilføjer det enkelte id til arrayet.
Herefter løber du alle certificeringerne igennem udskriver hver checkbox og indsætter CHECKED hvis den pågældende certificerings id er i det opbyggede array..
Den med "Herefter løber du resultatet igennem og tilføjer det enkelte id til arrayet." tror jeg ikke helt jeg forstod, hvis du kan uddybe det lidt ville jeg være glad. Er det korrekt forstået at jeg skal lave et array og smide de værdier ind i det array og så senere lave en in_array() på denne? Hvordan tilføjer man til et array, hvis det er det som jeg skal?
Den med at løbe certificeringerne igennem er jeg med på, det er jo det jeg prøver. Er det korrekt forstået at jeg skal først løbe alle certificeringerne igennem med en foreach() og så inde i den foreach() køre in_array() og tjekke det på den måde? Dvs. at for hver gang der er det $id i det array jeg tjekker så skal den laves checked.
Jeg smutter herfra arbejdet nu, kommer igen imorgen og tester lidt videre. Forløbig skal du da ha tusind tak for hjælpen, jeg føler da jeg er kommet et stykke videre :)
Sådan ville min løsning se ud. Den er ikke helt identisk med din, da alle kompetencer listes een gang og så er der bare hak i brugerens kompetancer.
Checkboxen står før kompetance-navnet. (så står de "pænt", men det kan selvfølgelig gøres pænere ved at bruge tabeller som du gør.
Du vil se at jeg mixer html og php på en anden måde end du gør. Jeg synes det er lidt mere overskueligt på den måde, til gengæld er det måske lidt mindre effektivt, det ved jeg ikke. Det er nok mest en smagssag.
Du burde faktisk kun behøve at lægge connect og session kode ind og tilrette min pseudo-sql, så skulle det virke. Eller må du give et plip. ;-)
<?php
// Find brugerens egne kompetancer: $qry = mysql_query("SELECT kompetence id FROM mange-til-mange tabel WHERE bruger id = $id" );
// Find alle kompetancer: $qry = mysql_query("SELECT kompetanceid, kompetancenavn FROM alle kompetancer");
?> Kære bruger<BR> Her er dine kompetencer:<BR> (Der er sat hak ved de certificeringer vi har registreret for dig)<BR>: <? while ( $res = mysql_fetch_array($qry) ) { ?> <input type="checkbox" name="certification<?= $res[0] ?>" <?= in_array($res[0], $bruger_arr) ? 'CHECKED' : '' ?>> <?= $res[1] ?><br> <? } ?>
Jeg tester det lige her lidt over frokost. Typisk arbejde ;) Endnu engang, tak.
Dette er den funktion jeg benytter til at lave connect til db og retunere de data jeg ønsker.
Den skal have 2 værdier - Databasen og SQL queryet (Select, insert etc.)
---START---
<? function connectdb($db, $sql) { $connection = mysql_connect("172.21.50.120", "webuser", "") OR DIE (mysql_error()); mysql_select_db($db, $connection) OR DIE (mysql_error()); $query = mysql_query($sql) OR DIE (mysql_error());
if ($query > 0) { while ($row = mysql_fetch_array($query)) { $result[] = $row; } }
Jeg kan ikke lige forstå hvordan du får mere end een række i $result (den sidste) når du returnerer den, men hvis den virker så er er det jo fint nok (så skal jeg bare lære noget nyt PHP array halløj)
Jeg ville dog ikke connecte ved hver eneste sql-foresp. Det er nok noget hurtigere at connecte een gang (evt. med pconnect ovenikøbet) og så fyre sine sql'er af, men det må du jo selv om. ;-)
miraculix> Nu har jeg lige fået testet det. Jeg nåede det ikke igår efter frokost for der brød lige helved løs ude på arbejdet ;)
Anyway, det virker faktisk som det skal. Dog vil jeg gerne lige have lov til at pine dig lidt ydeligere ;)
De checkboxes der dannes. <input type="checkbox" name="certification<?= $row[0] ?>" <?= in_array($row[0], $bruger_arr) ? 'CHECKED' : '' ?>>
De får jo dejligt nok et navn for hver af dem. Så vidt jeg har forstået "certification=tal" når så vedkommende trykker Opdatér så skal den jo på en eller anden snedig måde kører dem igennem (Det er lige meget om den kører alle igennem da hastighed som sagt ikke er den store betydning her, ikke så mange brugere).
Hvordan kan dette så gøres på en måde så for det første variablerne (checkbox navnene) ikke bliver overskrevet (hvilket de heller ikke gør så vidt jeg kan se da de har ét unikt tal pr. box) men de skal jo løbes igennem igen.
Regner med at jeg sidder og prøver det lidt igennem her i weekenden. Da kan arbejdet jo ikke komme i vejen :)
miraculix> Jeg skal lige høre dig om du ikke lige er flink at bide denne i stykker og lige forklare det. Altså du er ude af php når du laver denne checkbox. Du hopper ind i php og den får sig et navn der hedder "certification=tal" ? Derefter hopper du ud af php og afslutter navnet. Dernæst hopper du ind i php, du siger at hvis den er = in_array, altså du tjekker om denne findes i arrayet $bruger_arr, altså brugerens certificeringer? Derefter er jeg ikke med, du laver et spørgsmålstegn? og så siger du checked efterfulgt af et : '' - den forstår jeg ikk helt. Efter det hopper du ud af php og afslutter din <input> med et >. Men hvad sker der så, du hopper ind i php og laver et tjek på om $row[1] er..?
Det er en meget fix lille short-hand for en if-struktur der returnerer enten det ene eller det andet. '?' og ':' er operatorer i den konstruktion (der kommer fra sproget c)
Den generelle form er: betingelse ? then-del : else-del;
Altså hvis <betingelse> er sand, returnerer den <then-del>, ellers returnerer den <else-del>.
Men jeg har lige siddet og leget lidt med dit forrige sprgsmål.
Hvis du laver checkboxene om så deres name bliver f.eks. name="certifikation[]" og deres value bliver: value="<?= $row[0] ?>" (OBS! de kantede paranteser i navnet er vigtige!)
Så sørger php for at opbygge et array af de værdier der er blevet "hakket af": $certifikation = array(12,17,19);
Så er det bare at: 1) slette brugerens gamle certificereing (delete from mange til mange tabel where bruger_id = brugerens id) 2) oprette de nye: foreach( $certifikation as $id ) { mysql_querey("insert $id, $bruger_id into mange til mange tbael> }
dete med at hoppe ind og ud af php er jo en smagssag, men jeg synes det har den fordel at html og php bliver helt adskilt. Så kan selv ikke-php folk lave rettelser og forstå (nogenlunde) hvad der foregår, når bare de ignorerer det der står mellm <? og ?>.
miraculix> Ja det lyder jo såmænd ret simpelt. Dog venter jeg lige til engang imorgen med at kigge på det da mit hoved dunker lidt i dag ;)
Jeg vælger dog lige at acceptere dit svar nu og så hvis jeg skulle få problemer kan jeg jo stillet et nyt spørgsmål - Du har jo stort set fået mig over mit egentlige problem + mere til :)
Så jeg takker og bukker for nu og god søndag :)
Synes godt om
Ny brugerNybegynder
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.