Ernie Skrevet 30. november 2009 Del Skrevet 30. november 2009 (endret) Det blir nok valgt fordi det er makslengden for varchar. Hvis man skal sette en grense, hvorfor ikke bare sette den til den største verdien? Uansett må det settes en før eller siden. MySQL kan ikke lagre en uendelig lengde med tekst selv om man spesifiserer longtext. Det er ingenting i veien for å sette den til 65535, 16777215 eller 4294967295, som er maksgrensen i byte for henholdsvis text, mediumtext og longtext, hvis man mener det er sannsynlig og verdt å øke makslengden, men du setter allikevel en grense ved den verdien du velger. Hvis man ikke skal la det være en teknisk begrensning, hvilken verdi skal man da velge? Når man snakker om brukernavn så er det tross alt også snakk om noe man regner med at en bruker skal klare å huske og ikke minst taste inn hver gang han/hun logger inn. 255 tegn virker for de fleste å være såpass langt at man ikke tror noen vil ønske et brukernavn som er i nærheten av dette. Forøvrig, man må såklart sjekke at dataene man får inn er gyldige både i forhold til innhold og lengde. At IPB tillater registrering av brukernavn over grensen er ikke bare et bevis på dårlig design og koding av IPB, men også hvor elendig MySQL er til tider. En database skal ikke stiltiende akseptere at data inn er lengre enn feltet det skal inn i. Enhver vettug database ville gitt en feilmelding på slikt. Red.: Siden du er såpass imot 255 tegn som grense. Hva bør grensen være? Endret 30. november 2009 av Ernie Lenke til kommentar
kbot Skrevet 30. november 2009 Del Skrevet 30. november 2009 jeg bare siterte det so står i dolumentasjonen for MySql 5 Lenke til kommentar
TheClown Skrevet 30. november 2009 Del Skrevet 30. november 2009 (endret) Når jeg koder sørger jeg for at alle forhåndsregler er tatt når jeg sier meg ferdig med en kode. Så selv om jeg hadde tatt input-lengde som 255 hadde jeg fremdeles i PHP sjekket lengden, strippet/nektet mange av de karakterene du foreslår og bedt brukeren pent gjøre det igjen. Hvis du tenker logisk ville de færreste sidene tillate noe sånt i brukernavn, tittel, eller mail. Det er rett og slett for mange ugyldige karakterer som strider mot sikkerhet på en nettside. Så den eneste løsningen er å ha et brukernavn som består av 255 bokstaver/tall. Det har jeg ALDRI sett. Hvis du kommer over ett av disse tilfellene du tydeligvis har vært borti, kan du være så grei å ta en prt scr? Hadde vært artig å sett hvilke systemer som tillater noe sånt. 99% av alle sider jeg har vært borti, i form av forum, blogg eller CSM har lagret mye av informasjonen i Varchar, fremfor text, og med de begrensningene som vi har listet opp før. Text er rett og slett unødvendig hvis man veit, med 99% sikkerhet at ingen kommer til å prøve på å komme over 255-grensen, fordi det er bare urealistisk å tenke sånt. Endret 30. november 2009 av TheClown Lenke til kommentar
Ernie Skrevet 30. november 2009 Del Skrevet 30. november 2009 (endret) jeg bare siterte det so står i dolumentasjonen for MySql 5 Da lurer jeg veldig på hva du har lest i manualen, for det er også stedet hvor jeg har lest det. Maks lengde for varchar finner man her. Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions. The effective maximum length of a VARCHAR in MySQL 5.0.3 and later is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. Makslengden for text og tilhørende avarter leser man ut fra «storage requirements» i og med at man ikke kan definere noen egen makslengde for text/mediumtext/longtext (man treffer i stedet potensielt en rekke begrensninger i overføring etc. mot MySQL). Data Type Storage Required CHAR(M) M × w bytes, 0 <= M <= 255, where w is the number of bytes required for the maximum-length character in the character set BINARY(M) M bytes, 0 <= M <= 255 VARCHAR(M), VARBINARY(M) L + 1 bytes if column values require 0 – 255 bytes, L + 2 bytes if values may require more than 255 bytes TINYBLOB, TINYTEXT L + 1 bytes, where L < 2^8 BLOB, TEXT L + 2 bytes, where L < 2^16 MEDIUMBLOB, MEDIUMTEXT L + 3 bytes, where L < 2^24 LONGBLOB, LONGTEXT L + 4 bytes, where L < 2^32 ENUM('value1','value2',...) 1 or 2 bytes, depending on the number of enumeration values (65,535 values maximum) SET('value1','value2',...) 1, 2, 3, 4, or 8 bytes, depending on the number of set members (64 members maximum) M er definert lengde og L er faktisk lengde Endret 30. november 2009 av Ernie Lenke til kommentar
Jonas Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 (endret) Hvis du tenker logisk ville de færreste sidene tillate noe sånt i brukernavn, tittel, eller mail. Det er rett og slett for mange ugyldige karakterer som strider mot sikkerhet på en nettside. Grunnen til at man ofte kun tillater alfabetiske og numeriske tegn i ting som f.eks. brukernavn er ikke på grunn av sikkerhet. Det er utelukkende på grunn av estetiske og praktiske grunner. Det ser stygt ut dersom et brukernavn dekker halve skjermen og det upraktisk dersom ingen klarer å skrive det med et ordinært tastatur. Dersom dette er uønskelige egenskaper ved brukernavn i systemet, så kan man like godt redusere begresningen fra 255 tegn til.. si 20. Fordi alt over 20 er langt, stygt og upraktisk å skrive. En mellomting av estetiske, praktiske brukernavn og brukernavn uten begrensning gir egentlig ingen mening. Dersom det du kaller «usikre tegn» faktisk utgjør en potensiell sikkerhetsrisiko i sysemene dine, så burde du seriøst revurdert systemenes status som "sikre". Det blir nok valgt fordi det er makslengden for varchar. Hvis man skal sette en grense, hvorfor ikke bare sette den til den største verdien? Hva om man tar den tanken videre og spør; Hvis man ikke er ute etter å begrense slik at det blir et irritasjonsmoment og setter grensen til hva som er maks, hvorfor ikke bruke en datatype med større maksgrense? Endret 1. desember 2009 av Jonas Lenke til kommentar
eliminaaator Skrevet 1. desember 2009 Forfatter Del Skrevet 1. desember 2009 De var ikke de eg laget denne tråden for Lenke til kommentar
Ernie Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 De var ikke de eg laget denne tråden for Du gir oss ikke akkurat så mye å jobbe ut ifra da. «virker ikke får bare error» sier oss veldig lite. virker ikke får bare error Kom med feilmeldinegene du får, så kanskje du kan få noen tips... Hele koden, samt feilmelding plx Lenke til kommentar
eliminaaator Skrevet 1. desember 2009 Forfatter Del Skrevet 1. desember 2009 son ser scripte ut de kan vere eg er helt på jore nå men <?php $sok = ($_GET['sok']); //Kjører SQL-spørring mot databasen $sql = "SELECT FROM nyheter WHERE tittel LIKE '%$sok%' AND innhold LIKE '%$sok%' "; $resultat = mysql_query($sql, $tilkobling); //Vise innholdet $rad = mysql_fetch_array($resultat); $tittel = $rad['tittel']; ?> <?php echo"$tittel"; ?> <?php } ?> Lenke til kommentar
MikkelRev Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 Har du prøvd det ut? Der ser ut som det virker, men hva om den finner flere treff? Da viser den vel kun første treff? Jeg ville antakelig gjort noe slikt: //Vise innholdet while($rad = mysql_fetch_array($resultat,MYSQL_ASSOC) { echo $rad["tittel"]."<br />"; } Lenke til kommentar
eliminaaator Skrevet 1. desember 2009 Forfatter Del Skrevet 1. desember 2009 ser ikke ut som noe av de virker Lenke til kommentar
Wackamole Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 (endret) Nå er jeg absolutt ikke verdensmester på sql, men skal ikke denne være noe sånn som denne?: "SELECT FROM nyheter WHERE tittel AND innhold LIKE '%$sok%'"; Endret 1. desember 2009 av Famen Lenke til kommentar
eliminaaator Skrevet 1. desember 2009 Forfatter Del Skrevet 1. desember 2009 Nå er jeg absolutt ikke verdensmester på sql, men skal ikke denne være noe sånn som denne?: "SELECT FROM nyheter WHERE tittel AND innhold LIKE '%$sok%'"; virker ikke de heller Lenke til kommentar
Wackamole Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 aaah! herregud! SELECT * FROM nyhe... - Du må fikse all operanden Lenke til kommentar
eliminaaator Skrevet 1. desember 2009 Forfatter Del Skrevet 1. desember 2009 nå ser de son ut <?php $sok = ($_GET['n']); //Kjører SQL-spørring mot databasen $sql = "SELECT * FROM nyheter WHERE tittel LIKE '%$sok%' AND innhold LIKE '%$sok%' "; $resultat = mysql_query($sql, $tilkobling); //Vise innholdet while($rad = mysql_fetch_array($resultat,MYSQL_ASSOC) { echo $rad["tittel"]."<br />"; } ?> og de virker enda ikke Lenke til kommentar
JohndoeMAKT Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 Hva er innholdet i tabellen? Lenke til kommentar
eliminaaator Skrevet 1. desember 2009 Forfatter Del Skrevet 1. desember 2009 (endret) her er alle kodene på helle driten for og søke skriver eg vis.php?n=test -- -- Tabellstruktur for tabell `nyheter` -- CREATE TABLE IF NOT EXISTS `nyheter` ( `id` int(11) NOT NULL auto_increment, `tittel` varchar(100) NOT NULL, `innhold` text NOT NULL, `dato` date NOT NULL, `ip` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=700 ; -- -- Dataark for tabell `nyheter` -- INSERT INTO `nyheter` (`id`, `tittel`, `innhold`, `dato`, `ip`) VALUES (698, 'test nyheter', 'mer og skrive', '0000-00-00', ''), (699, 'nyheter', 'ikke noe og skrive', '0000-00-00', ''); vis.php ______________________________________________________________________________ <?php include "config.php"; ?> <?php $sok = ($_GET['n']); //Kjører SQL-spørring mot databasen $sql = "SELECT * FROM nyheter WHERE tittel LIKE '%$sok%' AND innhold LIKE '%$sok%' "; $resultat = mysql_query($sql, $tilkobling); //Vise innholdet while($rad = mysql_fetch_array($resultat,MYSQL_ASSOC) { echo $rad["tittel"]."<br />"; } ?> config.php ______________________________________________________________________________ <?php $server = "localhost"; // Server du kobler til. Som oftest localhost $database = "db1000995"; // Databasenavnet. $db_bruker = "u1000995"; // Brukernavn i mysql. $db_pass = "mit passord"; // Passord i mysql. // Kobler til serveren $tilkobling = mysql_connect($server, $db_bruker, $db_pass) or die ("Kunne ikke koble til serveren!" . mysql_error()); // Velger databasen mysql_select_db($database) or die ("Kunne ikke velge database! " . mysql_error()); ?> Endret 1. desember 2009 av eliminaaator Lenke til kommentar
JohndoeMAKT Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 (endret) Det er ingenting galt med koden din, men du har jo ingenting i databasen som matcher søket ditt. EDIT: Ingenting bortsett fra at den er ustrukturert, farlig og alt det andre vanlige du finner hos de fleste PHP-programmerere. Endret 1. desember 2009 av JohndoeMAKT Lenke til kommentar
eliminaaator Skrevet 1. desember 2009 Forfatter Del Skrevet 1. desember 2009 (endret) Det er ingenting galt med koden din, men du har jo ingenting i databasen som matcher søket ditt. EDIT: Ingenting bortsett fra at den er ustrukturert, farlig og alt det andre vanlige du finner hos de fleste PHP-programmerere. vist eg søker på "nyheter" så skal den matche (698, 'test nyheter', 'mer og skrive', '0000-00-00', ''), (699, 'nyheter', 'ikke noe og skrive', '0000-00-00', ''); vist eg søker på "test" så skal den matche (698, 'test nyheter', 'mer og skrive', '0000-00-00', ''), osv men de kommer jo ikke noe og da må de jo vere feil ein plass Endret 1. desember 2009 av eliminaaator Lenke til kommentar
JohndoeMAKT Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 Nei, den skal ikke matche de to linjene. Se igjen hva spørringen din gjør. Lenke til kommentar
Wackamole Skrevet 1. desember 2009 Del Skrevet 1. desember 2009 JohndoeMAKT! - Du er så flotters og ikke si hva som er feil og heller hinter til det, da kan brukeren lære selv hvordan man feilsøker og hvordan man skal forstå en kode-bit! Jeg fant ut hva det var Det var faktisk veldig enkelt, og en veldig liten feil som godt kan forveksles når man er "nybegynner". $sql = "SELECT * FROM nyheter WHERE tittel LIKE '%$sok%' OR innhold LIKE '%$sok%' "; I koden oppfor eliminaaator, så har jeg byttet ut AND operanden med en OR - Fordi du vil ikke at den SKAL matche søket ditt i BÅDE tittel tabellen og innhold tabellen, du skal ha EN av dem, derfor må du benytte OR operanden Håper du forsto! (og at det var riktig, JohndoeMAKT! ) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå