|
| At tjekke om et password er optaget ? Fra : Jakob Munck |
Dato : 03-12-05 14:47 |
|
I forbindelse med en portal jeg laver skal jeg tjekke om brugerens valgte
password allerede er optaget, da det så ikke kan bruges. Men jeg er ikke
klar over den rette metode at gøre dette. Her er mit forslag (delvis i
pseudokode):
<?
......
$password = $_POST["password"];
mysql_query("SELECT * FROM tbMedlemmer WHERE password = $password");
if (der findes noget...???){
header("Location: password_optaget.php");
}
.....
?>
Da det er delvis pseudokode, virker det ikke. Men hvad er den rigtige
metode?
v.h.
Jakob
| |
Andreas M. (03-12-2005)
| Kommentar Fra : Andreas M. |
Dato : 03-12-05 15:02 |
|
Jakob Munck wrote:
> I forbindelse med en portal jeg laver skal jeg tjekke om brugerens valgte
> password allerede er optaget, da det så ikke kan bruges. Men jeg er ikke
> klar over den rette metode at gøre dette. Her er mit forslag (delvis i
> pseudokode):
Umiddelbart tror jeg det virker fint. Men hvorfor må 2 brugere ikke have
det samme kodeord? Det lyder som om du kun vil bruge kodeord til login,
og intet brugernavn?
--
Andreas M.
| |
Jakob Munck (03-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 03-12-05 15:18 |
|
> Umiddelbart tror jeg det virker fint.
Det gør det ikke. bl.a. p.g.a. denne linie: "if (der findes noget...???){"
som jo er ren pseudokode. Men jeg ved ikke, hvordan det skal skrives
korrekt. Hjælp udbedes!
Men hvorfor må 2 brugere ikke have
> det samme kodeord? Det lyder som om du kun vil bruge kodeord til login, og
> intet brugernavn?
>
Korrekt, enig. Rent faktisk er det også Brugernavn, jeg vil tjekke på, men
jeg troede at det blev lettere at forstå hvis jeg skrev password. Men det er
vel - rent kodemæssigt - ret ligegyldigt. Det drejer sig om hvordan man
finder ud af om en given streng (et navn) er i tabellen allerede, eller
ikke.
Og hvordan gør man det??
v.h.
Jakob
| |
Andreas M. (03-12-2005)
| Kommentar Fra : Andreas M. |
Dato : 03-12-05 15:37 |
|
Jakob Munck wrote:
>> Umiddelbart tror jeg det virker fint.
>
> Det gør det ikke. bl.a. p.g.a. denne linie: "if (der findes noget...???){"
> som jo er ren pseudokode. Men jeg ved ikke, hvordan det skal skrives
> korrekt. Hjælp udbedes!
Nåå, jeg læste det som at du ville vide om det var den bedste måde at
gøre det på, ikke at du gerne ville have pseudokoden oversat (som jeg
derudfra konkluderede du selv kunne)... Men noget i retning af det her
så: (utestet)
$password = $_POST["password"];
$result = mysql_query("SELECT * FROM tbMedlemmer WHERE password =
$password");
if (mysql_num_rows($result) != 0){
header("Location: password_optaget.php");
}
--
Andreas M.
| |
Johan Holst Nielsen (03-12-2005)
| Kommentar Fra : Johan Holst Nielsen |
Dato : 03-12-05 16:11 |
|
Andreas M. wrote:
> Jakob Munck wrote:
>
>>> Umiddelbart tror jeg det virker fint.
>>
>>
>> Det gør det ikke. bl.a. p.g.a. denne linie: "if (der findes
>> noget...???){" som jo er ren pseudokode. Men jeg ved ikke, hvordan det
>> skal skrives korrekt. Hjælp udbedes!
>
>
> Nåå, jeg læste det som at du ville vide om det var den bedste måde at
> gøre det på, ikke at du gerne ville have pseudokoden oversat (som jeg
> derudfra konkluderede du selv kunne)... Men noget i retning af det her
> så: (utestet)
>
> $password = $_POST["password"];
>
> $result = mysql_query("SELECT * FROM tbMedlemmer WHERE password =
> $password");
Hmm - der bør nok være ' rundt om $password - og hvorfor egentlig
kopiere $_POST['password'] ned i $password overhovedet?
mvh
Johan
| |
Peter Brodersen (03-12-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 03-12-05 15:08 |
|
On Sat, 3 Dec 2005 14:47:22 +0100, "Jakob Munck"
<jm2_fjern_dette@webspeed.dk> wrote:
>I forbindelse med en portal jeg laver skal jeg tjekke om brugerens valgte
>password allerede er optaget, da det så ikke kan bruges.
Generelt: Lad være med dette.
Der er intet i vejen for at to personer har samme password, og det er
helt sikkert et sikkerhedshul, hvis en bruger får at vide, at en anden
bruger har et givent password. Så er det jo blot at prøve at logge ind
som de forskellige brugere med dette password.
--
- Peter Brodersen
| |
Martin (04-12-2005)
| Kommentar Fra : Martin |
Dato : 04-12-05 03:13 |
|
Jakob Munck wrote:
> I forbindelse med en portal jeg laver skal jeg tjekke om brugerens valgte
> password allerede er optaget, da det så ikke kan bruges. Men jeg er ikke
> klar over den rette metode at gøre dette. Her er mit forslag (delvis i
> pseudokode):
>
> <?
> .....
> $password = $_POST["password"];
>
> mysql_query("SELECT * FROM tbMedlemmer WHERE password = $password");
Nu ved jeg det er 2. gang jeg siger det til dig :)
WHERE password = '$password' <-- BRUG ' ' uden om dine felter!
Desuden så burde du ikk bruge reserverede ord i feltnavne (password er
et reserveret ord) - brug istedet fx kodeord = '$password'
Nå nu til spørgsmålet:
Der er en del metoder - enten kan du få mysql til at tælle resultaterne,
eller du kan hente alle ting ind i en php variabel og tælle størrelsen
på denne.
Desuden - så for guds skyld, lad vær med at bruge * i din select - det
sætter lige mysql tempoet en kæmpe del ned.
1: metode
$antal = mysql_result(
mysql_query("
SELECT COUNT(*)
FROM tbMedlemmer
WHERE password = '$password'
"
,0);
print $antal;
2: metode
$sql = mysql_query("
SELECT COUNT(*)
FROM tbMedlemmer
WHERE password = '$password'
");
list($antal) = mysql_query($sql);
print $antal;
3: metode
$sql = mysql_query("
SELECT *
FROM tbMedlemmer
WHERE password = '$password'
");
$antal = mysql_num_rows($sql);
print $antal;
Jeg fortrækker helt klart metode 1 - den er hurtigst :)
(bevist på en database med ca 900.000 rækker i)
PS: det eneste sted du må bruge * i en select, er ved COUNT(*) da det
ikke betyder noget - men ellers ikke!
(bare et godt råd!)
--
Venlig hilsen
Martin
| |
Martin (04-12-2005)
| Kommentar Fra : Martin |
Dato : 04-12-05 03:18 |
|
Martin wrote:
> Nu ved jeg det er 2. gang jeg siger det til dig :)
> WHERE password = '$password' <-- BRUG ' ' uden om dine felter!
>
Baaah - der skulle ikke stå felter - der skulle stå variabler :)
--
Venlig hilsen
Martin
| |
Jakob Munck (04-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 04-12-05 08:33 |
|
>
> Nu ved jeg det er 2. gang jeg siger det til dig :)
> WHERE password = '$password' <-- BRUG ' ' uden om dine felter!
>
Ja, undskyld jeg er lidt langsom i opfattelsen, men skal ma ALTID bruge ' '
uden om felterne? Også ved integers/tal??
> Desuden så burde du ikk bruge reserverede ord i feltnavne (password er et
> reserveret ord) - brug istedet fx kodeord = '$password'
>
Ja, ok. Men må man så slet ikke bruge dette ord nogle steder? Heller ikke
som feltbetegnelse i databasen??
>
> Desuden - så for guds skyld, lad vær med at bruge * i din select - det
> sætter lige mysql tempoet en kæmpe del ned.
>
OK, det tjekker jeg lige.
> 1: metode
> $antal = mysql_result(
> mysql_query("
> SELECT COUNT(*)
> FROM tbMedlemmer
> WHERE password = '$password'
> "
> ,0);
>
Hvis det er står her er det samme som følgende:
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM tbmembers WHERE
password = '$password'",0);
så virker det ikke. I hvert fald ikke hos mig.
>
> 2: metode
> $sql = mysql_query("
> SELECT COUNT(*)
> FROM tbMedlemmer
> WHERE password = '$password'
> ");
> list($antal) = mysql_query($sql);
> print $antal;
>
Denne metode virker heller ikke (hos mig). Resultatet er altid 0, uanset
hvor mange rækker den burde tælle op.
> 3: metode
> $sql = mysql_query("
> SELECT *
> FROM tbMedlemmer
> WHERE password = '$password'
> ");
> $antal = mysql_num_rows($sql);
> print $antal;
>
Denne metode virker.
> Jeg fortrækker helt klart metode 1 - den er hurtigst :)
> (bevist på en database med ca 900.000 rækker i)
>
>
> PS: det eneste sted du må bruge * i en select, er ved COUNT(*) da det ikke
> betyder noget - men ellers ikke!
> (bare et godt råd!)
>
>
Mange tak for de gode råd, som jeg lærer en masse af. Tak, tak!
v.h.
Jakob
| |
Martin (04-12-2005)
| Kommentar Fra : Martin |
Dato : 04-12-05 12:01 |
|
Jakob Munck wrote:
>> Nu ved jeg det er 2. gang jeg siger det til dig :)
>> WHERE password = '$password' <-- BRUG ' ' uden om dine felter!
>>
>
> Ja, undskyld jeg er lidt langsom i opfattelsen, men skal ma ALTID bruge ' '
> uden om felterne? Også ved integers/tal??
Jeg har ALTID haft fået en eller anden fejl hvis jeg har skrevet
ID = $php_id
Hvor ID = integer med autoincrement og $php_id = et tal.
Derfor så smider jeg det altid i ' ' så virker det ihvertfald.
>
>
>> Desuden så burde du ikk bruge reserverede ord i feltnavne (password er et
>> reserveret ord) - brug istedet fx kodeord = '$password'
>>
>
> Ja, ok. Men må man så slet ikke bruge dette ord nogle steder? Heller ikke
> som feltbetegnelse i databasen??
Prøv at lave en feltbetegnelse med et af disse ord:
< http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html>
Så burde du få en fejl - så nej det ville ikke være en god idé.
Variabel navne i PHP - der er også nogen reserveret ord, man bør undgå
< http://aspn.activestate.com/ASPN/docs/PHP/reserved.html>
Men en php variabel kan godt hedde et mysql reserveret ord, hvis det var
det du tænkte på :)
>
>
>> Desuden - så for guds skyld, lad vær med at bruge * i din select - det
>> sætter lige mysql tempoet en kæmpe del ned.
>>
>
> OK, det tjekker jeg lige.
>
>
>
>> 1: metode
>> $antal = mysql_result(
>> mysql_query("
>> SELECT COUNT(*)
>> FROM tbMedlemmer
>> WHERE password = '$password'
>> "
>> ,0);
>>
>
> Hvis det er står her er det samme som følgende:
>
> $antal = mysql_result(mysql_query("SELECT COUNT(*) FROM tbmembers WHERE
> password = '$password'",0);
Heh - det var så lige min fejl, den korrekte skulle se således ud:
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM tbmembers WHERE
password = '$password'"),0);
Altså manglede der en ) som afslutter mysql_query.
>
> så virker det ikke. I hvert fald ikke hos mig.
>
>
>> 2: metode
>> $sql = mysql_query("
>> SELECT COUNT(*)
>> FROM tbMedlemmer
>> WHERE password = '$password'
>> ");
>> list($antal) = mysql_query($sql);
>> print $antal;
>>
>
> Denne metode virker heller ikke (hos mig). Resultatet er altid 0, uanset
> hvor mange rækker den burde tælle op.
Uden at have testet det, så burde dette virke:
$sql = mysql_query("
SELECT COUNT(*) AS antal
FROM tbMedlemmer
WHERE password = '$password'
");
list($antal) = mysql_query($sql);
print $antal;
>
>
>> 3: metode
>> $sql = mysql_query("
>> SELECT *
>> FROM tbMedlemmer
>> WHERE password = '$password'
>> ");
>> $antal = mysql_num_rows($sql);
>> print $antal;
>>
>
> Denne metode virker.
Ja det gør den, men ikke den mest optimale.
Grunden ligger i at du fylder rammen op med HELE din database (hvor
password = password)
Det kunne jo være 1 mio. rækker du henter, og det fylder jo lidt :)
>
>
>> Jeg fortrækker helt klart metode 1 - den er hurtigst :)
>> (bevist på en database med ca 900.000 rækker i)
>>
>>
>> PS: det eneste sted du må bruge * i en select, er ved COUNT(*) da det ikke
>> betyder noget - men ellers ikke!
>> (bare et godt råd!)
>>
>>
>
>
> Mange tak for de gode råd, som jeg lærer en masse af. Tak, tak!
Jamen, det var da så lidt da :)
PPS: Så er der en nyhedsgruppe til database spørgsmål, hvor der sidder
nogen endnu større eksperter i SQL querys :)
>
> v.h.
> Jakob
>
>
--
Venlig hilsen
Martin
| |
Thomas Finnerup (04-12-2005)
| Kommentar Fra : Thomas Finnerup |
Dato : 04-12-05 08:48 |
|
On Sun, 04 Dec 2005 03:13:06 +0100, Martin <news@natten-i.dk> wrote:
> Desuden så burde du ikk bruge reserverede ord i feltnavne (password er
> et reserveret ord) - brug istedet fx kodeord = '$password'
Nej, password er ikke et reserveret ord. Hvis det var, ville
forespørgslen fejle og han ville være nødt til enten at skrive
`password` eller bruge et andet ord.
Venligst
Thomas
| |
Martin (04-12-2005)
| Kommentar Fra : Martin |
Dato : 04-12-05 12:01 |
|
Thomas Finnerup wrote:
> On Sun, 04 Dec 2005 03:13:06 +0100, Martin <news@natten-i.dk> wrote:
>
>> Desuden så burde du ikk bruge reserverede ord i feltnavne (password er
>> et reserveret ord) - brug istedet fx kodeord = '$password'
>
> Nej, password er ikke et reserveret ord. Hvis det var, ville
> forespørgslen fejle og han ville være nødt til enten at skrive
> `password` eller bruge et andet ord.
Se, det troede jeg faktisk det var, men har lige kigget reservet ord
listen igennem.
Ved ikke hvor jeg havde det fra, men jeg tager skylden på mig :)
>
>
> Venligst
> Thomas
--
Venlig hilsen
Martin
| |
Jakob Munck (04-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 04-12-05 09:22 |
|
>
> Desuden - så for guds skyld, lad vær med at bruge * i din select - det
> sætter lige mysql tempoet en kæmpe del ned.
>
Er det ikke lidt for kategorisk udtrykt?
Hvis en tabel indeholder fire felter og jeg skal bruge dem alle, så er det
vel rimeligt at bruge SELECT * ?
Og hvis jeg nu kun skal bruge de tre, mon så ikke det er meget begrænset
hvor meget hastigheden sættes hed, set i forhold til hvis jeg havde
navngivet dem alle i min sql-sætning?
Men hvis jeg kun skal bruge én variabel og jeg finder fem ved at bruge *, så
er det spild af servertid, det er klart.
Enig?
v.h.
Jakob
| |
Jacob Atzen (04-12-2005)
| Kommentar Fra : Jacob Atzen |
Dato : 04-12-05 10:27 |
|
On 2005-12-04, Martin <news@natten-i.dk> wrote:
> Desuden - så for guds skyld, lad vær med at bruge * i din select - det
> sætter lige mysql tempoet en kæmpe del ned.
[snip]
> PS: det eneste sted du må bruge * i en select, er ved COUNT(*) da det
> ikke betyder noget - men ellers ikke!
> (bare et godt råd!)
Hvor har du det fra? Det strider ret meget mod, hvad jeg har lært om
relationelle databaser. Bare lige for at checke, lavede jeg en lille
test. I en tabel med 1.000.000 poster og 10 søjler kørte jeg følgende
queries:
(1) SELECT * FROM projection_test;
(2) SELECT col1, col2, col3 FROM projection_test;
Hver query blev kørt 3 gange og MySQL rapporterede følgende tider til
mig:
For (1): 8.89, 10.13 og 7.75 sek.
For (2): 9.91, 11.18 og 11.89 sek.
--
Med venlig hilsen
- Jacob Atzen
| |
Martin (04-12-2005)
| Kommentar Fra : Martin |
Dato : 04-12-05 12:07 |
|
Jacob Atzen wrote:
> On 2005-12-04, Martin <news@natten-i.dk> wrote:
>> Desuden - så for guds skyld, lad vær med at bruge * i din select - det
>> sætter lige mysql tempoet en kæmpe del ned.
> [snip]
>
>> PS: det eneste sted du må bruge * i en select, er ved COUNT(*) da det
>> ikke betyder noget - men ellers ikke!
>> (bare et godt råd!)
>
> Hvor har du det fra? Det strider ret meget mod, hvad jeg har lært om
> relationelle databaser. Bare lige for at checke, lavede jeg en lille
> test. I en tabel med 1.000.000 poster og 10 søjler kørte jeg følgende
> queries:
>
> (1) SELECT * FROM projection_test;
> (2) SELECT col1, col2, col3 FROM projection_test;
>
> Hver query blev kørt 3 gange og MySQL rapporterede følgende tider til
> mig:
>
> For (1): 8.89, 10.13 og 7.75 sek.
> For (2): 9.91, 11.18 og 11.89 sek.
Må jeg spørge hvilken mysql version du leger med?
Jeg har nemlig fået noget lign. det modsatte resultat i MySQL 5.0.
Desuden så må jeg også tilstå at jeg lavede det med lidt blanding af
PHP, altså ikke direkte i console mode.
Så kan da også godt være at PHP gik ind og lavede det hele langsommere?
- hvem ved
System:
Windows XP
Apache 2
PHP 5
MySQL 5
1024 mb ram, hvor ca. 50% er optaget.
2,0 ghz cpu (kom op på 100% i et øjeblik eller 2 under begge tests)
>
--
Venlig hilsen
Martin
| |
Jacob Atzen (04-12-2005)
| Kommentar Fra : Jacob Atzen |
Dato : 04-12-05 12:18 |
|
On 2005-12-04, Martin <news@natten-i.dk> wrote:
> Jacob Atzen wrote:
>> On 2005-12-04, Martin <news@natten-i.dk> wrote:
>>> Desuden - så for guds skyld, lad vær med at bruge * i din select - det
>>> sætter lige mysql tempoet en kæmpe del ned.
>> [snip]
>>
>>> PS: det eneste sted du må bruge * i en select, er ved COUNT(*) da det
>>> ikke betyder noget - men ellers ikke!
>>> (bare et godt råd!)
>>
>> Hvor har du det fra? Det strider ret meget mod, hvad jeg har lært om
>> relationelle databaser. Bare lige for at checke, lavede jeg en lille
>> test. I en tabel med 1.000.000 poster og 10 søjler kørte jeg følgende
>> queries:
>>
>> (1) SELECT * FROM projection_test;
>> (2) SELECT col1, col2, col3 FROM projection_test;
>>
>> Hver query blev kørt 3 gange og MySQL rapporterede følgende tider til
>> mig:
>>
>> For (1): 8.89, 10.13 og 7.75 sek.
>> For (2): 9.91, 11.18 og 11.89 sek.
>
> Må jeg spørge hvilken mysql version du leger med?
4.1.15.
> Jeg har nemlig fået noget lign. det modsatte resultat i MySQL 5.0.
> Desuden så må jeg også tilstå at jeg lavede det med lidt blanding af
> PHP, altså ikke direkte i console mode.
>
> Så kan da også godt være at PHP gik ind og lavede det hele langsommere?
Svært at sige, uden at have set din kode.
--
Med venlig hilsen
- Jacob Atzen
| |
Michael Zedeler (04-12-2005)
| Kommentar Fra : Michael Zedeler |
Dato : 04-12-05 11:34 |
|
Martin wrote:
> 1:
> SELECT COUNT(*)
> FROM tbMedlemmer
> WHERE password = '$password'
Du glemmer at skrive at din metode forudsætter at man har et index på de
felter, der bruges i WHERE-delen. Hvis man ikke har det, betyder det at
din metode resulterer i et full table scan, hvilket er det værst
tænkelige. Til sammenligning performer
SELECT * FROM tbMedlemmer WHERE password='$password' LIMIT 1;
50% bedre i gennemsnit, hvis man ikke har et index på feltet.
> 3: metode
> $sql = mysql_query("
> SELECT *
> FROM tbMedlemmer
> WHERE password = '$password'
> ");
> $antal = mysql_num_rows($sql);
Den ovenstående er ikke nogen god idé, da den sender resultatet fra
serveren til php, hvorefter man i php undersøger hvor mange rækker, der
så var i resultatet. Det er meget nærliggende at man så en anden gang
bruger samme metode på en forespørgsel, der resulterer mange rækker,
hvilket giver et kæmpe overhead.
Men du skriver jo også at du ikke foretrækker den...
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Martin (04-12-2005)
| Kommentar Fra : Martin |
Dato : 04-12-05 12:13 |
|
Michael Zedeler wrote:
> Martin wrote:
> > 1:
>> SELECT COUNT(*)
>> FROM tbMedlemmer
>> WHERE password = '$password'
>
> Du glemmer at skrive at din metode forudsætter at man har et index på de
> felter, der bruges i WHERE-delen. Hvis man ikke har det, betyder det at
> din metode resulterer i et full table scan, hvilket er det værst
> tænkelige. Til sammenligning performer
Æhm - jeg har nu altså ikke index på nogen af de felter hvor jeg bruger
min WHERE, og det virker udenmærket?
Selvfølgelig er det langt hurtigere hvis der er full-text på søge
felter, men så store er mine databaser ikke (endnu?) at jeg har gidet at
lege med det.
>
> SELECT * FROM tbMedlemmer WHERE password='$password' LIMIT 1;
>
> 50% bedre i gennemsnit, hvis man ikke har et index på feltet.
>
>> 3: metode
>> $sql = mysql_query("
>> SELECT *
>> FROM tbMedlemmer
>> WHERE password = '$password'
>> ");
>> $antal = mysql_num_rows($sql);
>
> Den ovenstående er ikke nogen god idé, da den sender resultatet fra
> serveren til php, hvorefter man i php undersøger hvor mange rækker, der
> så var i resultatet. Det er meget nærliggende at man så en anden gang
> bruger samme metode på en forespørgsel, der resulterer mange rækker,
> hvilket giver et kæmpe overhead.
Det er stadig en mulighed at gøre det på den måde.
>
> Men du skriver jo også at du ikke foretrækker den...
Og det er også rigtigt, brugte den de første 2-3 måneder jeg lige havde
begyndt at lege med MySQL, men har ikke brugt den siden, så det ligger
nok nogen år tilbage efterhånden :)
Jeg bruger den dog i meget få tilfælde, fx:
Har fx en gæstebog, nyhedsside eller noget i den stil.
Hvor jeg så først laver en SELECT col1, col2 osv osv FROM tabel
Og for ikke at skrive en HELT tom side ud, så laver jeg denne:
if(mysql_num_rows($sql) == 0)
print "Ingen nyheder";
else
print "en masse nyheder";
Her kan den godt bruges, da jeg alligevel skal ind og hente de ting i
databasen uanset hvad.
(nedenstående ikke testet)
Tror det vil være hurtigere end først at tælle hvor mange rækker der
egentlig er i tabellen, og hvis der er mere end 1, så selecte tabellen.
>
> Mvh. Michael.
--
Venlig hilsen
Martin
| |
Michael Zedeler (04-12-2005)
| Kommentar Fra : Michael Zedeler |
Dato : 04-12-05 12:47 |
|
Martin wrote:
> Michael Zedeler wrote:
>
>> Martin wrote:
>> > 1:
>>
>>> SELECT COUNT(*)
>>> FROM tbMedlemmer
>>> WHERE password = '$password'
>>
>> Du glemmer at skrive at din metode forudsætter at man har et index på
>> de felter, der bruges i WHERE-delen. Hvis man ikke har det, betyder
>> det at din metode resulterer i et full table scan, hvilket er det
>> værst tænkelige. Til sammenligning performer
>
> Æhm - jeg har nu altså ikke index på nogen af de felter hvor jeg bruger
> min WHERE, og det virker udenmærket?
CREATE TABLE pw (
login VARCHAR(10),
passwd VARCHAR(20),
email VARCHAR(50)
);
LOAD DATA INFILE '/tmp/dmp' INTO TABLE pw;
Indlæser 1.000.000 rækker. Filen /tmp/dmp indeholder dette her:
1 1 1
2 2 2
3 3 3
....
1000000 1000000 1000000
SELECT * FROM pw WHERE login='500000';
Giver disse tider: 11,38 11,53 11.46
SELECT COUNT(*) FROM pw WHERE login='500000';
Giver disse tider: 12.28 11.39 11.38
SELECT * FROM pw WHERE login='500000' LIMIT 1;
Giver disse tider: 6.25 5.63 2.39
Hvis jeg sætter index på, falder tiden på samtlige forespørgsler ovenfor
til pænt under et sekund.
> Selvfølgelig er det langt hurtigere hvis der er full-text på søge
> felter, men så store er mine databaser ikke (endnu?) at jeg har gidet at
> lege med det.
Index og full-text-søgning er ikke det samme.
>>> 3: metode
>>> $sql = mysql_query("
>>> SELECT *
>>> FROM tbMedlemmer
>>> WHERE password = '$password'
>>> ");
>>> $antal = mysql_num_rows($sql);
>>
>> Den ovenstående er ikke nogen god idé, da den sender resultatet fra
>> serveren til php, hvorefter man i php undersøger hvor mange rækker,
>> der så var i resultatet. Det er meget nærliggende at man så en anden
>> gang bruger samme metode på en forespørgsel, der resulterer mange
>> rækker, hvilket giver et kæmpe overhead.
>
> Det er stadig en mulighed at gøre det på den måde.
Ja. Du kan også lave et tredobbelt join på tbMedlemmer, hver gang du
skal bruge data fra den. Selvfølgelig kan det lade sig gøre.
>> Men du skriver jo også at du ikke foretrækker den...
>
> Jeg bruger den dog i meget få tilfælde, fx:
>
> Har fx en gæstebog, nyhedsside eller noget i den stil.
>
> Hvor jeg så først laver en SELECT col1, col2 osv osv FROM tabel
>
> Og for ikke at skrive en HELT tom side ud, så laver jeg denne:
>
> if(mysql_num_rows($sql) == 0)
> print "Ingen nyheder";
> else
> print "en masse nyheder";
>
> Her kan den godt bruges, da jeg alligevel skal ind og hente de ting i
> databasen uanset hvad.
Det er også en anden opgave, du så løser. Jeg henviser kun til den
situation, hvor man har brug for at tælle noget i databasen.
> Tror det vil være hurtigere end først at tælle hvor mange rækker der
> egentlig er i tabellen, og hvis der er mere end 1, så selecte tabellen.
Nej. Det er også en helt anden situation, for du skal jo bruge data,
hvis de faktisk er der.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
michael@zedeler.dk (05-12-2005)
| Kommentar Fra : michael@zedeler.dk |
Dato : 05-12-05 15:37 |
|
> Hvis du lagrer det i en tabel hvor du specificerer at data skal
> være unikke, så tjekker MySQL det for dig når nogen prøver at
> skrive et kodeord der allerede er brugt, til databasen.
En god pointe til os, der kværulerer over performance og alle mulige
(og mindre mulige) metoder til at lløse et problem, som mysql faktisk
kan løse selv.
DUH!
Mvh. Michael.
| |
Jakob Munck (05-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 05-12-05 15:48 |
|
<michael@zedeler.dk> skrev i en meddelelse
news:1133793431.059662.211450@o13g2000cwo.googlegroups.com...
> Hvis du lagrer det i en tabel hvor du specificerer at data skal
> være unikke, så tjekker MySQL det for dig når nogen prøver at
> skrive et kodeord der allerede er brugt, til databasen.
Ja, men den fejlmelding som mySql kommer med hvis der eksisterer et password
af denne art, kan den bruger på en website i forhold til brugerne? Kalder
den en bestemt html-side og - hvis ja - hvor kan man indstille hvad den skal
hedde?
v.h.
Jakob
| |
Martin (05-12-2005)
| Kommentar Fra : Martin |
Dato : 05-12-05 16:04 |
|
Jakob Munck wrote:
> <michael@zedeler.dk> skrev i en meddelelse
> news:1133793431.059662.211450@o13g2000cwo.googlegroups.com...
>> Hvis du lagrer det i en tabel hvor du specificerer at data skal
>> være unikke, så tjekker MySQL det for dig når nogen prøver at
>> skrive et kodeord der allerede er brugt, til databasen.
>
>
> Ja, men den fejlmelding som mySql kommer med hvis der eksisterer et password
> af denne art, kan den bruger på en website i forhold til brugerne? Kalder
> den en bestemt html-side og - hvis ja - hvor kan man indstille hvad den skal
> hedde?
Det man kan gøre er følgende
$sql = "SELECT .....";
if(!mysql_query($sql))
print "der skete en fejl";
else
print "resultat";
>
> v.h.
> Jakob
>
>
--
Venlig hilsen
Martin
| |
Jakob Munck (05-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 05-12-05 18:41 |
|
">
> Det man kan gøre er følgende
>
> $sql = "SELECT .....";
>
> if(!mysql_query($sql))
> print "der skete en fejl";
> else
> print "resultat";
>
>>
Smart!
v.h.
Jakob
| |
Jakob Munck (05-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 05-12-05 18:49 |
|
> Det man kan gøre er følgende
>
> $sql = "SELECT .....";
>
> if(!mysql_query($sql))
> print "der skete en fejl";
> else
> print "resultat";
>
Og så lige det uundgåelige spørgsmål: Hvordan indstiller man et felt i en
tabel i mySql til kun at kunne indeholde unikke strenge ? (Jeg ser ikke
umiddelbart nogen valgmulighed i menuerne)
v.h.
Jakob
| |
Martin (05-12-2005)
| Kommentar Fra : Martin |
Dato : 05-12-05 19:58 |
|
Jakob Munck wrote:
>> Det man kan gøre er følgende
>>
>> $sql = "SELECT .....";
>>
>> if(!mysql_query($sql))
>> print "der skete en fejl";
>> else
>> print "resultat";
>>
>
> Og så lige det uundgåelige spørgsmål: Hvordan indstiller man et felt i en
> tabel i mySql til kun at kunne indeholde unikke strenge ? (Jeg ser ikke
> umiddelbart nogen valgmulighed i menuerne)
i phpmyadmin hedder det "unique" - et sted du skal sætte kryds i :)
>
> v.h.
> Jakob
>
>
--
Venlig hilsen
Martin
| |
N/A (05-12-2005)
| Kommentar Fra : N/A |
Dato : 05-12-05 15:48 |
|
| |
Peter Larsen (05-12-2005)
| Kommentar Fra : Peter Larsen |
Dato : 05-12-05 19:34 |
|
Jakob Munck wrote:
> I forbindelse med en portal jeg laver skal jeg tjekke om brugerens valgte
> password allerede er optaget, da det så ikke kan bruges.
Sorry, this password has already been taken by user "Jakob Munch". Please
pick another password.
.... smil nu for helvede.. det er da sjovt..
Hvorfor må de ikke have samme kodeord?
--
Regards, Peter Larsen
| |
Jakob Munck (06-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 06-12-05 07:44 |
|
>
> Sorry, this password has already been taken by user "Jakob Munch". Please
> pick another password.
>
> ... smil nu for helvede.. det er da sjovt..
>
> Hvorfor må de ikke have samme kodeord?
>
:), ok, jeg griner. Jeg kan se at jeg har dummet mig.
Gode julehilsner fra
Jakob
| |
|
|