Hvordan lagre innhold i MySQL database?

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009

Lurer litt på hvordan dette gjøres.

Laster man opp en .html-fil til en artikkeltabell i databasen?

Det som er, er at jeg gjør det ganske tungvindt idag. jeg legger opp alle sider manuelt.

jeg har en del sider/kategorier (nyheter, informasjon, support etc.). Når jeg lager en ny artikkel, så legger må jeg i dag legge den inn under riktig kategori samt på hovedsiden til den aktuelle kategoerie OG på index-siden over sister artikkler pr. kategori. (forstålig?).

 

Jeg regner med at de fleste gjør dette via database. Slik at man laster opp en .html-fil til en artikkeltabell hvor man har kun .php script som henter ut siste ID og publiserer den der de skal være?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Knytte IDer sammen

Nå skal du få et tips her. Tenk mer generelt: La oss si du har forskjellige typer innhold; artikler, guider, nyheter, pressemeldinger og så videre.

Alle disse har fellestrekk; f.eks. har alle en tittel, selve teksten og en ingress. Hvorfor ikke opprette en egen tabell for all slags innhold? La oss kalle alle sammen "innhold".

Du kan så lage en egen tabell for innhold. Her kan du gi innholdet en ID med datatype integer, et felt for tittel, f.eks. varchar og ingress med varchar. I tillegg er hovedteksten lagret i et felt av typen text.

Videre kan du lage en egen tabell for hva slags type innhold man har. La oss kalle det innholdstype. Her kan du ha en innholdstype for hver rad i tabellen, f.eks artikkel, guide og pressemelding. I tillegg har hver innholdstype en ID. F.eks. 1 for artikkel, 2 for guide og 3 for pressemelding.

Kanskje du også vil opprettte kategorier i tillegg til de forskjellige innholdstypene, f.eks. produkter, tjenester el.l. Også her lagrer du dem i en egen tabell med ID og navn på kategorien. 1 for produkter og 2 for tjenester.

Til slutt bør du opprette en egen tabell for å knytte de forskjellige IDene sammen. Denne kan inneholde ett felt for hver ID i de andre tabellene. I dette tilfellet ID for innhold, ID for innholdstype og ID for kategori.

Lagring av innhold i database

Du kan så lage et eget backend på websiden din. Her kan du legge inn artikler, pressemeldinger og guider direkte inn i databasen. F.eks. ved hjelp av et input slik som her i forumet. Du lagrer HTML-markup osv i databasen.

La oss si du skal skrive din første bit med innhold (ID 1 for innholdet) som er en pressemelding (ID 3) om et nytt produkt (ID 1). Du må da lagre IDene i tabellen for IDer, og tittel, ingress og selve innholdet i tabellen for innholdet.

I tabellen for innhold har du altså lagret alt som har direkte med innholdet å gjøre, mens innholdstypen og kategorien knyttes til innholdet ved hjelp av tabellen med IDer.

Visning av innhold fra database

Siden menyer, logo og så videre som oftest er statiske, dvs like på alle sider, faller det seg naturlig å lage en mal. I malen plasserer man alle statiske elementer ferdig.

Deretter henter man ut innholdet fra databasen basert på query stringen når man caller malen (går inn på siden), og printer deretter ut riktig innhold.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
den må jeg nok lese gjennom

den må jeg nok lese gjennom ett par ganger for å samle alle tanker. Men har sett gjennom videoene en gang til, rundt database.

Du er flink til å tegne;)

Du klarer ikke å tegnet opp en kjapp illustrasjon for meg?

Mulig jeg skjønne det fortere kansje...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Databasestruktur

De sorte rutene: Her er et eksempel på databasestruktur du kan bruke i MySQL. Legg merke til at det er 4 tabeller, hver med sine felter i rødt.

Den grønne ruten forestiller hva som skal skje når en bruker går inn på en gitt adresse. Query string som sendes til server er skrevet i rødt.

Legg merke til at den siste tabellen kun inneholder IDer, disse knytter de tre foregående tabellene sammen.

Databasestruktur for lagring av innhold og kategorier i MySQL

I databasestrukturen ovenfor må du joine tabeller i SQL-spørringen din for å hente ut informasjon fra tabellene med innhold og navnet på kategorien.

Dette kan være nyttig f.eks. hvis du vil skrive ut hvilken kategori innholdet er katalogisert under. I tillegg kan du hente ut hvilken type innhold det er snakk om.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Jeg ser for meg at jeg har

Jeg ser for meg at jeg har disse kategoriene til å begynne med da:

#1 Nyheter, #2 Informasjon, #3 Støtte, #4 Tips

Jeg bør altså sette opp en egen tabell for hver kategori, da med eksempelvis disse feltene:

  • #ID
  • Dato (opprettet)
  • Forfatter
  • Hoved-tittel
  • Sub-tittel
  • Tekst (innhold)

Når jeg har satt opp alle tabellene for hver kategori skal jeg sette opp en siste tabell med oversikt over hver enkelt kategori?

 

EDIT: Du hadde lagt inn ett innlegg mens jeg la opp dette...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Tilsvar

Ser du skrev innlegget over mens jeg skrev. Men sier det likevel: Du har én tabell for alt innhold (uavhengig av hva slags innhold det er), så har du én tabell for alle kategorier, én tabell for alle innholdstyper og så linker du dem sammen ved hjelp av IDen til de forskjellige "elementene" i en siste tabell. Du kan si den siste tabellen brukes til å knytte dataene sammen ved hjelp av nøkler (IDer).

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Okay, fikk en bedre

Okay, fikk en bedre forståelse av det hele nå

Så, i forbindelse med en backend løsning, altså ett form som inneholder feltene

  • Forfatter
  • Tittel
  • Innhold

Hvor submit-knappen laster opp til databasen på samme måte som oppdatering av ett felt, bare at denne gangen skal det legges til en ny rad. sant?

Det som skjer, er at hvert felt kobler seg opp til hver sin tabell med hver sin nye ID.

Så tar "summerings"-tabeller og samler sammen alle ID'ene til en ID?

med hilsen
Thomas Kile

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Grunnen til at jeg har

Grunnen til at jeg har problemer med å skjønne det hele er pga. at dette blir litt anderledes "logistikk" enn jeg er vandt med. Jeg er vandt til å ha full kontroll via EAN koder. Sant. At man kan lese koden og skjønne hva det hele er fornoe.

Ikke bare en random kode.

Derfor blir det litt "rotete" for meg å ha en innholdstabell over ALLE inleggene.

Jeg tenker slik jeg:

Kategori = 03 - Støtte

Type = 02 - Motivasjon

Forfatter = 01 - ThomasK

Artikkel = 00234

 

Output #ID: 03 02 01 00234

 

Altså, for hver kategori, type, forfatter så starter en tabell med artikklene på null og begynner å telle oppover... (nå er det riktignok kun en forfatter da ;) )

Vil det bare bli MYE mer jobb få til en slik løsning?

 

Altså, via en form da. Så har jeg sånn dropp-down-meny med kategorier, når en kategori er valg så velger jeg typen (basert på valgt kategori), Skriver tittlen samt innholdet og submiter. Blir det ikke noe slik?

 

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Database

Forstår ikke hvorfor du henger deg opp i hva IDene er, de er jo kun interessante fra et programmeringsspråksperspektiv. Du behandler hver ID for seg. F.eks vil du kun trenge innholdsID for å kunne hente ut hvilken innholdstype og kategori(er) en bestemt rad har. (En artikkel vil være en rad i databasen. På engelsk kalt "record" og "row").

Den eneste grunnen til at man gir ting IDer her, er for å knytte ting sammen. Det har ingenting for seg å lage en lang kode for hvert innhold. Leading zeros er også unødvendig.

Det er langt bedre å begynne med ID på 1 for alle slags "elementer" og gå oppover. Du skal aldri behøve å taste inn noen ID, alt sånt bør skje programmeringsmessig.

Legge inn data i databasen

La oss si du har en tabell med 5 kategorier da. I backendet hvor du skal legge inn data henter du ut alle kategoriene og IDene. Disse setter du inn i select input som options, der ID er value på hver option og navnet på kategorien er navnet på option.

Du kan da velge hva slags innhold du skal legge inn ved hjelp av dropdown menyen.

Når du så lagrer dataene ved å klikke på submit, så koder du det slik at data fra HTML-feltene lagres i de riktige databasetabellene.

 

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Skattejakt på IDer i databasen

Forklarer litt til angående dette med IDer.

Hvis du har tilgang til en ID, så har du indirekte tilgang til alt som er lagret på den IDen, ikke sant? Eksempel: Du husker IDen på en artikkel, derfor kan du enkelt finne hvor artikkelen er lagret i databasen.

Hvis du ser på tabellen med alle IDene, så ser du at du ved å vite 1 ID har tilgang til alle andre IDer som har tilknytning til den - dermed har du indirekte tilgang til all informasjon lagret bak de andre IDene også.

Skjønner at dette kan være vanskelig å forstå, men du kan se slik på det:

Du har to kister, en stor og en liten. På den lille er det 1 hengelås, på den store er det mange. Du har kun 1 nøkkel. Hvis du låser opp den lille kista, så har du tilgang til alle de andre nøklene og får se innholdet i den store kista.

Her korresponderer den lille kista til tabellen som inneholder alle IDene.

Da er det bare å ta på seg øyelappen, skrike kaptein sortebill og jakte på IDer og innhold, haha *overtrøtt* og har sett for meget på tangerudbakken, hehe.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
ser den... fortellte jo

ser den... fortellte jo hvorfor jeg hengte meg opp i ID'ene... Men skal la det ligge... 1 innholdstabell for alle artikkler (uansett hvilken type eller kategori de tilhører)...

Det jeg burde gjøre da, er å legge opp en egen side, som kun er tilgjenglig når JEG logger meg på? eller burde jeg sette opp en domene.no/admin/ hvor man da kommer til en ren innloggingsform?

 

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
ID mannen

Ja, jeg så at du hadde skrevet hvorfor du likte andre typer IDer, hehe. I et stort logistikksystem kan jeg se nytteverdien av slike systemer, men for å dele inn innhold, kategorier og så videre vil praksisen jeg outliner være best. Det er denne som er normal å bruke, så å finne opp egne og komplekse systemer er lite nødvendig.

Men for all del - man lærer jo av å eksperimentere, så hvorfor ikke :)

Jepp, alt innhold kan gå i en tabell. Det er jo i bunn og grunn samme type data som skal lagres, så å skille ut i egne tabeller er jo unødvendig.

Dette kan du jo velge selv. F.eks. kan du gi din egen bruker sysoprettighet, og dermed tilgang til egne options som andre ikke vil se.

Du kan også legge inn data direkte fra phpMyAdmin hvis du ikke gidder å kode backendet. Er jo mye jobb med backend, for husk at du skal ha mulighet til å redigere ting også. Da må du hente ut ting og så videre, oppdatere de riktige feltene og masse annet snask.

Denne jobben gjør man jo rimelig enkelt i phpMyAdmin allerede. Ikke like fancy, men det er kanskje bare deg som ser det uansett?

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
det er kun jeg som komme til

det er kun jeg som komme til å administrere dette området ja... Men hva med html koder? Kan jeg skrive htmlkoder som <h1><ul><p> etc. rett i phpAdmin?

EDIT: Og om jeg legger opp en ny artikkel da, så må jeg manuelt lagre artikkelen først og fremst. Så må jeg over i SUMMERING-tabellen og legge inn en ny rad der med den tildelte ID'en til artikkelen samt legge inn ID'en til Kategori og ID'en til Typen i feltene - Manuelt da, hver gang?

Blir vel lidt tungvindt det også da?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Mer om løsninger

Ja, man kan fint lagre HTML-markup i MySQL. Sånn sett er det liten forskjell på å lagre tekst i database og f.eks. ei txt-fil.

Ingenting som skal SUMMERES her. :) Her skal vi knytte ting sammen ved å linke IDer. Et mer korrekt navn på tabellen ville vært mr_linkage. :P Men fra spøk til alvor; et mer korrekt navn ville vært relations_table, for det er nettopp det vi gjør her; skaper relasjoner mellom data. (Kraften i de fleste, og også MySQL, databaser er nettopp relasjoner, det at man kan sortere og gruppere data basert på spesifikke kriterier).

Det er korrekt; hvis du skal legge inn ting selv i phpMyAdmin, så må du;

  1. Legge inn artikkelen, f.eks. paste inn markup fra Dreamweaver
  2. Finne IDen til det nye innholdet du nettopp la inn
  3. Gå inn i linktabellen og manuelt legge inn IDene for denne artikkelen

Du kan selvsagt kode backendet slik at denne oppgaven automatiseres.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
jeg har nå opprettet 4

jeg har nå opprettet 4 tabeller

  • category (ID, name)
  • type (ID, Name)
  • content (ID, DATE, AUTHOR, aTITLE, bTITLE, ARTICLE)
  • summary (ID, category_ID, type_ID, content_ID)

content:

Her har jeg fyllt ut ett par test-artikkler.

summary:

Her har jeg manuelt satt category_ID, type_ID samt påført den tildelte content_ID'en.

Jeg har naturligvis fått tildelt en summary_ID også nå.

 

Som jeg har forstått det, så er det summary_ID'en jeg skal benytte meg av når jeg spørre etter artikkelen. sant?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
IDer

Hviken ID du vil basere deg på kommer ann på hva du vil vise. Som jeg illustrerte ovenfor trenger du kun 1 nøkkel for å få tilgang til alle nøklene.

Si du vil vise en liste over artikler: Du vet hvilken ID innholdstypen "artikkel" har, og da kan du hente ut alle artikler som er knyttet til denne innholdstypen ved hjelp av en SQL-join. Dette er fordi du har assosiert alle innholdsIDer som er artikler med IDen til innholdstypen "artikkel", skjønner?

Tenk logisk: Hvis du skal vise en spesiell rad med innhold (f.eks én artikkel), så bruker du innholds ID, skal du vise en liste med artikler så bruker du innholdstype ID. Skal du vise alt innhold som har en relasjon til en spesiell kategori så bruker du kategori ID.

Skal se om jeg finner tid til å lage noen videoer om MySQL de kommende dagene.

Som jeg har forstått det, så er det summary_ID'en jeg skal benytte meg av når jeg spørre etter artikkelen. sant?

Jeg har aldri sagt at det er nødvendig å ha en egen ID for hver rad i denne tabellen.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
ønsker backend-løsning da

Det hadde vert morsom å fått til en backend da det på sikt vil bli flere administratorer (personer/forfattere) som skal kunne legge inn nytt innlegg.

 

Starter jeg "bare" med å sette opp en enkel form med feltene jeg ønsker å fylle ut manuelt da?

Som velge kategori, type og forfatter. Skrive inn tittel-A og tittel-B samt selve innholdsartikkelen.

med hilsen
Thomas Kile

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
har jeg forstått det riktig nå da?

Okay, har nå satt opp en form.

Som du ser så har jeg 3 valg alternativer. (Kategori, Type og Forfatter). Hver av de valgene har en egen tabell. Så har jeg naturligvis en tabell som inneholder artikkelinnholdet (opprettet dato, tittler, selve artikkelen).

administrator, ny artikkel

Valgalternativene

Basert på valget, så hentes aktuell kategori-ID fra tabellen og skrives til article_relations (ny rad opprettes) ved submit. Noe slikt kanskje?

  1. <select name="category">
  2. <option vaule="1">Nyheter</option>
  3. </select>
  4. <select name="category">
  5. <option vaule="2">Informasjon</option>
  6. </select>

Altså, sender verdien, som er lik category_ID til article_relations

Artikkel-innhold

Skrives direkte til article content tabellen. Ny rad opprettes når en ny artikkel legges til hvor ID'en øker auto med +1.

I tillegg så "henter" article_relations det nye IDnr fra article_content på ett sett og vis.

> Der, ny rad er komplett i article_relations.

Altså:

Henter informasjon fra category, type og author -tabellene

Skriver til relations -tabellen

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Lagring av innhold og relasjoner i MySQL

Siden din blir stadig finere, synes jeg. :)

Svar på valgalternativene: Ja, men du bør hente ut alternativene fra databasen. Hvis du senere utvider antall kategorier/innholdstyper så trenger du kun å gjøre det i databasen, dermed vil de nye innholdstypene og kategoriene automatisk velges fra skjemaet.

Lagring av innhold

Dette skal skje i følgende rekkefølge:

  1. Lagre innhold i database
  2. Finne ID til innholdet du lagret i database
  3. Lagre ID for innhold du nettopp la inn + ID for kategori og innholdstype i relasjonstabell

Du legger først inn artikkelen i den riktige databasen, deretter bruker du IDen denne artikkelen fikk for å legge den inn i relasjonstabellen sammen med IDene for innholdstype og eventuelt kategori.

For å finne IDen du ga innholdet du nettopp la inn til en artikkel kan du enten hente ut IDen ved å kjøre en spørring hvor du sorterer innholdsIDene i omvendt rekkefølge (se "ORDER BY some_field DESC" og "ORDER BY some_field ASC").

Alternativt finner du IDen til den sist lagrede raden i tabellen mye enklere ved å bruke PHP-funksjonen mysql_insert_id(). F.eks:

<?php
mysql_query
("INSERT INTO foo (bar) VALUES ('baz')");
$last_id = mysql_insert_id();

// Skriver ut IDen
print $last_id;
?>

Du har ved hjelp av denne funksjonen mao tilgang til den siste IDen du la inn. I dette tilfellet IDen for innholdet, denne lagrer du så sammen med de andre IDene i table for relasjonsnøkler (IDer).

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
men dette gjøres i det man

men dette gjøres i det man klikker på <submit>. sant? hente ut siste ID og legge inn i relasjonstabellen...

btw. takker for kompliment på siden. Måtte ta ett bilde pga. at jeg ikke kan gi tilgang til siden om du skjønner...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Starte lagringsprosess med submit

Ja, idet du klikker submit sender du innholdet via POST til serveren og lagringsprosessen starter.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
skjønner... men hvordan

skjønner... men hvordan setter jeg opp en slik liste som henter data fra databasen?

Slik at jeg kun trenger å gjøre endringer i databasen, så vil listealternativene oppdatere seg utomatisk tenkte jeg på...

Var det jeg i utgangspunktet ville, men så gikk det surr i tankegange min, så derfor ble det "manuel" fremstilling...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Hente data fra databasen

Ved å kjøre spørringer mot databasen og bygge listen basert på output fra spørringen.

  1. Bruker går til domene.com/?kategori_id=1
  2. Du bruker $_GET['kategori_id'], kjører spørring mot databasen for å finne alle elementer som er knyttet til denne IDen.
  3. Du får resultatene
  4. Du looper gjennom resultatene med while og printer ut listen/tabellen eller hvordan du enn ønsker å formatere output.

Hvis du skal lage en select input med options fra databasen så henter du jo bare all informasjon i en query, så formaterer du output.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
det var select input jeg

det var select input jeg lurte på ja... For man setter jo opp en stk. <option>  </option> pr. element i listen.

så det jeg lurte på da var hvordan det fungerte. Altså, når jeg legger til en kategori så må vel en ny <option>  </option> legges til i html-koden så den vises.

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Parse error: syntax error,

Jepp, f.eks. slik:

<?php
// Vars
$list = '<select name="category">';
$res = mysql_query('SELECT * FROM category');

while (
$data = mysql_fetch_assoc($res)) {
 
$list .= '<option value="' . $data['catID'] . '">';
 
$list .= $data['catName'];
 
$list .= '</option>';
}
$list .= '</select>';

// Printing input
print $list;
?>
ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
laste opp til flere tabeller

Får ikke til å laste opp til flere tabeller... Mulig jeg har misforstått oppsettingen... Får lastet opp til en da...

Har brukt denne koden:

<?php
$sql
= "INSERT INTO article_content INNER JOIN article_relations (content_atitle, content_btitle, content_article, rel_category_id, rel_type_id, rel_author_id) VALUES ('$_POST[atitle]', '$_POST[btitle]', '$_POST[article_content]', '$_POST[category]', '$_POST[type]', '$_POST[author]')";
?>

Har også forsøkt INNER JOIN. Men eneste eksemplet jeg finner med JOIN er i forbindelse med SELECT (på w3school da)
 

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Følg trinnene

Nå er du på bærtur. Du må sette inn i en tabell av gangen.

Skrev jo rekkefølgen du må gjøre ting i, i innlegget om å legge inn innhold ovenfor.

Join kan kun brukes ved SELECT-queryer, ja.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Forbauser meg ikke om jeg er

Forbauser meg ikke om jeg er helt på bærtur nei... hehee

Endret tilbake til å laste opp til kun en tabell:

<?php
if (empty($_POST['atitle']) || empty($_POST['btitle']) || empty($_POST['article_content'])) {
    print
'Alle feltene må fylles ut';
} else {
    require_once(
'/path/to//db-access-data.php');
   
$insert_content = "INSERT INTO article_content (content_atitle, content_btitle, content_article)
        VALUES ('
$_POST[atitle]', '$_POST[btitle]', '$_POST[article_content]')";
   
    if (!
mysql_query($insert_content, $eke_connection)) {
        die(
'Det har oppstått en feil ved opplasting: ' . mysql_error());
    }
    print
'En ny artikkel er lastet opp';
   
mysql_close($eke_connection);
}
?>

Der får jeg lastet opp selve artikkelen til databasen.

Det jeg ikke får til er hvordan jeg går videre og laster opp valgene til article_relations

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
To spørringer mot database

Hvorfor klarer du ikke å lagre i den tabellen? Det er jo ingen forskjell på å lagre i én tabell og så en til. Du har to tabeller og du må legge inn data i begge to med to queryer.

Viser igjen til innlegget ovenfor som viser hvordan man henter den siste IDen.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
det var deg jeg også

det var deg jeg også trodde... Men er nødt til å gjøre en feil en vei. For får opp:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1

Som jeg ikke skjønner noe av...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Feil i SQL

Print ut queryen før du kjører den og se hva som er galt med den. Høyst sannsynlig har du bare en syntaksfeil i SQL-spørringen din.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Blir det riktig å gjøre det

Blir det riktig å gjøre det slik... Fikk lastet opp til begge tabeller. Det siste som gjenstår nå er å få hentet frem IDnr til selve artikkelen...

 

        if (!mysql_query($insert_content, $eke_connection)) { die('Det har oppstått en feil ved opplasting av artikkel: ' . mysql_error()); }      

 

            echo "En ny artikkel er lastet opp";

           

        $insert_options = "INSERT INTO article_relations (rel_category_id, rel_type_id, rel_author_id)

            VALUES ('$_POST[category]', '$_POST[type]', '$_POST[author]')";

 

        if (!mysql_query($insert_options, $eke_connection)) { die('Det har oppstått en feil ved opplasting av options: ' . mysql_error()); }

       

            echo "options er lastet opp";

 

        mysql_close($eke_connection);

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Tre trinn til suksess

Hvorfor følger du ikke anvisningen ovenfor?

  1. Legg inn innhold i databasen
  2. Hent IDen til innholdet
  3. Legg inn alle IDer i relasjonstabell

Viste deg jo t.o.m 2 måter å finne innholdets ID på. Gjør som listen sier, og jeg har sagt tidligere, endre scriptet du pastet ovenfor, så skal det fungere.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Vet at jeg er utrolig flik

Vet at jeg er utrolig flik til å gjøre det komplisert for meg selv. Men nå fikk jeg ett positivt resultat da.

  • Artikkelen ble lastet opp til artikkel tabellen
  • ID'ene ble skrevet til relasjonsabellen

Slik er koden nå:

<?php

    // sjekker om feltene er tomme

    if (empty($_POST['atitle']) || empty($_POST['btitle']) || empty($_POST['article_content'])) { print 'Alle feltene må fylles ut'; }

   

    else {

        // henter inn data til innlogging

        require_once('/path/to/db-access-data.php');

           

        // Laster opp artikkelen

        mysql_query("INSERT INTO article_content (content_atitle, content_btitle, content_article)

            VALUES ('$_POST[atitle]', '$_POST[btitle]', '$_POST[article_content]')");           

 

        $last_id = mysql_insert_id();

            print $last_id;

                       

 

        // Laster inn id'ene til relsjonstabellen

        mysql_query("INSERT INTO article_relations (rel_category_id, rel_type_id, rel_author_id, rel_content_id)

            VALUES ('$_POST[category]', '$_POST[type]', '$_POST[author]', '$last_id')");

       

            print '<p>Artikkel IDer er innlastet</p>';

       

        mysql_close($eke_connection);

   }

?> 

Våger å spørre igjen; Er det slik du mener? For det funket virker det som...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Gratulerer

Du er himla dyktig! :) Forhåpentligvis har du lært litt nå. Bra! Da kan du begynne å leke deg med joins, for det er først nå databaser blir moro. :)

Du kan forøvrig fjerne 'print $last_id' fra scriptet ditt, hehe. :)

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
puh...

jau, det tok jo bare ca en hel dag det... hehee...

har lært veldig mye faktisk, måtte bare labbe rundt grøte sånn 365 ganger før bitene begynte å falle på plass... Du er dyktig til å forklare da... Bare jeg som har en komplisert tankegang...

Tok med print'en pga. ville kryss sjekke med databasen at alt stemmte over ens...

 

Men er jo bare halvveis vil jeg tro da jeg må få dette ut igjen på en fornuftig måte. Men nå må jeg ta en pause, TrueBlood med samboeren. så får se om jeg forsøker meg litt videre i kveld eller i morgen...

 Vel. Der kom svigers på besøk, så da ble det data'n ingen... hehee

 

med hilsen
Thomas Kile

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
begrense tilgang

Før jeg går videre, så må jeg begrense tilgangen til admin sidene.

Altså, jeg logger inn på samme måte som alle andre, bare at jeg får opp flere menyer. Samt at om en bruker skulle vite URL'en så må det være min bruker som må være innelogget for å få tilgang.

Det vel noe greier i SESSION det?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Sysop / brukerroller / rettigheter

Ja, du kan jo lage et eget felt i brukertabellen din som heter user_type el.l. Her kan du sette at din bruker er "sysop", mens andre er "users".

Videre; når man logger inn kan du sette en ekstra SESSION-variabel, f.eks. $_SESSION['user_type']. Deretter kan du bruke en if-statement for å kun vise innloggede brukere hvor $_SESSION['user_type'] er "sysop" skjemaet for innlegging av data, mens andre kan få beskjed om at de ikke har tilgang til websiden. :)

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
jau, opprettet ett nytt

jau, opprettet ett nytt rettighets-felt. som du skrev.

men, hvor tenker du at "sysop" skal settes og brukes?

Den må jo hentes ut og defineres en vei så den kan benyttes til validering...

 

Mener, i session på siden som vises eller i innloggingens valideringen...

Altså, i ny-artikkel.php eller i login-validate.php.

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Sessions

Nå overkompliserer du igjen. Tenk gjennom hvordan løsningen skal fungere i praksis. Når jeg skal programmere noe så tenker jeg trinn-for-trinn.

La oss si du skulle programmere en robot som skulle ta oppvasken for deg. Hvordan ville du gå frem? Jeg ville sagt at roboten skulle:

  1. Sette i proppen
  2. Åpne vannet i en spesifisert temperatur
  3. Lukke vannet etter et visst nivå
  4. Vaske opp
  5. Skylle med kaldt vann
  6. Tørke
  7. Dra ut proppen

Deretter hadde jeg gått inn i finurlighetene, dvs; hvilken arm som skulle gjøre hva, hvordan hvert ledd i armen skulle fungere og så videre.

Med andre ord: Ha en outline, så løse hvert problem fra 1-7.

I ditt tilfelle må du gi deg selv rollen sysop i databasen. Dette kan du gjøre i phpMyAdmin. Videre kan du definere feltet slik at alle blir satt som "user" ved default. F.eks. når de oppretter brukeren for første gang.

Videre kan du lage funksjonalitet som kan skru av og på hvilken brukerrolle en gitt bruker skal ha i hans eller hennes profil, eller du kan lage en oversikt over brukere og sette rollene på dem der, valget er ditt.

Hovedpoenget er at du setter brukerrollen i en session, slik at du senere kan kode script som sjekker denne;

<?php
if($_SESSION['brukerrolle'] == 'sysop') {
  print
'Dette er det kun sysop som ser';
}
?>

Ovenfor kunne du satt inn et skjema som ga en viss bruker en rolle osv, og deretter oppdatert databasen basert på hva en sysop valgte fra den listen.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Jeg satte inn ett nytt felt

Jeg satte inn ett nytt felt (member_level) i medlemstabellen.

Så tildelte jeg hver bruker en nivå-tittel (member eller sysp) hvor sysop er meg naturligvis. Det er slik du mener?

I loginscriptet satte jeg inn:

    $data = mysql_fetch_assoc($query);

    $level = $data['member_level'];

For å hente ut nivået til brukeren og sette i session slik:

    $_SESSION['var'] = $level; 

Er jeg på riktig vei eller helt på bærtur igjen?

 

 

EDIT: Det du beskriver forresten, er å begrene tilgangen på enkelt elementer?

som, vise eller ikke vise "noe". hvis en bruker klikker på "ny-artikkel.php" så får de tilgang til siden, men at innholdet ikke vises?

EDIT2: Det var vist det... Bruker den nå til å skru av/på admin-meny-knappen...

 

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Riktig vei

Jepp, nå er du på riktig vei. :)

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
jau, det funker jo...har gått

jau, det funker jo...

har gått for en tallbasert tilgangsnivå da. Så jeg kan benytte meg av ">=". mer fleksibelt.

 

Men det jeg hadde i tankene var å nekte adgang til ett helt område, basert på silgangsrettighetene til brukeren.

Nå, om en bruker kjenner til url'en til admin-området, så kan de fortsatt få tilgang. Menyknappen synes bare ikke...

Fosøkte å sette en

session_start();

    if ($_SESSION['var''] >= 4) { ... }

    else { print 'Du har ikke tilgang til disse sidene...'; }Men det som skjedde da var at siden fortsatt ble vist, med innhold og det hele, bare at det kom en hel masse sql error's.

Teksten "Du har ikke tilgang..." kom frem på toppen da....

Ikke helt slik jeg ønsket...

jeg kan sette en header da, men det er vel i utgangspunktet ikke slik det skal gjøres?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Permission denied

Helt enig med deg i at et tallbasert system er bedre, det er slik jeg også pleier å gjøre det. I tillegg lager jeg en funksjon som returnerer hvilken gruppe man tilhører, ved å bruke tallet som argument i funksjonen. Fint at du ser slike ting på egenhånd, det vitner om at du ikke bare plukker bær, hehe.

Du kan sende en "Permission denied" header til de som ikke er innlogget, men dette må du i tilfellet gjøre før du printer ut beskjed. Men det vet du.

Når det gjelder scriptet du beskriver her, så vet jeg ikke helt. Ser jo ikke hvordan scriptet ser ut basert på de opplysningene du kommer med. Jeg antar at du skjønner at absolutt alt som skal på den siden må mellom brakettene etter du har sjekket om SESSION er satt, type:

if(blabla) { alt på websiden} else { ingen tilgang }

Hvis du får errorer da, så ville jeg i tilfellet ha sett over queryene jeg sendte altså. Ingenting som står inne i en if-clause skal kjøres såfremt det som validerer er false.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
okay, jeg bruker i dag en

okay, jeg bruker i dag en session_start(); i toppen av hvert dokument inne på medlemsområdet:

<?php

session_start();

    if ($_SESSION['static-var'']) {

        require_once('/path/to/access-db-inndata.php');

        $var = mysql_real_escape_string($_SESSION['var']);

        $select = sprintf('SELECT * FROM table WHERE field = \'%d\'', $var);

       

        $query = mysql_query($select, $con);

        $data = mysql_fetch_assoc($query);

    }

    else { header ('location: http://www.ekbedriften.no/ekelogin/'); }

?>

Det som skjer nå, er at endten får man tilgang til innholdet på den aktuelle siden, hvis ikke så sendes man til loginn siden.

 

Jeg hadde i tankene at jeg kunne sette opp noe lignende, bare avsette ett nivåkrav for tilgang.

eks. alle seksjonene har ett gitt nivå. (egen <?php require 'session.php'; ?>

Nyheter >= 1 (alle)

Admin >= 9 (systemansvarlig)

Så når en bruker logger seg inn, så hentes den aktuelle brukerens nivå ut og sjekkes mot SESSION og avgjør tilgang til den aktuelle seksjonen eller siden.

 

Var det forstålig forklart?

EDIT: helt utrulig... Trur jammen jeg fikk det hele til å fungere... Helt fantastisk...

Nå får jeg avgrenset seksjoner basert på å sette en minimumskrav til bruker nivå. Kvalifiserer det ikke så sendes det UT! Hehee... eneste jeg gjerne skulle fått til erå sende en bruker til den siden de kom ifra. Noe slik:

else { header ('location: ' .  $_SERVER['HTTP_REFERER']); }

isteden for en URL. Men det fikk jeg ikke til å fungere.

Kjenner du til hvordan jeg får det det?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Referer

Bra du fikk det til. Jeg ville ikke stolt på innholdet i arrayen $_SERVER['HTTP_REFERER'], den er nemlig enkel å modifisere. Videre kan folk gå rett inn på siden, og da er ikke denne satt (siden de ikke klikket en link for å komme dit).

Er det ikke bedre å vise en error da? Uansett. Print ut innholdet av $_SERVER['HTTP_REFERER'] og se hva du finner når du klikker deg dit med gale innstillinger. Da ser du fort hva som er leif.

Men denne tråden er langt ute på viddene nå. Den handlet primært om å lagre innhold i MySQL, mens den nå omhandler hvordan man lager et backend og alle finurlighetene som hører med på et nettsted.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
sant sant... me stopper

sant sant... me stopper der...

Tilbake til lagring av artikkler via form etc.

kan vi se nærmere på hvordan man henter de ut igjen her?

Prøvde litt med JOIN etc. Men det var ikke det letteste. Klarer ikke helt å se det for meg hvordan det skal settes opp og lages linker så riktige artikkler med riktig "tilbehør" komme frem.

For nå er det vel mer ett html dokument med en struktur, og avhengig av hvilken ID som spørres så vises ett gitt innhold?

Først vil jeg påstå at tabellene med innhold gjøres tilgjenglig for bruk via en sånn mysql_fetch_assoc();. kansje? Jeg har sittet å vridd hode en god del, men ikke kommet frem til noen løsning...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
MySQL join query

Her spør du ikke lenger hvordan man lagrer informasjon i databasen, men om hvordan man skal bruke join i SQL. Lag en ny tråd på dette.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Dette spørsmålet går kansje

Dette spørsmålet går kansje under lagre innhold til databasen.

 

Jeg hvordan kan jeg hente informasjon fra to felter og sette inn i ett annet?

Altså:

Fornavn og Etternavn fylles inn sepparat via form.

Når informasjonen lagres så kopieres for- og etternavn til Fullt navn. Alt i samme tabell da...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Lagring av navn på to steder i MySQL

Hvis du allerede har lagret for- og etternavn i hvert sitt felt, hvorfor ha dem i et eget felt? Det blir jo dobbel lagring av samme data, noe som er unødvendig i en relasjonsdatabase. Dette går inn under såkalt normalisering.

Uansett, for å hente ut fra en database og sette inn i en annen så er det jo bare å kjøre en spørring på navnene som ligger der, kombinere variablene som utgjør fornavn og etternav og så kjøre en ny SQL-query der du lagrer dem igjen.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
denne informasjonen lagres i

denne informasjonen lagres i medlems informasjon tabellen. Grunnen var for å ha en verdi å forholde seg til i forbindelse med printing. Noen steder bruker jeg kun fornavnet, andre steder referer jeg til kun etternavn og andre ganger til fullt navn.

Men jeg kan jo bare sette opp en variabel som sammenkjører disse ed printing. så ikke noe vits i å fylle opp databasen med unødvendig informasjon. som du sier...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Normalisering av data

Enig.

Nå bytter ikke folk navn så ofte, men grunnen til at man normaliserer er fordi man da kan være mer sikker på riktigheten av data. Ta for eksempel dette med adresser. Om man har et system som lagrer adressene til brukerne, så vil man kun lagre dette på ett sted. Grunnen er selvfølgelig at man skal kunne endre adressen på ett sted, så trer virkningene i kraft alle steder, og man kan være sikker på at det er riktig.

Men det er også tilfeller hvor vi ikke ønsker å normalisere. Se på dette med adresser igjen. La oss si du har et ordresystem. Her står gjerne leveringsadressen på diverse fakturaer. Hvis systemet lager fakturaene on the fly med data fra databasen, så skal selvsagt ikke gamle adresser fjernes fra disse selvom brukeren oppdaterer adressen sin.

I et sånt tilfelle bør man altså lagre adressen for hver faktura. Men også her kan man normalisere.

For eksempel kan man gi adresser IDer. Gjør man det så vil kun én adresse lagres én gang i en egen tabell.

Det er med andre ord mange måter å gjøre ting på.

Svar på forumemnet

(If you're a human, don't change the following field)
Your first name.
Innholdet i dette feltet blir holdt privat og vil ikke bli vist offentlig.