[PHP] Geen melding verkeerde username loginsysteem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb zelf een loginsysteem op basis van sessies geschreven, ik ben een beginner wat waarschijnlijk ook te zien is. Dit is het document check.php om de logingegevens van de gebruiker te controleren. Alles werkt prima, als je geen pw of username invult verschijnt er een melding. In geval van een verkeerd password komt er een melding. Het enigste wat niet werkt is: als je een verkeerde gebruikersnaam invult. Dan krijg ik een witte pagina zonder text voor me, ipv van een foutmelding. Het gaat om deze regel:

PHP:
1
if (empty($row)) {die ('gebruikersnaam fout!!!!');}


Wat doe ik fout?


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?

session_start();
error_reporting(E_ALL);

include("connect.php");
        if ($_POST['username'] == '') {
            echo "Voer een gebruikersnaam in!";
                            }
        else {

                if ($_POST['password'] == '') {
                    echo "Voer een wachtwoord in!";
                                    }
                else {

                    $result = mysql_query ("SELECT * FROM gebruikers WHERE username = '".$_POST['username']."'") or die (mysql_error());
                    $row = mysql_fetch_array($result) or die(mysql_error());
                    if (empty($row)) {die ('gebruikersnaam fout!!!!');}
                    $password = $row['password'];
                    $functie = $row['functie'];
                        if ($_POST['password'] == $password) {
                    $_SESSION['username'] = $_POST['username'];
                    $_SESSION['password'] = $password;
                    $_SESSION['functie'] = $functie;
                    echo "Je bent nu ingelogd";
                    }
                        else {
                            echo "Wrong password";
                            }
            }
                }


?>

[ Voor 9% gewijzigd door NMe op 03-05-2005 20:54 ]


Acties:
  • 0 Henk 'm!

  • Rowanov
  • Registratie: Februari 2004
  • Niet online

Rowanov

Kop eens wat anders...

edit:
Hier stond iets doms. Misschien om dan toch iets nuttigs te zeggen, gebruik de code tags om je bericht leesbaarder te maken

[ Voor 159% gewijzigd door Rowanov op 03-05-2005 19:24 ]


Acties:
  • 0 Henk 'm!

  • Pogostokje
  • Registratie: September 2001
  • Laatst online: 19-09 16:50

Pogostokje

* twiet *

Afgezien van wat je eigenlijk vraagt wil ik je iets meegeven. Het is vanuit security oogpunt niet aan te raden de gebruiker te veel op te zadelen met wat er precies niet klopt aan zijn gegevens. Een username/password combinatie is een geheime combinatie. Als je gaat verklappen of een username wel of niet goed is dan heeft een kwaadwillende al 50% van de gegevens in huis.

Daarom zul je vaak dingen zien als "username and/or password are incorrect. try again."

... ook ik heb soms per ongeluk gelijk.


Acties:
  • 0 Henk 'm!

Verwijderd

je gebruikt nu empty() op een array. Dit moet in princiepe goed gaan maar zoals je ziet op de manual pagina van empty op php.net zijn er wat rand gevallen: http://nl2.php.net/manual/en/function.empty.php (1e comment).

count() kan misschien een beter alternatief zijn http://nl2.php.net/manual/en/function.count.php

trouwens, als je toch alleen de associatieve index gebruikt van de result array kun je net zo goed mysql_fetch_assoc gebruiken http://nl2.php.net/manual/en/function.mysql-fetch-assoc.php

[ Voor 24% gewijzigd door Verwijderd op 03-05-2005 19:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Eerst even wat netter inspringen en code tags gebruiken ;) :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?
session_start();
error_reporting(E_ALL);

include("connect.php");
if ($_POST['username'] == '') {
    echo "Voer een gebruikersnaam in!";
}
else {

    if ($_POST['password'] == '') {
        echo "Voer een wachtwoord in!";
    }
    else {

        $result = mysql_query ("SELECT * FROM gebruikers WHERE username = '".$_POST['username']."'") or die (mysql_error());
        $row = mysql_fetch_array($result) or die(mysql_error());
        if (empty($row)) {die ('gebruikersnaam fout!!!!');}
        $password = $row['password'];
        $functie = $row['functie']; 
        if ($_POST['password'] == $password) {
            $_SESSION['username'] = $_POST['username'];
            $_SESSION['password'] = $password;
            $_SESSION['functie'] = $functie;
            echo "Je bent nu ingelogd";
        } 
        else {
            echo "Wrong password";
        }
    }
}



En dan moet je geen count gebruiken maar zoiets:
mysql_fetch_array returnt false als er geen rijen (meer) zijn.
[edit]
Gebruik inderdaad nog beter mysql_fetch_assoc, is namelijk een stuk sneller. ;)
PHP:
1
2
3
4
5
6
7
if($row = mysql_fetch_assoc($result))
{

}
else
{
}

[ Voor 31% gewijzigd door Verwijderd op 03-05-2005 19:32 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 03 mei 2005 @ 19:28:
En dan moet je geen count gebruiken maar zoiets:
mysql_fetch_array returnt false als er geen rijen (meer) zijn.
[edit]
Gebruik inderdaad nog beter mysql_fetch_assoc, is namelijk een stuk sneller. ;)
ah dat mysql_fecth_* false returned wist ik niet (meer). Het is ook al tijden geleden dat ik gePHPed heb.
Ik vind persoonlijk trouwens ook dat mysql_fetch_assoc ook veel leuker klinkt; een beetje als "MySQL: Fetch a sock!". Maarja dat zal wel mijn lame programmeurs humor zijn :P

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 03 mei 2005 @ 19:28:
Gebruik inderdaad nog beter mysql_fetch_assoc, is namelijk een stuk sneller. ;)
Waar baseer je dat op? Heb je benchmarks? PHP.net heeft er zelf niks over te zeggen:
Performance: An important thing to note is that using mysql_fetch_array() is not significantly slower than using mysql_fetch_row(), while it provides a significant added value.
Performance: An important thing to note is that using mysql_fetch_assoc() is not significantly slower than using mysql_fetch_row(), while it provides a significant added value.
Beide functies hebben dezelfde note wat betreft performance, en ik betwijfel het dat het een gigantisch verschil maakt. :)

Ow, @Thug: gebruik de volgende keer even code tags, dat is net even wat duidelijker. :)

[ Voor 6% gewijzigd door NMe op 03-05-2005 20:53 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Nick The Heazk
  • Registratie: Maart 2004
  • Laatst online: 07-09-2024

Nick The Heazk

Zie jij er wat in?

Bovendien moet je oppassen met het gebruik van superglobale arrays in een query. Bij mijn scripts (op bepaalde hosting) werken sommige mysql-statements niet met een superglobale array (hangt enkel af van de hosting). Als ik een regel erboven de waarde van de superglobal toeken aan een variabele werkt ie wel perfect. Probeer daarom eens het volgende:

PHP:
1
2
$username = $_POST["username"];
$result = mysql_query ("SELECT * FROM gebruikers WHERE username = '$username' ") or die (mysql_error());

[ Voor 13% gewijzigd door Nick The Heazk op 03-05-2005 21:29 ]

Performance is a residue of good design.


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Eigenlijk moet je nooit direct variabelen, welke afkomstig zijn van buiten af direct in je query's opnemen. Valt onder het motto "vertrouw nooit user input", in de P&W FAQ is daar oa het een en ander over te vinden. SQL Injection en XSS (cross site scripting) zijn bijvoorbeeld van die onderwerpen.

Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
gebruik ipv dat empty deel gewoon:
$rows = mysql_num_rows($result);
if ($rows != 1){
die ('Geen of meerdere gebruikers gevonden');
}
Of iets in die richting :)

en verder:
Tenzij je magic_quotes gebruikt (waarschijnlijk niet want die gebruik niemand, omdat anders het script weer anders werkt op ieder systeem), raad ik je STERK aan om de $_POST['username'] uit je query te halen!

Je kunt doen bijvoorbeeld:
$username = addslashes($_POST['username']);

of

$_POST['username'] = addslashes($_POST['username']);

Die eerste geniet m'n voorkeur, omdat je dan nooit per ongeluk het addslashes deel kan vergeten en toch een werkend script kunt krijgen. Zonder addslashes is het mogelijk om de query te manipuleren.

Je zou bijvoorbeeld $username een ' kunnen meegeven, en vervolgens andere argumenten op te geven in de query. Ik ben zelf niet zo goed dat ik nu precies weet wat je hier zou kunnen misdoen, maar ongetwijfeld dat je meerdere database commando's achter elkaar kunt laten uitvoeren (?) en bijvoorbeeld een stuk uit de database kunt wijzigen of verwijderen.

Buiten dat, als iemand als username opgeeft " 'piet' " - dan klopt er meteen niets meer van je query, en krijgt iemand een foutmelding van de query te zien ipv dat de username niet bestaat. Dus: Altijd escapen.

edit:
Sybr_E-N, doe ik zo m'n best voor zo'n lange uitgebreide reply, helemaal voor niets :'(

[ Voor 8% gewijzigd door pierre-oord op 04-05-2005 00:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op dinsdag 03 mei 2005 @ 20:51:
[...]

Waar baseer je dat op? Heb je benchmarks? PHP.net heeft er zelf niks over te zeggen:
[...]

Beide functies hebben dezelfde note wat betreft performance, en ik betwijfel het dat het een gigantisch verschil maakt. :)
Nee, ik heb geen benchmarks. Maar ik trok de conclusie omdat fetch_array een numerieke en een assoc array maakt, en dus dubbel geheugen gebruikt. Dus zal het waarschijnlijk wel iets sneller zijn, ik zeg dus niet dat het verschil significant is.

Acties:
  • 0 Henk 'm!

  • aal
  • Registratie: September 2002
  • Laatst online: 16-09 11:39

aal

Je kan natuurlijk ook

PHP:
1
$result = mysql_fetch_array($results, MYSQL_ASSOC);


doen :)

En ik denk dat je idd het best kan controleren met mysql_num_rows() of er een resultaat is.

En zoals al gezegd is, geef ze niet teveel informatie!

[ Voor 43% gewijzigd door aal op 04-05-2005 10:24 ]


Acties:
  • 0 Henk 'm!

  • TXC
  • Registratie: Oktober 2002
  • Laatst online: 16-09 12:13

TXC

aal schreef op woensdag 04 mei 2005 @ 10:22:
Je kan natuurlijk ook

PHP:
1
$result = mysql_fetch_array($results, MYSQL_ASSOC);


doen :)

En ik denk dat je idd het best kan controleren met mysql_num_rows() of er een resultaat is.

En zoals al gezegd is, geef ze niet teveel informatie!
Om sql injection hierbij tegen te gaan kijk ik zelf niet alleen of er een resultaat is, maar ook of username klopt met dbs.username en password klopt met dbs.password.

Want stel je hebt een query waarbij de username een sql statement is die in je query wordt geinject bv AND '1' = '1' (simplefied). Dat is altijd true en dan wordt er altijd een record gevonden.

[ Voor 3% gewijzigd door TXC op 04-05-2005 10:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jullie hebben inderdaad gelijk dat ik de beveiliging moet aanpassen, hier ben ik dan ook al eerder voor op de hoogte gesteld. Ik wacht er alleen even mee, om het script zo klein en simpel mogelijk te houden, dat ik me eerst op de werking van het script kan richten, aangezien ik nog al onervaren in php ben.

Verder bedankt voor alle reacties, vanavond als ik thuis ben ga ik meteen alle mogelijkheden proberen. Ik laat wel even weten hoe het afgelopen is.

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 11:30

Guldan

Thee-Nerd

is dit niet veel korter en efficienter en simpeler?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
session_start();
error_reporting(E_ALL);

include("connect.php"); 

if(isset($_POST['password']) && isset($_POST['username']))
{
//isset kijkt of die variablen bestaan en dat gebruiken we nu om te kijken of de username en password variablen geset zijn

    $result = mysql_query ("SELECT * FROM gebruikers WHERE username = '".$_POST['username']." and password= '".$_POST['password']."'") or die (mysql_error());
    //query om een bestaande gebruiker te selecteren die gelijk is aan het ingevoerde username and password
    $aantal =mysql_num_rows($result);
    //kijk hoeveel rows(records) teruggegeven worden
    if($aantal ==1)
    {
    //als dit 1 is (dan er is dus een gebruiker gevonden) dan mag hij inloggen.
    //do login stuff
    $_SESSION['username'] = $_POST['username'];
        $_SESSION['password'] = $_POST['password'];
        $_SESSION['functie'] = $functie; 
        echo "Je bent ingelogd";
    }else{
    //als dit 0 is of iets anders is dan klopt er iets niet.
    echo "Je username en/of password klopt niet";
    }

}


ook zou ik even kijken naar Md5 codering van je passwords. Dit is heel simpel te gebruiken (www.php.net/md5) en is toch veiliger voor je passwords.
Hiervoor moet je dus wel de passwords in MD5 formaat in je database opslaan, want je kunt hiermee alleen vergelijken of iets gelijk is. Je kunt het niet meer terug ontcijferen vanuit de waarde in de database.

Ps deze post is meer bedoelt als eyeopener van hoe het ook kan. Mijn login systemen werken ongeveer ook altijd op deze manier. Ik zat hiermee zelf ook te klooien als beginner totdat ik dit van dit systeem hoorde.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 20:04

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Guldan: idd veel korter, maar Thug wil graag een melding krijgen wanneer de username fout is, of wanneer het wachtwoord fout is, of wanneer de username niet klopt, etc ;). Misschien geef je dan teveel info aan een mogelijke hacker, maar goed :)
offtopic:
* We Are Borg zwaait naar Thug :w

[ Voor 13% gewijzigd door We Are Borg op 04-05-2005 15:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor alle reacties, maar het probleem zat toch ergens anders. "Or die" bij het selecteren van gegevens uit de database is leuk, maar niet als je een melding wilt weergeven als het resultaat 0 is. Door "or die" weg te halen, kon ik mijn script afmaken. Het moet nu alleen nog even beveiligd worden maar dat is geen probleem.


PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?

session_start();
error_reporting(E_ALL);

include("connect.php");


if ($_POST['username'] == '')

{
echo "Voer een gebruikersnaam in!";
}


else
{


if ($_POST['password'] == '')

{
echo "Voer een wachtwoord in!";
}


else {

$result = mysql_query ("SELECT * FROM gebruikers WHERE username = '".$_POST['username']."'");
$row = mysql_fetch_array($result);
$rows = mysql_num_rows($result);


if ($rows == 0)
{
echo 'Gebruiker niet gevonden';
}


else {

$password = $row['password'];
$functie = $row['functie'];


if ($_POST['password'] == $password) {
$_SESSION['username'] = $_POST['username'];
$_SESSION['password'] = $password;
$_SESSION['functie'] = $functie;
echo "Je bent nu ingelogd";
}


else {
echo "Wrong password";
}
}
}
}

?>

[ Voor 30% gewijzigd door Verwijderd op 06-05-2005 13:44 ]


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Verwijderd schreef op vrijdag 06 mei 2005 @ 13:24:

Laatste vraag, kon geen antwoord in de faq vinden. Hoe kan je die code in zo'n mooi venster krijgen???
Moet je de GoT FAQ even wat beter doornemen :) Want het staat er wel degelijk in, namelijk hier. Je had er ook achter kunnen komen door op het knopje "View" te klikken. Ook was dit antwoord al gepost in de alleereerste reactie van dit topic :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Mag ik je nog een laatste tip meegeven, Thug? Wen jezelf aan om code in te springen wanneer je een code block opent (met een { dus). Op die manier zie je stukken makkelijker wat bij elkaar hoort. In je eerste post lijk je dat wel te doen, maar ook daar klopt het niet helemaal, waardoor je code lastig wordt om te doorgronden. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
-NMe- schreef op dinsdag 03 mei 2005 @ 20:51:
[...]

Waar baseer je dat op? Heb je benchmarks? PHP.net heeft er zelf niks over te zeggen:

[...]


[...]

Beide functies hebben dezelfde note wat betreft performance, en ik betwijfel het dat het een gigantisch verschil maakt. :)

Ow, @Thug: gebruik de volgende keer even code tags, dat is net even wat duidelijker. :)
Het staat er toch... Die ene functie geeft dubbel zoveel waarden terug in die array (namelijk een numerieke EN een string index, waarvan de numerieke nooit nodig hebt..).


PHP:
4
5
6
7
8
9
10
11
12
13
14
15
<?php
        // query met username = '" . addslashes($_POST['username']) . "' AND userpassword = '" . md5($_POST['password']) . "'
        if(mysql_num_rows($rResultOfThatQuery) == 0)
        {
             // foute username/password combinatie
        }
        else
        {
              // login
              // en zet alleen het ID in die sessie, de rest heb je niet nodig..
        }
?>

[ Voor 11% gewijzigd door Tanuki op 06-05-2005 19:15 ]

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Sorry CelestialCelebi, maar ik ben niet helemaal overtuigd. :) Ik heb een benchmarkje geschreven:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
ob_start();

$DB = mysql_connect('localhost', 'root', '');
mysql_select_db('gottest', $DB);

$res['array'] = array();
$res['assoc'] = array();

foreach ($res as $key => $value) {
    for ($j = 0; $j < 10; $j++) {
        $res[$key][] = test($key);
    }
}

print_r($res);

ob_end_flush();


function test($func) {
    $start = microtime_float();
    
    $f = create_function('$q', 'return mysql_fetch_'.$func.'($q);');

    $query = mysql_query('SELECT id, naam, tekst FROM test ORDER BY id');
    
    $s = '<table><tr><th>ID</th><th>Naam</th><th>Tekst</th></tr>';
    
    while ($row = $f($query)) {
        $s .= '<tr><td>'.$row['id'].'</td><td>'.$row['naam'].'</td><td>'.$row['tekst'].'</td></tr>';
    }
    
    $s .= '</table>';
    
    $end = microtime_float();
    
    return $end - $start;
}

function microtime_float() {
        list($usec, $sec) = explode(' ', microtime());
        return ((float)$usec + (float)$sec);
}

Let niet op de ranzige codeconstructies, dit was ff een haastwerkje van een paar minuutjes. Er zitten overigens 10.000 records in de betreffende tabel.

De uitvoer die ik bij dit script krijg, is de volgende:
Array
(
    [array] => Array
        (
            [0] => 1.5118951797485
            [1] => 1.1527428627014
            [2] => 1.1107969284058
            [3] => 1.2142598628998
            [4] => 1.6224231719971
            [5] => 1.6630578041077
            [6] => 1.2007818222046
            [7] => 1.1764600276947
            [8] => 1.207093000412
            [9] => 1.1971750259399
        )

    [assoc] => Array
        (
            [0] => 1.2465209960938
            [1] => 1.186891078949
            [2] => 1.4703590869904
            [3] => 1.1507980823517
            [4] => 1.2701029777527
            [5] => 1.2059710025787
            [6] => 1.326583147049
            [7] => 1.2308568954468
            [8] => 2.0983989238739
            [9] => 1.8694589138031
        )

)

Zoals je ziet liggen de tijden niet eens zo gek ver uit elkaar, en voor zover ik uit deze benchmark af kan leiden is mysql_fetch_assoc() zelfs vaak nog een stuk trager dan mysql_fetch_array(). :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Op aanraden van chem en ACM heb ik eens de query eerst uitgevoerd en daarna pas de timer gestart. Nu lijken de tijden idd wat dichter op elkaar te liggen, maar nog steeds zijn de verschillen praktisch nihil. :)

Array
(
    [array] => Array
        (
            [0] => 1.0922410488129
            [1] => 1.1262230873108
            [2] => 1.0253918170929
            [3] => 1.0802640914917
            [4] => 0.97806692123413
            [5] => 1.1003460884094
            [6] => 0.98662710189819
            [7] => 1.0406711101532
            [8] => 0.90778589248657
            [9] => 0.97560405731201
        )

    [assoc] => Array
        (
            [0] => 0.98479700088501
            [1] => 0.95257210731506
            [2] => 1.0328431129456
            [3] => 0.92795300483704
            [4] => 0.99898886680603
            [5] => 0.98433804512024
            [6] => 0.97168302536011
            [7] => 0.96629595756531
            [8] => 0.97475004196167
            [9] => 1.0021262168884
        )

)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Bij die laatste (assoc).. Je ziet toch wel dat daar de tijd vaker onder de 1.0 zit, maar oke, er is inderdaad maar een heel klein verschil tussen, dat moet ik inderdaad toegeven.

