Waarom niet? Hoe denk je dat de verhouding opvragen/aanpassen is?quote:Op donderdag 1 januari 2009 22:16 schreef Database het volgende:
Ik zou zeer zeker neit gaan opslaan welke letters een product bevatten tenzij de producten stabiel zijn en er maar weinig nieuwe producten bijkomen/weggaan/veranderen van naam.
Hoe denk je dat dat werkt als er, zeg, 10.000 producten zijn?quote:Wat je kan doen is je producten opslaan in een dictioary (2d array) van letters naar arrays van producten. Dus $producten["a"][0] geeeft het eerst product dat met een a begint.
Zo kan je met een count($producten["x"]); zien hoeveel producten er zijn die met letter x beginnen.
Omdat dit een bron is van bugs. Je krijgt hier code van wat slecht onderhoudbaar is omdat je moet weten/onthouden dat wanneer je een de naam van een product wijzigt, een nieuw product toevoegt of een product verwijderd, dat je dan ook je extra tabel moet updaten. Normaal gesproken is het gewoon bad practice. Plus dat het queryen van een database veel meer overhead geeft dan code uitvoeren.quote:Op donderdag 1 januari 2009 22:20 schreef GlowMouse het volgende:
[..]
Waarom niet? Hoe denk je dat de verhouding opvragen/aanpassen is?
Ik snap niet wat je bedoelt? Het opbouwen van je dictioary kost lineair meer werk met het aantal producten dat je hebt.quote:Hoe denk je dat dat werkt als er, zeg, 10.000 producten zijn?
True. Dit pattern zie je wel vaker bij grote datacollecties.quote:Op donderdag 1 januari 2009 23:11 schreef Database het volgende:
[..]
Omdat dit een bron is van bugs. Je krijgt hier code van wat slecht onderhoudbaar is omdat je moet weten/onthouden dat wanneer je een de naam van een product wijzigt, een nieuw product toevoegt of een product verwijderd, dat je dan ook je extra tabel moet updaten. Normaal gesproken is het gewoon bad practice. Plus dat het queryen van een database veel meer overhead geeft dan code uitvoeren.
[..]
Ik snap niet wat je bedoelt? Het opbouwen van je dictioary kost lineair meer werk met het aantal producten dat je hebt.
Een specifiek item opzoeken gaat sneller als je de productnaam weet (omdat het aantal items wat je dan moet doorzoeken ongeveer 1/26ste is vergeleken bij een lange een dimensionale array). En aangezien je maar 1 keer opbouwt en waarschijnlijk meerdere keer opzoekt, zie ik - met alle respect - het probleem van 10.000 producten niet.
Het probleem is dat je dat lineair meer tijdrovende klusje op jouw manier bij elke request moet doen. Ten eerste moet de gebruiker langer wachten, ten tweede krijgt je server een probleem als je wat meer bezoekers krijgt.quote:Ik snap niet wat je bedoelt? Het opbouwen van je dictioary kost lineair meer werk met het aantal producten dat je hebt.
Een specifiek item opzoeken gaat sneller als je de productnaam weet (omdat het aantal items wat je dan moet doorzoeken ongeveer 1/26ste is vergeleken bij een lange een dimensionale array). En aangezien je maar 1 keer opbouwt en waarschijnlijk meerdere keer opzoekt, zie ik - met alle respect - het probleem van 10.000 producten niet.
In het kader van normalisatie is het idd niet handig om informatie dubbel op te slaan. Aan de andere kant is het ook weer niet zo dat je moet onthouden wat er allemaal moet gebeuren bij het aanpassen/toevoegen/verwijderen van een product. Daar kun je immers een leuke API voor schrijven. (En als je dat goed doet, kun je naderhand de hele opbouw aanpassen zonder elders in de code te moeten rommelen.)quote:Op donderdag 1 januari 2009 23:11 schreef Database het volgende:
[..]
Omdat dit een bron is van bugs. Je krijgt hier code van wat slecht onderhoudbaar is omdat je moet weten/onthouden dat wanneer je een de naam van een product wijzigt, een nieuw product toevoegt of een product verwijderd, dat je dan ook je extra tabel moet updaten. Normaal gesproken is het gewoon bad practice. Plus dat het queryen van een database veel meer overhead geeft dan code uitvoeren.
Ik denk dat het aantal zoekacties laag is. Het blijft wel PHP, dus aan het eind van het script is al je harde werk verloren gegaan. De kans dat je meer dan 1 keer gaat zoeken lijkt me dan niet zo groot. En als je een lijst wilt hebben van alle beginletters en van alle producten die met de letter C beginnen, dan is het wat overkill om alle producten uit de database te trekken.quote:[..]
Ik snap niet wat je bedoelt? Het opbouwen van je dictioary kost lineair meer werk met het aantal producten dat je hebt.
Een specifiek item opzoeken gaat sneller als je de productnaam weet (omdat het aantal items wat je dan moet doorzoeken ongeveer 1/26ste is vergeleken bij een lange een dimensionale array). En aangezien je maar 1 keer opbouwt en waarschijnlijk meerdere keer opzoekt, zie ik - met alle respect - het probleem van 10.000 producten niet.
Gebruiken die ook PHP/MySQL?quote:Op donderdag 1 januari 2009 23:26 schreef Scorpie het volgende:
[..]
True. Dit pattern zie je wel vaker bij grote datacollecties.
Dat lijkt mij inderdaad een goede oplossing:quote:Op donderdag 1 januari 2009 21:12 schreef Light het volgende:
[..]
Dat idd. En MySQL heeft ook een functie die het leven wat makkelijker kan maken.
1 |
Er zijn genoeg grote websites met flinke datasets die PHP en/of MySQL gebruiken, waaronder Facebook, Wikipedia, Yahoo!, Digg, Flickr, Google en YouTube.quote:
Want de elementen zijn nog niet uniek vóór array_unique()?quote:Op vrijdag 2 januari 2009 13:27 schreef Likkende_Lassie het volgende:
Die array met het resultaat van DISTINCT(SUBSTRING(name, 1, 1)), daar heb ik de functie array_unique(); over laten gaan.
Nee, zijn er alsnog mensen die lang op hun request wachten.quote:Ik kan ook eventueel deze array voor een aantal minuten laten cachen via memcached.
Als er geen array in memcached voor komt, dan kan ik hem laten genereren.... goed idee?
Caches moet je niet te moeilijk over doen, serialized array in de categorieëntabel in een extra kolom is het makkelijkste.quote:Op vrijdag 2 januari 2009 13:15 schreef Likkende_Lassie het volgende:
Cachen dus. Hoe zien jullie hier de tabel opbouw voor ?
Ik zelf dacht aan:
cat_ID, letter_ID.
Toch wel, dacht het niet uniek terug te krijgen..quote:Op vrijdag 2 januari 2009 13:30 schreef GlowMouse het volgende:
[..]
Want de elementen zijn nog niet uniek vóór array_unique()?
[..]
Nee, zijn er alsnog mensen die lang op hun request wachten.
[..]
Caches moet je niet te moeilijk over doen, serialized array in de categorieëntabel in een extra kolom is het makkelijkste.
Dat is opmerkelijk, waar denk je dat DISTINCT voor dient?quote:Op vrijdag 2 januari 2009 17:12 schreef Likkende_Lassie het volgende:
[..]
Toch wel, dacht het niet uniek terug te krijgen..
Dat weet ikquote:Op vrijdag 2 januari 2009 13:07 schreef Tijn het volgende:
[..]
Er zijn genoeg grote websites met flinke datasets die PHP en/of MySQL gebruiken, waaronder Facebook, Wikipedia, Yahoo!, Digg, Flickr, Google en YouTube.
Ja die doet hetzelfde, maar toen ik de code teste, en een print_r() deed, stonden er dubbele waardes in.quote:Op vrijdag 2 januari 2009 17:19 schreef GlowMouse het volgende:
[..]
Dat is opmerkelijk, waar denk je dat DISTINCT voor dient?
Voor hele grote datasets is dat misschien makkelijker, maar dan moet je echt huge datasets hebben. En 500k records vind ik daar niet onder vallen.quote:Op donderdag 1 januari 2009 23:44 schreef GlowMouse het volgende:
[..]
Het probleem is dat je dat lineair meer tijdrovende klusje op jouw manier bij elke request moet doen. Ten eerste moet de gebruiker langer wachten, ten tweede krijgt je server een probleem als je wat meer bezoekers krijgt.
Bij een request wil je gewoon snel de producten hebben die alleen met een bepaalde beginletter beginnen, eventueel ook alleen die op een bepaalde pagina voorkomen als je paginering gebruikt. Die andere producten wil je niet eerst in een arraytje stoppen, je wilt gewoon snel weten of ze bestaan. En als bij het groeien van je dataset de rekentijd lineair toeneemt, wil je gewoon dingen cachen als je op den duur ook daadwerkelijk veel producten krijgt, bijna onafhankelijk tegen welke prijs.
Ik zal je helpen: op een vrij vlotte server die een tabel met 1 miljoen records geheel in zijn geheugen heeft staan duurt de SELECT DISTINCT-methode 2.7 seconden en de PHP-methode zonder twijfel langer (je hebt het dan aan megabytes aan data die je databaseserver bij elke request uit moet spugen).quote:Op vrijdag 2 januari 2009 23:37 schreef Database het volgende:
[..]
Voor hele grote datasets is dat misschien makkelijker, maar dan moet je echt huge datasets hebben. En 500k records vind ik daar niet onder vallen.
Ik denk (maar weet niet zeker) dat het queryen van een database om een simpele tabel op te halen langzamer is (gemeten uit php, niet rechtstreeks op je (my)sql) dan het bouwen van zon array. Maar nogmaals ik heb al tijden geen php gedaan. In .net weet ik zeker dat het sneller is gezien het daar (bijna) native draait.
Ik zal zo wel even een testje draaien om te timen.
Je hebt idd gelijk, het ophalen van 10000 records is de helft korter vergeleken met het doen van 10.000 assignments.quote:Op vrijdag 2 januari 2009 23:44 schreef GlowMouse het volgende:
[..]
Ik zal je helpen: op een vrij vlotte server die een tabel met 1 miljoen records geheel in zijn geheugen heeft staan duurt de SELECT DISTINCT-methode 2.7 seconden en de PHP-methode zonder twijfel langer (je hebt het dan aan megabytes aan data die je databaseserver bij elke request uit moet spugen).
Creëren van die array kost dus ook 2.7 seconden (want de tijd die je daarna in PHP nodig hebt is verwaarloosbaar) en hoeft eenmalig. Daarna kun je hem direct gebruiken bij elke request; zelfs als je hem met een aparte query op moet halen zal dat minder dan 1/100ste van een seconde kosten, als hij in het geheugen staat zelfs minder dan 1/1000ste.
Welke 10.000 records haal je op, en welke assignments doe je? Arraytje steeds groter maken kost gewoon tijd, ook in .NET als je de grootte elke keer aan moet passen.quote:Op zaterdag 3 januari 2009 00:22 schreef Database het volgende:
[..]
Je hebt idd gelijk, het ophalen van 10000 records is de helft korter vergeleken met het doen van 10.000 assignments.
Query was:quote:Op zaterdag 3 januari 2009 00:28 schreef GlowMouse het volgende:
[..]
Welke 10.000 records haal je op, en welke assignments doe je? Arraytje steeds groter maken kost gewoon tijd, ook in .NET als je de grootte elke keer aan moet passen.
1 2 | a[j] = (byte)(j % 255); |
Memcached anyone?quote:Op vrijdag 2 januari 2009 00:12 schreef Light het volgende:
Het blijft wel PHP, dus aan het eind van het script is al je harde werk verloren gegaan.
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 46 47 | if (!empty($_POST)){ switch ($_POST["soort"]){ case "optellen": $getal3 = $_post["getal1"]+ $_post["getal2"]; echo $_post["getal1"]."+".$_post["getal2"]." = ".$getal3; echo("<br> <a href =\"".$_SERVER["PHP_SELF"] . "\">Nieuwe berekening uitvoeren.</a>"); break; case "aftrekken": $getal3 = $_post["getal1"]- $_post["getal2"]; echo $_post["getal1"]."+".$_post["getal2"]." = ".$getal3; echo("<br> <a href =\"".$_SERVER["PHP_SELF"] . "\">Nieuwe berekening uitvoeren.</a>"); break; case "delen": $getal3 = $_post["getal1"]+ $_post["getal2"]; echo $_post["getal1"]."+".$_post["getal2"]." = ".$getal3; echo("<br> <a href =\"".$_SERVER["PHP_SELF"] . "\">Nieuwe berekening uitvoeren.</a>"); break; case "vermenigvuldigen": $getal3 = $_post["getal1"]+ $_post["getal2"]; echo $_post["getal1"]."+".$_post["getal2"]." = ".$getal3; echo("<br> <a href =\"".$_SERVER["PHP_SELF"] . "\">Nieuwe berekening uitvoeren.</a>"); break; default: echo("Je hebt niks ingevuld!"); echo("<br> <a href =\"".$_SERVER["PHP_SELF"] . "\">Nieuwe berekening uitvoeren.</a>"); break; } }else{ ?> <html> <head> <title>Rekenmachientje 2e poging</title> </head> <body> <FORM ACTION="<?php echo($_SERVER["PHP_SELF"]);?>" method="post"> Getal1 <input type="text" name="getal1"><br> Getal2 <input type="text" name="getal2" ><br> <INPUT TYPE="radio" NAME="soort" VALUE="optellen">Optellen(+) <INPUT TYPE="radio" NAME="soort" VALUE="aftrekken">Aftrekken(-) <INPUT TYPE="radio" NAME="soort" VALUE="delen">Delen(/) <INPUT TYPE="radio" NAME="soort" VALUE="vermenigvuldigen">Vermenigvuldigen(*) <BR> <INPUT TYPE="submit" name ="Submit" VALUE="Verzenden"> <INPUT TYPE="reset" name="Reset" VALUE="Leegmaken"> </FORM> <?php } ?> |
Moet je die wel hebben draaien en is er nog steeds één request die er lang over doet.quote:
Wat bedoel je?quote:Op zaterdag 3 januari 2009 17:24 schreef cablegunmaster het volgende:
[ code verwijderd ]
hoe var dump ik dit?
ik krijg de variable niet goed van getal1 en getal 2quote:Op zaterdag 3 januari 2009 17:31 schreef GlowMouse het volgende:
[..]
Moet je die wel hebben draaien en is er nog steeds één request die er lang over doet.
[..]
Wat bedoel je?
quote:Op zaterdag 3 januari 2009 18:08 schreef GlowMouse het volgende:
De variabele heet dan ook niet $post of $_post maar $_POST. En de functie niet vardump maar var_dump.
Dat geldt voor iedere extensie natuurlijk. Wil je afbeeldingen resizen, dan zul je ook GD ofzo moeten hebben draaien. En wil je json_encode gebruiken in PHP < 5.2.3, dan zul je dat ook moeten installeren.quote:Op zaterdag 3 januari 2009 17:31 schreef GlowMouse het volgende:
Moet je die wel hebben draaien en is er nog steeds één request die er lang over doet.
En wil je PHP gebruiken...Helaas krijg je bij weinig hosters de beschikking over memcached. Bij shared hosting ben ik het nog nooit tegengekomen, waarschijnlijk omdat er geen authenticatie is.quote:Op zaterdag 3 januari 2009 20:12 schreef Roy_T het volgende:
[..]
Dat geldt voor iedere extensie natuurlijk. Wil je afbeeldingen resizen, dan zul je ook GD ofzo moeten hebben draaien. En wil je json_encode gebruiken in PHP < 5.2.3, dan zul je dat ook moeten installeren.
Dat eerder cachen werd eerder al gesuggereerd als oplossing, alleen niet icm memcached. Memcached is hiervoor niet zo heel erg goed omdat het zomaar dingen weg kan mikken als het geheugen vol zit. En als je al MySQL hebt, waarom zou je dat niet gebruiken? Voor de performance hoef je het niet te laten.quote:Je kunt de cache overigens prima vullen wanneer er een product wordt toegevoegd bijvoorbeeld, zodat er nooit iemand hoeft te wachten op een lange request. Ik heb verschillende apps gebouwd die met een cron eenmaal per dag kijken wat er nieuw is, dat in memcached opslaan en klaar.
Dat is waar. Ik werk nooit binnen shared hosting omgevingen, dus daar had ik niet aan gedachtquote:Op zaterdag 3 januari 2009 20:25 schreef GlowMouse het volgende:
En wil je PHP gebruiken...Helaas krijg je bij weinig hosters de beschikking over memcached. Bij shared hosting ben ik het nog nooit tegengekomen, waarschijnlijk omdat er geen authenticatie is.
Dat ligt helemaal aan de architectuur uiteraard. In het artikel waar je naar verwijst hebben ze het over een cluster van databases waar de data sharded wordt opgeslagen. Daar hebben de meesten uiteraard ook geen mogelijkheid toe.quote:Dat eerder cachen werd eerder al gesuggereerd als oplossing, alleen niet icm memcached. Memcached is hiervoor niet zo heel erg goed omdat het zomaar dingen weg kan mikken als het geheugen vol zit. En als je al MySQL hebt, waarom zou je dat niet gebruiken? Voor de performance hoef je het niet te laten.
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 | error_reporting(E_ALL); mysql_connect("localhost", "root", "")or die("mysql_error"); mysql_select_db("opdracht1")or die("mysql_error"); if(!empty($_POST)) { // username and password sent from form $myusername=$_POST['username']; $mypassword=$_POST['wachtwoord']; // To protect MySQL injection $myusername = stripslashes($myusername); $mypassword = stripslashes($mypassword); $myusername = mysql_real_escape_string($myusername); $mypassword = mysql_real_escape_string($mypassword); $query = "SELECT * FROM members WHERE username='$myusername' and password='$mypassword'"; $result = mysql_query($query); if($result == 1) { $user = $_POST["username"]; $wachtwoord = $_POST["wachtwoord"]; $_SESSION['username'] = $user; $_SESSION['wachtwoord'] = $wachtwoord; header("Location: beveiligd.php"); } else { echo "U heeft geen goede combinatie van emailadres en wachtwoord gebruikt."; } } else { echo "U heeft de pagina verkeerd opgeroepen."; } ?> |
quote:Return Values
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
Je kunt die resource weer aan een andere functie voeren, zoals deze.quote:Op zondag 4 januari 2009 12:59 schreef Kerol het volgende:
En hoe kan ik dan ervoor zorgen dat de resultaten wel in een rij komen te staan? Met mysql_fetch_row?
Jij vraagt alle kolommen op uit de tabel members (via SELECT * ), dus in ieder geval krijg je een gebruikersnaam en wachtwoord terug die je toch al kent. Heb je niks aan dus.quote:Op zondag 4 januari 2009 13:08 schreef Kerol het volgende:
Wat bedoel je met zoveel gegevens? Ik vraag nu alleen aan de database of de username en password zich bevinden in de database.
Verder niets toch? Of is dat niet wat je bedoelt..
Dat klopt, maar je vraagt veel meer informatie op dan je nodig hebt.quote:Op zondag 4 januari 2009 13:14 schreef Kerol het volgende:
Hij controleert nu toch juist of die username en wachtwoord in de database staan zodat de gebruiker kan inloggen?
1 2 3 | "SELECT COUNT(*) FROM members WHERE username='$myusername' and password='$mypassword'"; ?> |
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 | error_reporting(E_ALL); mysql_connect("localhost", "root", "")or die("mysql_error"); mysql_select_db("opdracht1")or die("mysql_error"); if(!empty($_POST)) { // username and password sent from form $myusername=$_POST['username']; $mypassword=$_POST['wachtwoord']; // To protect MySQL injection (more detail about MySQL injection) $myusername = stripslashes($myusername); $mypassword = stripslashes($mypassword); $myusername = mysql_real_escape_string($myusername); $mypassword = mysql_real_escape_string($mypassword); $query = "SELECT COUNT(*) FROM members WHERE username='$myusername' and password='$mypassword'"; $result = mysql_query($query); if($result == 1) { $user = $_POST["username"]; $wachtwoord = $_POST["wachtwoord"]; $_SESSION['username'] = $user; $_SESSION['wachtwoord'] = $wachtwoord; header("Location: beveiligd.php"); } else { echo "U heeft geen goede combinatie van emailadres en wachtwoord gebruikt."; } } else { echo "U heeft de pagina verkeerd opgeroepen."; } ?> |
1 2 3 4 5 6 7 | foreach ($_SESSION['user_shop']['items'] AS $item_ID => $key){ if (is_numeric($item_ID)){ $extra_Q .= $item_ID.','; } } ?> |
1 |
Ik zie geen ORDER BY. En zonder ORDER BY kun je de rijen in elke willekeurige volgorde terugkrijgen. De volgorde waarin je id's in een WHERE opgeeft wordt niet gebruikt voor de sortering.quote:Op zondag 4 januari 2009 14:00 schreef jeroen2497 het volgende:
- Er wordt niet gesorteerd op de volgorde van $extra_Q.
In $result staat nog steeds een resource, en niet de waarde voor count(*).quote:Op zondag 4 januari 2009 13:59 schreef Kerol het volgende:
Ik krijg nog steeds aldoor de melding: 'U heeft geen goede combinatie van emailadres en wachtwoord gebruikt. '
[ code verwijderd ]
Wat doe ik nu nog verkeerd?
Maar normaalgesproken is het toch zo dat als ik een serie ID's opgeef, hij ze in de opgegeven volgorde laat zien? Want hier kan ik volgens mij geen order by voor gebruiken?quote:Op zondag 4 januari 2009 14:07 schreef GlowMouse het volgende:
[..]
Ik zie geen ORDER BY.
[..]
In $result staat nog steeds een resource, en niet de waarde voor count(*).
mysql_query geeft niet het resultaat van count terug, maar een resultset. Je moet de eerste row nog fetchen met $row = mysql_fetch_row($result) en dan $row[0] == 1 checken.quote:Op zondag 4 januari 2009 13:59 schreef Kerol het volgende:
Ik krijg nog steeds aldoor de melding: 'U heeft geen goede combinatie van emailadres en wachtwoord gebruikt. '
[ code verwijderd ]
Wat doe ik nu nog verkeerd?
Kan ik anders niet de array's naast elkaar laten lopen ofzo?quote:Op zondag 4 januari 2009 14:08 schreef jeroen2497 het volgende:
[..]
Maar normaalgesproken is het toch zo dat als ik een serie ID's opgeef, hij ze in de opgegeven volgorde laat zien? Want hier kan ik volgens mij geen order by voor gebruiken?
Mijn edit gezien?quote:Op zondag 4 januari 2009 15:04 schreef jeroen2497 het volgende:
[..]
Kan ik anders niet de array's naast elkaar laten lopen ofzo?
Had ik niet gezienquote:Op zondag 4 januari 2009 15:25 schreef GlowMouse het volgende:
[..]
Mijn edit gezien?
Ik weet niet wat je bedoelt, maar als de volgorde zo belangrijk is, zul je dat later in PHP moeten regelen.
Je krijgt ze in de volgorde waarin MySQL ze aanlevert, dus die sla je op in een array met als key dat ID. Daarna loop je met een foreach door de array waarin de ID's op juiste volgorde staan en vraag je aan de hand van dat ID weer de bijbehorende tijdelijk opgeslagen MySQL-resultaatrij op.quote:Op zondag 4 januari 2009 15:33 schreef jeroen2497 het volgende:
[..]
Hoe vertel ik PHP dat er een bepaalde volgorde moet worden aangehouden?
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |