skræddersyet database tabeller: oprettelse af tabel,,,,, 1,,,,,,,,, 6,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet skik database tabeller. skik database tabeller: sikkerhed først, i denne serie, vi kigger på ved hjælp af custom database tabeller.vi dækker over, hvordan man skaber, opretholder og fjerne den tabel, samt hvordan, sikkert og effektivt, tilføje, fjerne og søgning af data.i den første artikel, kan vi se på, når skik tabeller kan være hensigtsmæssige, fordele og ulemper ved at bruge dem, og hvordan man skaber den tabel, heldigvis wordpress giver en temmelig væsentlig api - grænseflade, der gør, at interagere med skik tabeller lidt enklere.navnlig: $wpdb, klasse og, dbdelta(), funktion, som vi vil se mere til i denne serie.på trods af, at det at skabe en skik tabel betyder at skabe noget fremmed for wordpress - og du mister de fleste af de rammer, der omgiver den indfødte tabeller.for det er grunden til, at de som stik af forfatter er ansvarlige for sikkert og effektivt samarbejde med den.så før at du nødt til omhyggeligt at overveje, om det er mere hensigtsmæssigt at anvende en eksisterende kerne.,, ulemperne ved hjælp af en sædvane, som nævnt, sædvane tabeller sidde uden for den normale wordpress ramme - og dette er for en stor del af den underliggende årsag til dens ulemper:,, der er nr. indfødte tilføje, fjerne, ajourføre eller søgningen funktioner, som kan interagere med bordet. eu - erhvervsgrenen skal bygges fra (næsten) bunden., sanitisation og caching er op til dig, men wordpress giver en stor hjælp i denne forbindelse). andre plugins, og wordpress selv, ikke forventer "jeres bord er der.på den anden side, hvis data er en specialbygget post - - så meget godt bygget tredjepart plugins vil arbejde sammen med det, wordpress - eller mange andre beslægtede plugins - backup - eller eksportere deres bord.(faktisk en hel del backup plugins støtte accessoriske tabeller, men eksport /import ikke er så ligetil, du er ansvarlig for at fastsætte strukturen i deres skik tabel (er) på den mest effektive måde, herunder at vælge det mest hensigtsmæssige data type til piller. du er ansvarlig for at skrive insekt fri og effektiv sql forespørgsler.,, når skaber en skik tabel passende?der er ingen "ret" svar på dette, og en fornuftig vurdering af fordele og ulemper er påkrævet.de foregående afsnit skitseres nogle alvorlige ulemper ved ikke at bruge de eksisterende wordpress skema - som sådan, hvis du er usikker på, - - er det bedst at undgå at skabe et bord.desuden er en skik, tabel tilgang kræver meget arbejde, og giver rig mulighed for kryb kravle ind.men med det i tankerne, når det er en skik tabel være passende?den datastruktur, et af de vigtigste argumenter for skik tabeller er, når data skal være struktureret på en sådan måde, at der er upassende for de indfødte tabeller., * _posts, tabel ifølge sagens natur er gearet til stillinger og sider, som kan være helt upassende for deres data.faktisk deres data bedst kan spredes over flere tabeller med forholdet mellem dem.det kan ikke være så kompliceret: stillinger 2 stillinger, stik af bruger en skik bord opbevarer mange mange forbindelser mellem post - typer.dette kan gøres ved hjælp af taksonomi api - og blev oprindelig) eller meta - api - - men ingen af disse er særlig effektiv, og samtidig kan være godt for mindre områder, der ikke skala.scribu flyttede stillinger 2 stillinger til en sædvane, tabel gennemførelse, således at oplysninger om et forhold, der er oplagret, mens de fleste tilfælde kan være presset ind i, * _posts støbeforme med post - meta - kan det ikke være den mest effektive vej: post - meta - tabel anvender fn 's indeks værdi kolonne opbevarer data.det er utrolig hurtigt på retrieving a posts meta - data (wordpress beskæftiger caching her for), men komplekse forespørgsler med meta - tabel, kan være ineffektive eller næsten umuligt, komplekse spørgsmål med relation til ovennævnte er komplekse spørgsmål, som de indfødte tabeller kan ikke udformes således, at de fuldstændig effektivt.i arrangør, for eksempel, en begivenhed, som er en post med begivenhed, datoer, opbevares i en særskilt tabel.selv om det ville være muligt at opbevare disse datoer, som efter meta - - så når begivenheder har mere end én dato ville være en datobaseret spørgsmål yderst vanskeligt og ineffektive - navnlig fordi meta - værdi kolonne, ikke er indekseret, omfang, hvis de anvender, wp_posts, og data er tilstrækkeligt stort (100.000 + stillinger) så det kan hindre opfyldelsen, afhængigt af hvad, du kører.dette argument i sig selv er temmelig svag, så der er mange ukendte faktorer, som vil påvirke dens gyldighed.i almindelighed, databaser er hurtigt på, hvad de gør - og de omkringliggende wordpress ramme har til formål at optimere spørgsmål så meget som muligt.i kombination med de to andre faktorer, men du kan finde et custom tabel viser den mest fornuftige løsning, at tabel, når du har besluttet, at en skik tabel er nødvendige, er vi nødt til at skabe det bord.før vi gør det, vi gemmer vores navn skik, tabel i, $wpdb,.denne globale indeholder alle de oplysninger, der vedrører den database for de nuværende blog (det vil ændre sig fra sted til sted, når der anvendes flere steder).vi kan tilføje vores bord navn til dette globale.det er slet ikke nødvendigt, men gør resten af vores kode lidt pænere:, add_action ("lokalitet, wptuts_register_activity_log_table ', 1); add_action (' switch_blog", "wptuts_register_activity_log_table); funktion wptuts_register_activity_log_table() (global $wpdb. $wpdb - > wptuts_activity_log =" ($wpdb - > præfiks} wptuts_activity_log "}, ovennævnte kode bruger $wpdb - > præfiks for at tilføje et præfiks til bords navn.resten er ved misligholdelse, wp_, men kan ændres af brugeren, wp ud. folkesundhedsprogrammet.dette er nødvendigt, da du kan have mere end en wordpress installere med samme database, men kan også ændres af andre grunde.som sådan kan du ikke antage præfikset er wp_,.som med funktioner, klasser og indstillinger o.s.v., bør de sikre dit bord navn er enestående. i hele denne serie vil vi komme tilbage til følgende eksempel.vi kan forestille os, at vi er ved at skabe en tabel til log brugeraktivitet (ajourføring eller fjernelse af stillinger, ændrede indstillinger, sender et billede, etc.), kolonne, at konventioner, der er forskellige konventioner, for hvordan du navngive din kolonne (og deres tabeller for den sags skyld) - men uanset hvor du navnene på dem, er det vigtigt, at være konsekvent.jeg vil anbefale med små bogstaver som i visse situationer, kolonne navne kan være følsomme, og som regel gør det mindre sandsynligt, at fejl og forbedrer læsbarheden.så vi ses senere i serien er det også nyttigt, når du har brug for at whitelist kolonner.du burde skille ord i kolonne navne (f.eks. post_data,, post_content) for læsbarhed, men du skal gøre det med understreger, og aldrig rum. du skal også undgå forbeholdt ord.hvis kolonnen henviser til en udenlandsk tab. så er det anbefalede dig bruge det udenlandske kolonne navn (f.eks. user_id, vores eksempel). i vores eksempel, vi vil navngive vores kolonner:,, log_id - log.,, user_id - bruger - id, for hvem log svarer., aktivitet, - den aktivitet, som fandt sted.,, object_id - id for den genstand (f.eks. post -, bruger - id, bemærkning id osv.), som var genstand for brugerens aktivitet.,, object_type, - type genstand (f.eks. "post", "bruger", "kommentarer" osv.), activity_date - datetime i aktivitet., beslutte, kolonnen former, før du går videre, du bliver nødt til at beslutte, hvilke data typer af kolonnerne, deres bord er nødt til.kolonne former kan opdeles i tre kategorier: tråde, numerics og datetimes.for hver af disse er der mange varianter.du kan finde en henvisning hertil. det er vigtigt at vælge den relevante data type til dit bord, da dette vil påvirke effektiviteten af deres forespørgsler.visse datatyper, giver dig mulighed for at fastsætte en grænse (f.eks. varchar (40), som giver dig mulighed for at oplagre op til 40 personer).grænsen er valgfri, men anbefales, da det kan forbedre resultaterne - - så du bliver nødt til at beslutte for hver kolonne, hvad er den maksimale størrelse af tegn, kolonnen vil kræve.note til numeriske datatyper længden henviser til antallet af tal - ikke den maksimale (f.eks. int (10), tillader ikke - negative tal på op til 10 cifre - op til 4294967295). ved lagring af datoer, du skulle næsten altid bruge, datetime, datatype (opbevaret som 2012-11-05 14:55:10) - og bestemt ikke et menneske venlige repræsentation af den dato (f.eks. 5. november 2012 2:55pm)., datetime, værdier, let kan formateres i en menneskeligt læsbar form ved hjælp af funktioner, som mysql2date(),.du bør opbevare datoer (utc timezone og, om nødvendigt, skift til en anden timezone på produktionen. i vores eksempel må vi log_id:,,, - bigint (20), user_id, - bigint (20), aktiviteter, - varchar (20), object_id, - bigint (20), object_type, - varchar (20), fødselsdato, datetime,, indeksering kolonner, næste gang du skal beslutte, hvilke kolonner til indeks - de vil betragtes som væsentlige, s, som vil være den primære nøgle.den primære nøgle er en kolonne, hvor hver række har en enestående, indrejse - som regel er det bare en automatisk forøgelse af heltal, først og fremmest den række. værdierne af de andre indekseret kolonner, behøver ikke at være enestående, men værdien bør fastsætte et relativt lille sæt regnskaber.idéen om indeksering er at forbedre læse forespørgsler.uden et indeks søgning skal læse hele tabellen for at finde tilsvarende rækker.hvis en kolonne er indekseret, og en del af det spørgsmål, så det kan hurtigt finde rækker, at matche det kolonne og det mindre antal tilsvarende rækker kan kontrolleres i forhold til forespørgslen (analogi er et indeks for en bog). som sådan, hvis du ikke sætter spørgsmålstegn ved søjlen, så vil det ikke hjælpe indeksering af kolonne (hvis du ser aldrig et ord i den bog er indeks, kan det lige så godt være der.eller hvis en masse papirer har samme værdi som en "køn" kolonne, da dette vil ikke give meget bedre på en fuld scanning (tabel forestille mig en bog indeks, der er et ord, der er anført på hver side)., indeksering er heller ikke frit: kolonne angives som væsentlige, gør reducere skrive ydeevne (til at fortsætte den analogi, du skal ajourføre bog indeks, når en indekseret ord tilføjes eller fjernes, og så er du nødt til at beslutte, hvad den rigtige balance for deres oprettelse.yderligere oplysninger kan findes her, da det er sandsynligt, at vi vil søge af brugeren (se deres seneste aktivitet), vil vi være indeksering i kolonnen, og ved, log_id, som den primære nøgle., at tabellen, lægger vi den kode for at skabe den skik, tabel i følgende funktioner: funktion wptuts_create_tables() (//kode for at skabe et bord her} //skabe tabeller for stik af aktivering register_activation_hook (__file__, wptuts_create_tables'); denne funktion skal være opfordret stik af er aktivering, klo, samt den tid, vi ønsker at foretage ændringer på bordet - f.eks. kolonne eller ændre deres datatype (vi vil dække, hvorfor senere i serien). den omstændighed, at ved hjælp af aktivering klo, wptuts_create_tables(), kunne kaldes en tabel allerede findes, er ikke en forglemmelse - og igen, vi dækker derfor på et senere tidspunkt i serie. i denne funktion, der omfatter wp admin /omfatter /upgrade.php, at oprette et par konstanter og lad den funktion, dbdelta(),.bemærk, at når et stik af aktiveres den ikke, lokalitet, klo, så wptuts_register_activity_log_table(), skal kaldes manuelt. require_once (abspath. "wp admin /omfatter /opgradering. folkesundhedsprogrammet) globale $wpdb; globale $charset_collate; //kalder det manuelt, som vi kan have overset lokalitet klo wptuts_register_activity_log_table(); de globale, $charset_collate, indeholder det tegnsæt og indsamling, der anvendes af de indfødte wordpress tabeller.løst disse definere encodings tegn, og hvordan de har sammenlignet - i betragtning af, at wordpress anvendes i mange forskellige sprog, er det vigtigt at anvende den korrekt indsamling til dit bord. - bortset fra indsamling, sql erklæring bør erklære tabel navn sammen med hver kolonne, dens art og værdi, og enhver misligholdelse, nøgle, kolonner, herunder en, primære nøgle, kolonne.typisk vil det være i form: skabe tabel [tabel navn] ([primære nøgle kolonne] bigint (20) ikke underskrevet, ikke er auto_increment [kolonne navn] [data] [ikke] type primære nøgle ([kolonne navn]), central key_name (kolonne navn]) [indsamling]; for at skabe denne tabel vi tilføje følgende til vores, wptuts_create_tables(), funktion: $sql_create_table = "skabe tabel ($wpdb - > wptuts_activity_log} (log_id bigint (20) ikke underskrevet, ikke er auto_increment, user_id bigint (20) ikke underskrevet, ikke for misligholdelse" 0 "aktivitet varchar (20) ikke for misligholdelse" ajourføres, object_id bigint (20) ikke underskrevet, ikke for misligholdelse "0", object_type varchar (20) ikke for misligholdelse "post", activity_date datetime ikkefor misligholdelse, 0000-00-00 lang, primære nøgle (log_id), central user_id (user_id) $charset_collate. "dbdelta ($sql_create_table), dbdelta(), funktion udfører vores skabe tabel, kommando.det kan være meget streng med sql erklæring til det.for eksempel, der skal to rum mellem primære nøgle, og den primære nøgle kolonne.og nøgler skal have et navn., fejlfinding, hvis aktivering finder du får du det, du har x karakter af uventede effekt... "fejlmeddelelse - det er sandsynligt, at der er en fejl i din sql erklæring.nogle gange er det på grund af, dbdelta(), er strenge.hvis man tilføjer, wp_die(); efter, dbdelta(), det dræber forarbejdning og (med er wp_debug er sat til ægte) vil videregive fejlmeddelelser. oversigt, i denne artikel, vi har kigget på, hvorfor du skulle og ikke skulle bruge skik tabeller, såvel de oplysninger, du bliver nødt til at overveje og endelig hvordan skabes der et bord.den næste del af denne serie vil dække sanitisation, ser på sql injektion, og hvordan du beskytter dig fra det.koden i denne artikel, er til rådighed på dette github register, og vil blive ajourført som serie fortsætter.,, ressourcer, mysql: datatyper, mysql: forbeholdte udtryk for kolonne og talbes, mysql: indeks, indførelse mysql, codex: etablering af tabeller med plugins, codex: $wpdb, klasse,