Gå til innhold

søk script i php / database


Anbefalte innlegg

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 av Ernie
Lenke til kommentar
Videoannonse
Annonse

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 av TheClown
Lenke til kommentar
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 av Ernie
Lenke til kommentar
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 av Jonas
Lenke til kommentar
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

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

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

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 av eliminaaator
Lenke til kommentar
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 av eliminaaator
Lenke til kommentar

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 ;):p

 

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! :D (og at det var riktig, JohndoeMAKT! :p )

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...