Wel is 't (als je logisch nadenkt) sneller om assoc te gebruiken, omdat je dan gewoon een compleet deel van je array wat je NOOIT nodig zult hebben niet terug krijgt (en dat wordt dus ook niet aangemaakt en dat scheelt tijd).

Qua tijd maakt het idd niet veel uit, maar ik hou er toch van om het "snelste" te gebruiken.. Dat geeft me een beter gevoel qua scripten..

'k zal morgen ook 's een benchmark draaien, nu geen zin in..

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

CelestialCelebi schreef op vrijdag 06 mei 2005 @ 21:54:
Wel is 't (als je logisch nadenkt) sneller om assoc te gebruiken, omdat je dan gewoon een compleet deel van je array wat je NOOIT nodig zult hebben niet terug krijgt (en dat wordt dus ook niet aangemaakt en dat scheelt tijd).
Om hier even op in te gaan: als PHP een beetje goed gestructureerd geschreven is, dan zouden, wanneer je mysql_fetch_array gebruikt in bovenstaande code, $row['id'] en $row[0] gewoon beiden pointers zijn naar hetzelfde adres, waardoor je niet dubbele waarden in je array hebt staan of iets dergelijks.

Verder maakt het blijkbaar gewoon echt heel erg weinig uit. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Toch nog maar net wat in elkaar geflanst.... Mijn tabellen zijn alleen wel wat leger, wel 10000 records ook:

Starting iteration of functions...
--------------------------------------------------------------------------------
Starting iteration for function mysql_fetch_assoc:
..........
Starting iteration for function mysql_fetch_array:
..........
Starting iteration for function mysql_fetch_object:
..........

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Array
(
    [mysql_fetch_assoc] => Array
        (
            [0] => 0.033805847168
            [1] => 0.0327799320221
            [2] => 0.0339889526367
            [3] => 0.0337328910828
            [4] => 0.0333669185638
            [5] => 0.0334720611572
            [6] => 0.0346670150757
            [7] => 0.0331819057465
            [8] => 0.0330328941345
            [9] => 0.0335259437561
        )

    [mysql_fetch_array] => Array
        (
            [0] => 0.0511689186096
            [1] => 0.0373480319977
            [2] => 0.0368041992188
            [3] => 0.0353879928589
            [4] => 0.0362060070038
            [5] => 0.0365419387817
            [6] => 0.036297082901
            [7] => 0.0436060428619
            [8] => 0.0377669334412
            [9] => 0.0365600585938
        )

    [mysql_fetch_object] => Array
        (
            [0] => 0.0492861270905
            [1] => 0.0502178668976
            [2] => 0.0513310432434
            [3] => 0.0494410991669
            [4] => 0.0495347976685
            [5] => 0.0485081672668
            [6] => 0.0491261482239
            [7] => 0.0762240886688
            [8] => 0.0506300926208
            [9] => 0.0544800758362
        )

)


PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
/*
DROP TABLE test;

CREATE TABLE test
(
    id int unsigned not null auto_increment primary key,
    name varchar(255) not null default 'dit veld is niet ingevuld',
    dateofbirth datetime not null default '0000-00-00 00:00:00',
    someothercrap longblob not null
) TYPE = MyISAM;
*/
function microtime_float()
{
    // just ripped from PHP.net...
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$aFunctions = array
(
    'mysql_fetch_assoc',
    'mysql_fetch_array',
    'mysql_fetch_object',
);
$iNumFunctions = count($aFunctions);
$iIterations = 10;

if(!$rDatabaseConnection = mysql_connect('localhost', 'root', 'BLA'))
{
    echo 'Could not connect to MySQL: ' . htmlspecialchars(mysql_error());
}
elseif(!mysql_select_db('test', $rDatabaseConnection))
{
    echo 'Could not select database: ' . htmlspecialchars(mysql_error());
}
else
{
    /*
    for($i = 0; $i < 10000; $i++)
    {
        if(!mysql_query("INSERT INTO test (id, name, dateofbirth, someothercrap) VALUES ('', 'HALLO DAAR', NOW(), 'Dit is gewoon een test......................')", $rDatabaseConnection))
        {
            echo 'Failed INSERT.'; break;
        }
    }
    die;
    */
    $sQuery = "SELECT * FROM test";
    if(!$rQuery = mysql_query($sQuery, $rDatabaseConnection))
    {
        echo 'Test-query failed: ' . htmlspecialchars(mysql_error());
    }
    else
    {
        if(mysql_num_rows($rQuery) == 0)
        {
            echo 'No rows to check on...';
        }
        else
        {
            $aTimes = array();
            echo 'Starting iteration of functions...<hr />';
            for($i = 0; $i < $iNumFunctions; $i++)
            {
                echo 'Starting iteration for function ' . $aFunctions[$i] . ':<br />';
                flush();
                for($i2 = 0; $i2 < $iIterations; $i2++)
                {
                    $iStartTime = microtime_float();
                    while($aQuery = $aFunctions[$i]($rQuery))
                    {
                        // do something here
                    }
                    $aTimes[$aFunctions[$i]][] = (microtime_float() - $iStartTime);
                    echo '.';
                    flush();
                    mysql_data_seek($rQuery, 0);
                }
                echo '<br />';
                flush();
            }
            echo '<pre>'; print_r($aTimes); echo '</pre>';
        }
    }
}
?>



In mijn resultaten is wel te merken dat assoc() sneller is dan array() (en veel sneller dan object() _/-\o_ (wie gebruikt dat dan ook |:( )).

Ik denk, maar ik weet het niet zeker, dat naar mate het aantal records en de grootte in bytes per record hoger wordt, het verschil in tijd tussen de twee functies steeds kleiner wordt.. Toch weer wat geleerd over de snelheid van deze twee.. En op het laatst voor de gein object() mee gedraaid, weet ik ook weer waarom ik me vanaf het begin heb aangeleerd die niet te gebruiken :*)

[ Voor 200% gewijzigd door Tanuki op 06-05-2005 22:42 ]

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

-NMe- schreef op vrijdag 06 mei 2005 @ 22:35:
[...]

Om hier even op in te gaan: als PHP een beetje goed gestructureerd geschreven is, dan zouden, wanneer je mysql_fetch_array gebruikt in bovenstaande code, $row['id'] en $row[0] gewoon beiden pointers zijn naar hetzelfde adres, waardoor je niet dubbele waarden in je array hebt staan of iets dergelijks.
als dat het geval is heb je natuurlijk wel een dubbele hoeveelheid aan pointers :P
ik geef toe het is mierengeneuk in de mircoseconden, maar toch :+
Verder maakt het blijkbaar gewoon echt heel erg weinig uit. :)
yup, hoewel het voor het overzicht in je applicatie vaak de 'strings' duidelijker is, waardoor je dus tijd kan besparen op het onderhoud van de code, en dat is veel meer waard dan die paar msec :)

Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Erkens schreef op vrijdag 06 mei 2005 @ 22:41:
[...]

als dat het geval is heb je natuurlijk wel een dubbele hoeveelheid aan pointers :P
ik geef toe het is mierengeneuk in de mircoseconden, maar toch :+


[...]

yup, hoewel het voor het overzicht in je applicatie vaak de 'strings' duidelijker is, waardoor je dus tijd kan besparen op het onderhoud van de code, en dat is veel meer waard dan die paar msec :)
Nou, het is eigenlijk omdat je die integer indexes nooit nodig hebt... Wat nou als eens een keer de volgorde van je velden verandert? Dan kun je al je scripts gaan editten omdat je die integers hebt gebruikt en nu opeens je username gelijk is aan je geboortedatum..

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

CelestialCelebi schreef op vrijdag 06 mei 2005 @ 22:44:
[...]

Nou, het is eigenlijk omdat je die integer indexes nooit nodig hebt... Wat nou als eens een keer de volgorde van je velden verandert? Dan kun je al je scripts gaan editten omdat je die integers hebt gebruikt en nu opeens je username gelijk is aan je geboortedatum..
als je de volgorde veranderd dan heb je als het goed is je code al aangepast ;)
tenzij je dom bezig bent een select * doet ofzo, maar dan vraag je ook gewoon om dergelijke problemen :)

Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
Een "or die" stopt het script helemaal niet als er geen records zijn, een "or die" stopt het script als er fouten optreden, welke je dan weer met mysql_error() kan opvragen.

Die fouten zijn bv : sql server offline, query fout, etc.
Pagina: 1