Als je 10 velden maakt met name="veldnaam[]" en deze niet in vult zit hij nog steeds in de array, dus de empty check zit zowel bij de concatenatie als bij de array+loops, dus dan komt het aan op de array vs, concat waar laatste 1 berekening extra nodig is per iteratie om de veldnaam te berekenen.quote:Op woensdag 9 november 2011 13:36 schreef Scorpie het volgende:
[..]
Arrays & loops
Concatenatie en empty() checks
Daarbij is het qua leesbaarheid een stuk minder netjes, is het werken in PHP met array`s een native werkwijze en werkt het qua onderhoud ook erg lekker.quote:Op woensdag 9 november 2011 13:41 schreef Pakspul het volgende:
[..]
Als je 10 velden maakt met name="veldnaam[]" en deze niet in vult zit hij nog steeds in de array, dus de empty check zit zowel bij de concatenatie als bij de array+loops, dus dan komt het aan op de array vs, concat waar laatste 1 berekening extra nodig is per iteratie om de veldnaam te berekenen.
Ben ik het nog niet mee eens, want je kan een rij toevoegen met js, maar wie zegt dat deze is ingevuld?quote:Op woensdag 9 november 2011 13:51 schreef Pakspul het volgende:
Ben ik het met je eens, maar je zit nog steeds met dat in beide gevallen je 10 velden hebt. Hiervoor kan de persoon met het probleem (naam even kwijt ) beter gaan kijken of hij wat mooie trucks kan uithalen in HTML+JS om zo on-the-fly rijen toe te voegen en dan kan hij perfect met naam[] gaan werken.
Het blijft verstandig om checks uit te blijven voeren, maar het scheelt sowieso een scherm waar de persoon moet opgeven hoeveel velden/rijen hij wil. Dat zal ten goede komen aan de gebruiksvriendelijkheid van de applicatie. Het scheelt je in omslachtige PHP constructies omdat het in JS erg makkelijk geregeld kan worden. En de persoon kan snel nog een regel toevoegen als hij er toch meer dan X wil hebben, anders moet hij terug en weer alles invullen.quote:Op woensdag 9 november 2011 13:57 schreef remi1986 het volgende:
[..]
Ben ik het nog niet mee eens, want je kan een rij toevoegen met js, maar wie zegt dat deze is ingevuld?
Dat ben ik dan wel weer met je eensquote:Op woensdag 9 november 2011 14:02 schreef Pakspul het volgende:
[..]
Het blijft verstandig om checks uit te blijven voeren, maar het scheelt sowieso een scherm waar de persoon moet opgeven hoeveel velden/rijen hij wil. Dat zal ten goede komen aan de gebruiksvriendelijkheid van de applicatie. Het scheelt je in omslachtige PHP constructies omdat het in JS erg makkelijk geregeld kan worden. En de persoon kan snel nog een regel toevoegen als hij er toch meer dan X wil hebben, anders moet hij terug en weer alles invullen.
Ik mag hopen dat het niet alleen zo voelt, maar ook zo is en je dat kan meten.quote:Op donderdag 10 november 2011 08:32 schreef Pizzalucht het volgende:
Ik heb gisteren een enorme database omgezet naar InnoDB, en wat een verschil zeg, alles voelt veel sneller aan.
Trouwens de DB config van pastebin gebruikt
Het gaat om een forum, iedereen zegt dat hij veel sneller is, dus daar hoef ik het niet voor te metenquote:Op donderdag 10 november 2011 08:38 schreef Scorpie het volgende:
[..]
Ik mag hopen dat het niet alleen zo voelt, maar ook zo is en je dat kan meten.
Hm, ik ben blij dat ik niet zo`n instelling op mijn werk laat zien.quote:Op donderdag 10 november 2011 08:41 schreef Pizzalucht het volgende:
[..]
Het gaat om een forum, iedereen zegt dat hij veel sneller is, dus daar hoef ik het niet voor te meten
Het lijkt wel alsof jij op dit forum zit om op iedereen te zeiken, is het ooit goed volgens jou?quote:Op donderdag 10 november 2011 08:45 schreef Scorpie het volgende:
[..]
Hm, ik ben blij dat ik niet zo`n instelling op mijn werk laat zien.
Het is gewoon een les. Als ik onnodig dingen ga vervangen / omzetten / migreren op mijn werk dan word ik (terecht) teruggefloten en moet ik aantonen waarom ik iets doe. Het is een way of thinking; "waarom doe je iets, wat levert het op, en hoe kan het nog beter?"quote:Op donderdag 10 november 2011 08:48 schreef Pizzalucht het volgende:
[..]
Het lijkt wel alsof jij op dit forum zit om op iedereen te zeiken, is het ooit goed volgens jou?
Dus je hebt wel gemeten?quote:Het was een weloverwogen actie, en we hadden veel onderzoek gedaan naar de oorzaak van de traagheid van de database.
Ik heb gemeten op MyISAM ja, maar die resultaten heb ik niet meer.quote:Op donderdag 10 november 2011 08:50 schreef Scorpie het volgende:
[..]
Het is gewoon een les. Als ik onnodig dingen ga vervangen / omzetten / migreren op mijn werk dan word ik (terecht) teruggefloten en moet ik aantonen waarom ik iets doe. Het is een way of thinking; "waarom doe je iets, wat levert het op, en hoe kan het nog beter?"
Ze zien me al aan komen met 'zuh zegguh dat het snellur werrukt'.
[..]
Dus je hebt wel gemeten?
Dan hoef je je toch ook niet aangevallen te voelen? Je hebt een use case waarom je iets gedaan hebt, je hebt het weten te motiveren en vervolgens uitgevoerd.quote:Op donderdag 10 november 2011 08:52 schreef Pizzalucht het volgende:
[..]
Ik heb gemeten op MyISAM ja, maar die resultaten heb ik niet meer.
Ja, maar geen resultaten om te vergelijken.quote:Op donderdag 10 november 2011 08:54 schreef Scorpie het volgende:
[..]
Dan hoef je je toch ook niet aangevallen te voelen? Je hebt een use case waarom je iets gedaan hebt, je hebt het weten te motiveren en vervolgens uitgevoerd.
quote:Op donderdag 10 november 2011 08:57 schreef Pizzalucht het volgende:
[..]
Ja, maar geen resultaten om te vergelijken.
En sorry dan, het is vroeg
Als je veel updates doet, sure, maar als je vooral veel leest en geen transacties nodig hebt is MyISAM vaak sneller. Dus dat is nogal een broad sweeping statement. Hoe dan ook is het "meten is weten", dat soort dingen test je natuurlijk gewoon.quote:Op donderdag 10 november 2011 11:18 schreef GlowMouse het volgende:
InnoDB is heel vaak de betere keuze.
Het verschil is slechts enkele procenten, niet de moeite waard tegenover de voordelen die InnoDB biedt.quote:Op donderdag 10 november 2011 12:16 schreef Catbert het volgende:
[..]
Als je veel updates doet, sure, maar als je vooral veel leest en geen transacties nodig hebt is MyISAM vaak sneller.
InnoDB houdt toch geen rowcounts bij voor tabellen? Of doet 'ie dat wel tegenwoordig? Gebruik al jaren geen MySQL meer...quote:Op donderdag 10 november 2011 12:22 schreef GlowMouse het volgende:
Het verschil is slechts enkele procenten, niet de moeite waard tegenover de voordelen die InnoDB biedt.
Met 256mb geheugen zit je helaas aan MyISAM vast.quote:Op donderdag 10 november 2011 11:18 schreef GlowMouse het volgende:
InnoDB is heel vaak de betere keuze. De configuratie moet je dan wel op je data en op je hardware afstemmen, en niet zo van pastebin plukken.
Je hebt nooit een rowcount nodig. Een rowcount bestaat ook helemaal niet.quote:Op donderdag 10 november 2011 12:40 schreef Catbert het volgende:
[..]
InnoDB houdt toch geen rowcounts bij voor tabellen? Of doet 'ie dat wel tegenwoordig? Gebruik al jaren geen MySQL meer...
256MB geheugen komt nergens voor. InnoDB kan er prima mee werken, maar verwacht net als bij MyISAM geen goede performance als je regelmatig data moet lezen die niet in je geheugen staat.quote:Op donderdag 10 november 2011 13:15 schreef Thomass het volgende:
[..]
Met 256mb geheugen zit je helaas aan MyISAM vast.
of heb je nog een protip?
Heb je daar ook mooie tutorials voor qua settings?quote:Op donderdag 10 november 2011 11:18 schreef GlowMouse het volgende:
InnoDB is heel vaak de betere keuze. De configuratie moet je dan wel op je data en op je hardware afstemmen, en niet zo van pastebin plukken.
Er is heel veel leesvoer, maar let vooral op de bufferpoolgrootte, op innodb_flush_log_at_trx_commit =2 (tenzij je een raid controller met bbu hebt, dan 1), innodb_flush_method = O_DIRECT, innodb_file_per_table, en bij een ssd nog wat andere settings. Let ook op dat je minimaal 5.5 gebruikt, en bij voorkeur een Percona-build omdat je daarmee veel meer kunt meten. Al is dat laatste bij 256 MB wellicht niet echt wenselijk omdat al die metrics ook een klein beetje geheugen gebruiken.quote:Op donderdag 10 november 2011 13:51 schreef ursel het volgende:
[..]
Heb je daar ook mooie tutorials voor qua settings?
Ik heb niet de config van pastebin geplukt, ik heb de config van de eigenaar van pastebinquote:Op donderdag 10 november 2011 11:18 schreef GlowMouse het volgende:
InnoDB is heel vaak de betere keuze. De configuratie moet je dan wel op je data en op je hardware afstemmen, en niet zo van pastebin plukken.
MyISAM houdt gewoon bij hoeveel rows er in een table zitten. Een simpele SELECT COUNT(*) FROM table wordt dan uitgevoerd door uberhaupt niet naar de table te kijken maar gewoon die rowcount terug te geven. Natuurlijk een enorm simpele usecase die niet vaak voor zal komen, en ik geloof best dat InnoDB in veel gevallen de beste oplossing is (alleen al om de row-locking), maar ik vind het wat kort door de bocht om te stellen dat dat altijd zo is.quote:Op donderdag 10 november 2011 13:40 schreef GlowMouse het volgende:
Je hebt nooit een rowcount nodig. Een rowcount bestaat ook helemaal niet.
je leest niet goedquote:Op donderdag 10 november 2011 14:17 schreef Catbert het volgende:
[..]
MyISAM houdt gewoon bij hoeveel rows er in een table zitten. Een simpele SELECT COUNT(*) FROM table wordt dan uitgevoerd door uberhaupt niet naar de table te kijken maar gewoon die rowcount terug te geven.
groot verschilquote:Op donderdag 10 november 2011 14:04 schreef Pizzalucht het volgende:
[..]
Ik heb niet de config van pastebin geplukt, ik heb de config van de eigenaar van pastebin
quote:Op donderdag 10 november 2011 13:40 schreef GlowMouse het volgende:
[..]
Je hebt nooit een rowcount nodig. Een rowcount bestaat ook helemaal niet.
[..]
Op mijn vps welquote:256MB geheugen komt nergens voor. InnoDB kan er prima mee werken, maar verwacht net als bij MyISAM geen goede performance als je regelmatig data moet lezen die niet in je geheugen staat.
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $sql = "SELECT pagina.id AS paginaid, pagina.title AS paginatitle, pagina.link AS paginalink, buttons.button_id AS button_id, buttons.id AS id FROM 'pagina' JOIN buttons ON pagina.id = buttons.id ORDER BY `paginatitle` ASC;"; ?> |
Ik moest voor ik moderator werd van B&H en GAM inderdaad eerst een PHP/mySQL toets afnemen en deze met minimaal 95% aan goede antwoorden behalen.quote:
keer tijd om je db class uit te breiden? Zodat hij dit soort dingen aangeeft.quote:Op donderdag 10 november 2011 22:33 schreef boem-dikkie het volgende:
Goedenavond, ik ben boem-dikkie de klapmongool en ik ga kappen voor vanavond. Ik had nog geen database verbinding op de pagina waar de output moest komen. !!!!
Dat heeft niet perse zo veel zin want de hele database class stond nog niet op die pagina.quote:Op donderdag 10 november 2011 22:37 schreef Pakspul het volgende:
[..]
keer tijd om je db class uit te breiden? Zodat hij dit soort dingen aangeeft.
zulke dingen doe je ook in je db-classquote:Op donderdag 10 november 2011 22:24 schreef boem-dikkie het volgende:
Hij laat mijn if(!$result){ echo "foutmelding" }; zien. Hij kan de query dus niet uitvoeren.
Je moet die db class dan ook gebruiken om queries uit te voeren, dan heb je nooit de kans om een query uit te voeren zonder dat de db class geladen is.quote:Op donderdag 10 november 2011 22:52 schreef boem-dikkie het volgende:
[..]
Dat heeft niet perse zo veel zin want de hele database class stond nog niet op die pagina.
1 2 3 4 5 | SELECT TIME_FORMAT(TIMEDIFF(landingtime,starttime),"%k:%i") AS flighttime ORDER BY flighttime <<<<<<--------------- LIMIT 0,10 |
Dat moet, met een index erop. Je kunt het resultaat ook 1x/dag berekenen en ergens opslaan, zoveel nieuwe records (niet als in db-records maar als in langste vluchten) zullen er niet komen.quote:Op vrijdag 11 november 2011 19:32 schreef KomtTijd... het volgende:
[ code verwijderd ]
Heeft iemand enig idee hoe ik dat kan verbeteren? Flighttime opslaan in een extra kolom kan natuurlijk
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 | SELECT floco_flight_id, (int) airplane, (varchar) firstpilot_feu_id, (int) secondpilot_feu_id, (int) starttime, (datetime) landingtime, (datetime) startmethod, (varchar) flighttype, (varchar) club, (boolean) own, (boolean) flighttime, (time) DATE(starttime) AS datum, feu1.data AS firstpilot_name, feu2.data AS secondpilot_name FROM flightdb_flights LEFT JOIN feusers_properties AS feu1 ON (firstpilot_feu_id = feu1.userid) AND (feu1.title = 'realname') LEFT JOIN feusers_properties AS feu2 ON (secondpilot_feu_id = feu2.userid) AND (feu2.title = 'realname') WHERE (YEAR(starttime) = '2011' AND airplane IN ('PH454','PH974','PH1006','PH1210','PH1382','PH1417','PH1433') AND flighttime > '01:05:00') ORDER BY flighttime desc LIMIT 0,10 |
1 2 3 4 5 | userid | title | data 1 | name | piet 2 | name | jan 1 | adres | hoofdstraat 21 3 | name | henk |
1 2 3 | WHERE (YEAR(starttime) = '2011' AND (firstpilot_feu_id = '2' OR secondpilot_feu_id = '2')) ORDER BY starttime |
1 2 | WHERE (DATE(starttime) = '2011-10-30') ORDER BY starttime |
Dat is juist wat ik gedaan heb. Flighttime is nu een eigen kolom met index, terwijl deze eerst met TIMEDIFF on the fly berekend werd. Het verschil in prestaties is alleen marginaal.quote:Op maandag 14 november 2011 11:56 schreef Catbert het volgende:
Je berekent on the fly (huhu) waarden waarop je ordent, dat betekent min of meer dat er een volledige tijdelijke tabel opgebouwd moet worden (zou je waarschijnlijk ook zien in een query explain). Oftewel; bereken die flight-time voor en zet er een index op.
quote:
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 | pear_ResultSet Object ( [emptyTimeStamp] => [emptyDate] => [datetime] => [connectionId] => Resource id #25 [fields] => Array ( [id] => 1 [select_type] => SIMPLE [table] => flightdb_flights [type] => range [possible_keys] => flighttime,airplane [key] => flighttime [key_len] => 4 [ref] => [rows] => 466 [Extra] => Using where; Using temporary; Using filesort ) [resultId] => Resource id #248 [_currentRow] => 0 [_numOfRows] => 3 [_numOfFields] => 10 [fetchMode] => 1 [EOF] => [record] => Array ( ) ) |
Dat leek mij ook, daarom is het ook irritant dat het zo traag gaat.quote:Sowieso is een query op 10k records complete peanuts.
Nou waarom het zo traag gaat is wel duidelijk. De vraag is waarom hij voor dat execution plan kiest...quote:Op maandag 14 november 2011 12:20 schreef KomtTijd... het volgende:
Dat leek mij ook, daarom is het ook irritant dat het zo traag gaat.
de explain is van de query exact zoals ik hierboven gepost heb (dus niet die twee varianten). Mooier weergeven zou kunnen maar ik wist/weet amper waar ik naar zit te kijken. Heb exlpain nog niet eerder gebruikt.quote:Op maandag 14 november 2011 12:52 schreef GlowMouse het volgende:
Waar is die explain van en kan je dat niet mooier weergeven?
>> De tabel flightdb_flights laat zich raden.
niet waar, bovendien zijn er meer tabellen
1 2 3 4 5 6 7 8 9 10 11 12 13 | 1 floco_flight_id bigint(19) 2 airplane varchar(80) 3 firstpilot_id int(11) 4 secondpilot_id int(11) 5 starttime datetime 6 landingtime datetime 7 startmethod varchar(20) 8 flighttype varchar(20) 9 club tinyint(1) 10 own tinyint(1) 11 firstpilot_feu_id int(11) 12 secondpilot_feu_id int(11) 13 flighttime time |
1 2 3 4 | 1 id int(11) 2 userid int(11) 3 title varchar(100) 4 data longtext |
Niet bepaald, denk dat je dan nog 90% over hebt.quote:>> AND airplane IN ('PH454','PH974','PH1006','PH1210','PH1382','PH1417','PH1433')
hoe selectief is dat?
Je hebt het hier dus over "using temporary", neem ik aan?quote:Op maandag 14 november 2011 13:01 schreef Catbert het volgende:
[..]
Nou waarom het zo traag gaat is wel duidelijk. De vraag is waarom hij voor dat execution plan kiest...
Using temporary en using filesort zijn beiden indicaties dat MySQL het niet op de indexen op heeft kunnen lossen en zijn flinke performance hits.quote:Op maandag 14 november 2011 13:28 schreef KomtTijd... het volgende:
Je hebt het hier dus over "using temporary", neem ik aan?
Dan weet ik dat ik dat voortaan in de gaten moet houden.
Je kunt ook gewoon bij het inloggen controleren of de opgegeven username en het wachtwoord overeen komen met een match in de database en met elkaar. Dan hoef je helemaal geen cookies te gebruiken. Weet overigens niet of dit beter is hoor.quote:Op dinsdag 15 november 2011 09:23 schreef n8n het volgende:
db: naam, ww encrypted met md5. bij inloggen wordt het wachtwoord omgezet naar md5 voor naar de server gestuurd te worden. cookie met naam en md5-ww staat in cookie om ingelogd te blijven.
De vraag is of dit een veilige methode is, heb verder totaal geen ervaring met beveiliging/inloggen met php.
voordelen:
- ww staat niet open en bloot in cookie.
- ww wordt encrypted over het internet verstuurd
- bij serverhack staan user-ww'en niet openbaar
nadelen:
- cookies?
MD5 is imo een beetje verouderd, simpele wachtwoorden zijn eenvoudig te achterhalen. Ik zou bijvoorbeeld SHA gebruiken.quote:Op dinsdag 15 november 2011 09:23 schreef n8n het volgende:
db: naam, ww encrypted met md5. bij inloggen wordt het wachtwoord omgezet naar md5 voor naar de server gestuurd te worden. cookie met naam en md5-ww staat in cookie om ingelogd te blijven.
De vraag is of dit een veilige methode is, heb verder totaal geen ervaring met beveiliging/inloggen met php.
voordelen:
- ww staat niet open en bloot in cookie.
- ww wordt encrypted over het internet verstuurd
- bij serverhack staan user-ww'en niet openbaar
nadelen:
- cookies?
Vanuit welke user stuur je hem handmatig aan en vanuit welke user via de scheduled task?quote:Op dinsdag 15 november 2011 09:05 schreef Darkomen het volgende:
Ik snap er echt geen donder van.
ik heb een script dat werk verdeeld, dit script include een rapportage script.
Wanneer het werk script word gedraaid schrijft het rapportage script netjes alle informatie weg in een log directory en zend een mail.
Savonds word ditzelfde script gestart door een scheduled task op een windows 2008 server....
Maar daar gaat het fout, deze geeft aan dat hij gedraaid heeft maar mn logs worden niet weggeschreven.
Start ik de task met de hand dan word alles netjes weggeschreven
Nu heb ik een kopie van de task gemaakt en een kopie van het rapportage script.
Enkel de log directory heb ik veranderd, deze zend netjes de mail uit en schrijft de logs weg?
Enige wat ik nog niet geprobeerd heb ik dezelfde logdir aanhouden, maar dat zou niet uit moeten maken aangezien sochtends alles wel word weg geschreven.
Ander leuk feit toen dit nog op een unix machine draaide was er geen enkel probleem.
Rechtenprobleem op de map ivm taak scheduler en account waaronder deze draait.quote:Op dinsdag 15 november 2011 09:05 schreef Darkomen het volgende:
Ik snap er echt geen donder van.
ik heb een script dat werk verdeeld, dit script include een rapportage script.
Wanneer het werk script word gedraaid schrijft het rapportage script netjes alle informatie weg in een log directory en zend een mail.
Savonds word ditzelfde script gestart door een scheduled task op een windows 2008 server....
Maar daar gaat het fout, deze geeft aan dat hij gedraaid heeft maar mn logs worden niet weggeschreven.
Start ik de task met de hand dan word alles netjes weggeschreven
Nu heb ik een kopie van de task gemaakt en een kopie van het rapportage script.
Enkel de log directory heb ik veranderd, deze zend netjes de mail uit en schrijft de logs weg?
Enige wat ik nog niet geprobeerd heb ik dezelfde logdir aanhouden, maar dat zou niet uit moeten maken aangezien sochtends alles wel word weg geschreven.
Ander leuk feit toen dit nog op een unix machine draaide was er geen enkel probleem.
Je zet ten eerste nooit een PW uberhaupt in een cookie. Je onthoudt de sessie. Daarnaast is MD5 achterhaald. Tenslotte zie ik nergens salts genoemd en ik hoop niet dat je overweegt MD5 passwords unsalted in je DB op te slaan?quote:Op dinsdag 15 november 2011 09:23 schreef n8n het volgende:
db: naam, ww encrypted met md5. bij inloggen wordt het wachtwoord omgezet naar md5 voor naar de server gestuurd te worden. cookie met naam en md5-ww staat in cookie om ingelogd te blijven.
De vraag is of dit een veilige methode is, heb verder totaal geen ervaring met beveiliging/inloggen met php.
voordelen:
- ww staat niet open en bloot in cookie.
- ww wordt encrypted over het internet verstuurd
- bij serverhack staan user-ww'en niet openbaar
nadelen:
- cookies?
dat doe ik ook wel, had alleen geen idee hoe ik een sessie aan kon makenquote:Op dinsdag 15 november 2011 09:25 schreef boem-dikkie het volgende:
[..]
Je kunt ook gewoon bij het inloggen controleren of de opgegeven username en het wachtwoord overeen komen met een match in de database en met elkaar. Dan hoef je helemaal geen cookies te gebruiken. Weet overigens niet of dit beter is hoor.
1 | /bin/sh: /home/frietkot/domains/naam.nl/public_html/includes/cronjobs/cronjob_aanmaningen.php: Permission denied |
Je moet 'cronjob_aanmaningen.php' zo chmodden dat je rechten hebt om het uit te voeren.quote:Op dinsdag 15 november 2011 10:56 schreef cablegunmaster het volgende:
[ code verwijderd ]
Eeuhm... Admin vragen op de server perhaps denk ik nu
Done .quote:Op dinsdag 15 november 2011 10:59 schreef The_Terminator het volgende:
[..]
Je moet 'cronjob_aanmaningen.php' zo chmodden dat je rechten hebt om het uit te voeren.
Iets in die richting . merkte al dat het script niks van me php snapte . Dankjequote:Op dinsdag 15 november 2011 11:27 schreef GlowMouse het volgende:
executable maken is niet nodig, je moet het door php laten uitvoeren:
php /home/frietkot/domains/naam.nl/public_html/includes/cronjobs/cronjob_aanmaningen.php
1 2 3 | <?php htmlentities($data[$key],ENT_COMPAT,"ISO-8859-1",false); ?> |
Wordtquote:“That’s a ‘magic’ sock.”
zonder de juiste encodering.quote:�That’s a �magic� sock.�
1 | “ |
1 | ” |
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 | <?php /** * Converts smart quotes (“,”,‘,’) and em-dash * * This function is needed because ISO-8859-1 (and by extend ISO-8859-15) * doesn't support these characters, so we need to convert them ourselves. * * @param string $text * @return string */ function CleanupSmartQuotes($text){ $badwordchars = array( chr(145), chr(146), chr(147), chr(148), chr(151) ); $fixedwordchars = array( "'", "'", '"', '"', '—' ); return str_replace($badwordchars,$fixedwordchars,$text); } ?> |
Stuur je pagina dan ook netjes als UTF-8 door.quote:Op donderdag 17 november 2011 08:39 schreef Sitethief het volgende:
ISO-8859-1 is default in htmlentities, ik gebruik nu ISO-8859-15 vanwege "Western European, Latin-9. Adds the Euro sign, French and Finnish letters missing in Latin-1 (ISO-8859-1). ".
Met UTF-8 verdwijnen bijvoorbeeld teksten met een µ volledig.
Dat, zelf zooi gaan replacen is gewoon dom.quote:Op donderdag 17 november 2011 11:03 schreef GlowMouse het volgende:
Stuur je pagina dan ook netjes als UTF-8 door.
quote:Op donderdag 17 november 2011 11:06 schreef Catbert het volgende:
[..]
Dat, zelf zooi gaan replacen is gewoon dom.
1 2 3 4 5 6 7 8 | function feedToBrowser($file, $formatID) { header("Content-type: " . toImageHeader($formatID)); header("Content-length: " . filesize($file)); header("Expires: Mon, 1 Jul 2027 05:00:00 GMT\n"); // doorsturen readfile($file); exit(); } |
Daar doelde ik (voornamelijk) op jaquote:Op donderdag 17 november 2011 21:31 schreef KomtTijd... het volgende:
En ja, een enter voor- of na je <?php ?> tags is óók output!
je ziet ''readfile' staan?quote:Op vrijdag 18 november 2011 01:45 schreef cablegunmaster het volgende:
Ik hoop voor je dat je niet direct alle bestanden in de DB opslaat. .
1 2 3 4 5 | <?php $string = "[onzin] [tk] Mooie auto!"; $parsed = preg_replace("/\[(*+.)\]/","<span class='topictag'>\\1</span>",$string); echo $parsed; ?> |
Ik had een IT genoot en die besloot alle mini Avatars op te slaan in de DB in blobs van max 100kb. het leek me een beetje te absurd. en traagmakend.quote:
Zijn beide oplossingen toen getest en met elkaar vergeleken?quote:Op zaterdag 19 november 2011 05:28 schreef cablegunmaster het volgende:
[..]
Ik had een IT genoot en die besloot alle mini Avatars op te slaan in de DB in blobs van max 100kb. het leek me een beetje te absurd. en traagmakend.
Een ^ aan het begin van een regex betekent iets anders dan een ^ als eerste teken tussen []. Bedoel je misschenquote:Op vrijdag 18 november 2011 21:45 schreef KomtTijd... het volgende:
In dit specifieke geval? (^[\[\]]+)
kortom: match één of meer karakters (+), die niet (^) voorkomt in de lijst tussen [], kortom die niet [ of ] zijn.
1 | ([^\[\]]+) |
dat hoeft niet, files van een harddisk kunnen door een webserver veel efficiënter geserveerd wordenquote:Op zaterdag 19 november 2011 09:05 schreef Light het volgende:
[..]
Zijn beide oplossingen toen getest en met elkaar vergeleken?
De regex begint al met een /, volgens mij match jij nu níét [ en wél ]. Niet getest overigens.quote:Op zaterdag 19 november 2011 09:14 schreef Light het volgende:
[..]
Een ^ aan het begin van een regex betekent iets anders dan een ^ als eerste teken tussen []. Bedoel je misschen
[ code verwijderd ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php $data_L = mysql_query($query_L); while($row = mysql_fetch_assoc($data_L)) { $query_R = "SELECT * FROM `Rechts` WHERE 'Name'=".$row['Name']." AND 'Size'=".$row['Size']; $data_R = mysql_query($query_R); if(mysql_num_rows($data_R) >= 1) { //doe iets } else { $query_R = "SELECT * FROM `Rechts` WHERE 'Name'=".$row['Name']." AND 'Size'=".$row['Size']." AND 'location=".$row['location']; $data_R2 = mysql_query($query_R2); if(...) //enzovoort } } ?> |
Als je op basis van 2 kolommen al geen match hebt zul je dat met een extra kolom al helemaal niet hebben (op basis van AND).quote:Op zaterdag 19 november 2011 13:20 schreef mschol het volgende:
ik selecteer rij 1 in tabel 1
vervolgens kijk ik of ik aan de hand van kolommen 1 en 2 een match kan vinden, lukt dit niet
dan doe ik kolom 3 erbij (en daarna kolom 4 erbij)
mwha. ik wil bestanden indexeren, daar sla ik een aantal properties van op (naam, grootte, checksum, locatie etc)quote:Op zaterdag 19 november 2011 13:34 schreef GlowMouse het volgende:
je database-opzet lijkt me al fout
helemaal gelijk, het ging dan ook om een voorbeeld code, waar ik niet gelet heb op de logica, (ik hoopte dat het idee van wat ik wilde wel duidelijk was eigenlijk )quote:Op zaterdag 19 november 2011 13:37 schreef Arcee het volgende:
[..]
Als je op basis van 2 kolommen al geen match hebt zul je dat met een extra kolom al helemaal niet hebben (op basis van AND).
Je kunt bij een match wel steeds een kolom toevoegen en kijken of je dan nog steeds een match hebt, maar zoals jij doet is zinloos. Je moet die AND in een OR veranderen, op die manier vergroot je de matchkans (los van of het een zinvolle test is).
Dit even over de logica, niet over de efficiency.
preg_ of str_ ja, maar hoe?quote:
No shit. En nu nog de reguliere expressie .quote:Op zaterdag 19 november 2011 16:57 schreef YazooW het volgende:
De replace value gewoon leeg laten lijkt mij.
1 2 3 | <?php $bericht = preg_replace("/<a (.*)>(.*)<\/a>/iU", "", $bericht); ?> |
is het html? Strip_tags is wel handig.quote:Op zaterdag 19 november 2011 16:49 schreef Dalando het volgende:
Heel simpel vraagje eigenlijk. Ik heb een string, en ik wil alle linkjes en plaatjes weghalen. Gewoon compleet weg. Hoe doe ik dat?
En alles wat je op Google vind is met eregi, en dat is deprecated.
Dat is precies wat ik zoek. Nooit van die functie gehoordquote:Op zaterdag 19 november 2011 17:17 schreef GlowMouse het volgende:
[..]
is het html? Strip_tags is wel handig.
Met strip_tags() maak je vanquote:
1 | foo <a href="bar">bar</a> baz |
Alle keren dat ik het heb geprobeerd stond die optie aangevinkt.quote:Op maandag 21 november 2011 16:50 schreef KomtTijd... het volgende:
Of gewoon het vinkje aanzetten bij "Sta het onderbreken van de import toe wanneer het script herkent dat de tijdslimiet nadert."
phpMyAdmin is sowieso voor dit soort dingen niet echt super. Gebruik voor de servers hier altijd de Linux console om dumps te maken en te importeren.quote:Op maandag 21 november 2011 17:00 schreef YazooW het volgende:
Wazig, bij Phpmyadmin kreeg ik dus elke keer na zo'n 5 minuten die time-out, in die 5 minuten had hij zo'n 90.000 regels geschreven.
Die Bigdump knalt op zijn beurt 822.000 regels weg in 3 minuten.
Het is dus gelukt nu
Dat of een echt DB programma die niet vastloopt op een timeout, maar gewoon zijn werk doet en aangeeft hoelang het gaat duren als het aardig wat records zijnquote:Op dinsdag 22 november 2011 09:19 schreef remi1986 het volgende:
[..]
phpMyAdmin is sowieso voor dit soort dingen niet echt super. Gebruik voor de servers hier altijd de Linux console om dumps te maken en te importeren.
Maar mooi dat het is gelukt!
Dat laatste kan soberzo niet.quote:Op dinsdag 22 november 2011 09:27 schreef Pakspul het volgende:
[..]
Dat of een echt DB programma die niet vastloopt op een timeout, maar gewoon zijn werk doet en aangeeft hoelang het gaat duren als het aardig wat records zijn
1 2 3 4 5 6 | SELECT * FROM flightdb_flights LEFT JOIN feusers_properties AS feu1 ON (firstpilot_feu_id = feu1.userid) LEFT JOIN feusers_properties AS feu2 ON (secondpilot_feu_id = feu2.userid) |
quote:Op dinsdag 22 november 2011 22:45 schreef GlowMouse het volgende:
Dat kan, dan moet je 2x joinen en een alias gebruiken voor tabel B en voor naam uit tabel B.
Ja scriptingtaal kon ik zelf wel uitvogelen Maar hoe, dat je niet het hele topic laad maar alleen de nieuwe posts enzo, hoe gebeurd dat?quote:Op zaterdag 26 november 2011 20:09 schreef GlowMouse het volgende:
Momenteel loopt dat via php, maar er zijn experimenten met node.js.
Dus je hebt een html pagina waar je bepaalde elementen vanaf wilt krijgen?quote:Op zondag 27 november 2011 15:32 schreef RPG het volgende:
Wat zou de makkelijkste oplossing zijn om dit te doen:
Hieruit:
<field name="willekeurige name" value="willekeurige value"/>
Wil ik eigenlijk de waardes "willekeurige name" en "willekeurige value" los krijgen. In het document staat nog veel meer tekst. Ik wil dus eigenlijk dat als hij de regel tegenkomt met <field name..../> dat hij die 2 strings eruit kan halen en in een variable wegschrijft.
Zouden jullie mij kunnen vertellen welke richting ik op zou moeten zoeken want volgens mij is het veel simpeler te doen dan ik het probeer te doen.
Het is eigenlijk een xml waar die data vandaan komt. Via php pas ik de xml aan zodat ze aan een bepaalde standaard voldoen zodat ze makkelijk in te lezen zijn.quote:Op zondag 27 november 2011 15:33 schreef Dalando het volgende:
[..]
Dus je hebt een html pagina waar je bepaalde elementen vanaf wilt krijgen?
1 2 3 4 5 6 7 8 | Array ( [27-11-2011] => 392.97 [26-11-2011] => 385.71 [24-11-2011] => 516.98 [23-11-2011] => 513.14 [22-11-2011] => 516.01 ) |
1 2 3 4 5 6 7 8 9 10 11 | <?php $datums = array('22-11-2011', '23-11-2011', '24-11-2011', '25-11-2011', '26-11-2011', '27-11-2011'); $xas=array(); foreach ( $datums as $v ) { if ( isset($data[$v]) ) { $xas[$v] = $data[$v]; } else { $xas[$v] = 0; } } ?> |
1 2 3 4 5 6 7 8 9 10 | foreach ( $d as $v) { if ( isset($data[$v]) ) { array_push($yas,$data[$v]); } else { array_push($yas, 0); } array_push($xas,substr($v,0,5)); ; } |
Ik zou het zo doen:quote:
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 | <?php $data = array('27-11-2011' => 392.97, '26-11-2011' => 385.71, '24-11-2011' => 516.98, '23-11-2011' => 513.14, '22-11-2011' => 516.01); $data_full = array(); $data_dates = array_keys($data); $date_start = strtotime(implode('-', array_reverse(explode('-', end($data_dates))))); $date_end = strtotime(implode('-', array_reverse(explode('-', reset($data_dates))))); $data_full[date('d-m-Y', $date_start)] = $data[date('d-m-Y', $date_start)]; while($date_start < $date_end) { $date_start += 86400; if(!isset($data[date('d-m-Y', $date_start)])) { $data_full[date('d-m-Y', $date_start)] = 0; }else{ $data_full[date('d-m-Y', $date_start)] = $data[date('d-m-Y', $date_start)]; } } $data_full = array_reverse($data_full); print_r($data_full); ?> |
Dreamweaver is een ontwikkeltool en geen pakket. En voor zo`n foto gallery kan je kijken naar coppermine.quote:Op dinsdag 29 november 2011 12:15 schreef Cue_ het volgende:
Even een totaal ander vraagje:
een vriend van mij wil graag een website maken, iets in de trant van linkje voorbeeld
Nu natuurlijk is dit altijd wel te maken met bv php. Maar zijn er ook gratis pakketten waar je zoiets mee kan maken (dreamweaver of weet ik veel wat)? Want daar ben ik totaal niet in thuis en ben benieuwd of jullie er tips voor hebben.
Doel ook meer op ontwikkeltools. Want het liefst zou ie het zelf maken (evt met hulp van mij).quote:Op dinsdag 29 november 2011 12:16 schreef Scorpie het volgende:
Dreamweaver is een ontwikkeltool en geen pakket. En voor zo`n foto gallery kan je kijken naar coppermine.
Iemand die me op weg kan helpen?quote:Op zondag 27 november 2011 15:39 schreef RPG het volgende:
[..]
Het is eigenlijk een xml waar die data vandaan komt. Via php pas ik de xml aan zodat ze aan een bepaalde standaard voldoen zodat ze makkelijk in te lezen zijn.
Nu is er een partij die velden aanlevert als:
<field name="willekeurige name" value="willekeurige value"/>
inplaats van
<field name="willekeurige name">willekeurige value</field>
Dus vandaar dat ik die 2 veldnamen wil hebben zodat ik het wel kloppend kan maken. (makkelijkste zou zijn als leverancier het aan zou passen maar dat is niet mogelijk)
Misschien doe ik gewoon heel moeilijk nu en is er zelfs nog betere oplossing
snap het probleem niet? voor de naam lees je het attribuut "name" uit. Dan kan je dat toch ook doen voor value?quote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php $i=0; $pix=1; $divId=1; $posLeft=0; $posTop=0; $var="px"; while($i<=800) { echo "<div id=\"$divId\" style=\"position:absolute; height:$pix$var; width:$pix$var; background:#000000; top:$posTop$var; left:$posLeft$var;\"></div>"; $divId++; $posLeft++; $i++; } ?> |
Dan maak je dus nog een while loop over de huidige 800x loop. De nieuwe loop runt 600x. De enige actie die de 600x loop uitvoert is de reeds bestaande loop, en een break na de laatste div.quote:Op dinsdag 29 november 2011 20:56 schreef YazooW het volgende:
[ code verwijderd ]
Door middel van deze code maak ik 800 divjes, alle divjes zijn 1px bij 1px groot. Het eerste divje begint bij top:0 en left:0. Elk nieuw divje wat gemaakt wordt staat 1px verder naar rechts dan de vorige div.
Als resultaat krijg ik dus een zwarte streep van 800px breed helemaal bovenaan mijn scherm. Wat ik nu wil is dat ik ook nog van boven naar beneden 600 lijnen aanmaak van 800divs(px's) groot. Als eindresultaat wil ik dus 800x600 pixels hebben, elke pixel wordt aangestuurd door zijn eigen divje. De oplossing van dit moet niet al te ingewikkeld zijn lijkt mij, maar toch kom ik er zelf niet uit
Verder nog een klein vraagje over de variabelen die ik in de div plaats. Het lukt mij namelijk niet om bijvoorbeeld $var precies voor px te plaatsen, zet ik ze uit elkaar dan kom er dus een spatie in de broncode waardoor de divjes niet goed weergeven worden, zet ik ze aan elkaar dan wordt px aan het einde van de variabele geplakt zeg maar. Dit heb ik nu tijdelijk opgelost door het volgende te doen: $pix$var, waarbij de waarde van $var "px" is, how to fix this?
1 2 3 4 5 6 7 | <?php for($i=0; $i<800; $i++) { for($j=0; $j<800; $j++) { // maak hier je div met coördinaten (i,j) } } ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php $pix=1; $divId=1; $var="px"; for($i=0; $i<600; $i++) { for($j=0; $j<800; $j++) { echo "<div id=\"$divId\" style=\"position:absolute; height:$pix$var; width:$pix$var; background:#000000; top:$j$var; left:$i$var;\"></div>"; $divId++; } } ?> |
1 | top:$j$var |
Waarom hoog je de top steeds op? Die hoort toch constant te zijn, aangezien het een rij betreft?quote:Op dinsdag 29 november 2011 21:08 schreef YazooW het volgende:
Thanks, het is gelukt!
Lijkt nu trouwens wel een beetje op een slideIn van jQuery hoe mijn browser nu die divjes opbouwt
[ code verwijderd ]
Nu zit ik alleen nog met het gedeelte van die variabelen in de div.
Even een voorbeeld hoe ik de top invul:
[ code verwijderd ]
Op dit moment werkt het zo wel, maar dit kan ook anders volgens mij, om de een of andere manier lijkt mij dat dit niet de juiste manier is.
Ik heb eerlijk gezegd geen idee, ben al blij dat ik het nu werkend heb gekregen.quote:Op dinsdag 29 november 2011 21:12 schreef U.N.K.L.E. het volgende:
[..]
Waarom hoog je de top steeds op? Die hoort toch constant te zijn, aangezien het een rij betreft?
Maar dat is niet wat nu gebeurd. Bij elk nieuw divje wordt de top 1px groter. En dat is niet de bedoeling natuurlijk De top is constant voor 1 hele rij. Daarna kan hij veranderen.quote:Op dinsdag 29 november 2011 21:14 schreef YazooW het volgende:
[..]
Ik heb eerlijk gezegd geen idee, ben al blij dat ik het nu werkend heb gekregen.
Nadat er elke keer 800 divjes van links naar rechts geschreven zijn moet de top met 1 verhoogd worden zodat er aan de volgende lijn met divjes begonnen kan worden.
Geen idee wat je opzet wordt (een gigantische hoeveelheid data in ieder geval), maar kun je afhankelijk van je data niet beter een html5 canvas gebruiken met javascript?quote:Op dinsdag 29 november 2011 21:25 schreef YazooW het volgende:
Ik wil juist met pixels werken omdat ik alle pixels individueel wil gaan aansturen.
1 2 3 | if(preg_match('/\PL/', $_POST['veld'])){ print 'error veld'; } |
1 2 3 | if(!preg_match('#^[a-z. ]+$#i', $_POST['initialen'])){ print 'error initialen'; } |
Ja, dat is een vrij geavanceerd Excel-bestand. Alle functionaliteiten die daarin zitten en die door de site uitgelezen worden moeten we dus gaan benoemen?quote:
Ik heb momenteel 3 webshops met Magento afgeleverd, en des te meer ik met Magento werk, des te meer begin ik het te haten. Beroerde documentatie en een vrij 'slechte' gebruikerscommunity, zitten er wel tussen met verstand hoor, maar de meeste tutorials en posts met 'oplossingen' die je voorbij ziet komen zijn meestal van die hacks en vage trucjes om iets voor elkaar te krijgen. En dan nog het geneuk dat 'n miljard dingen die wel werkte in voorgaande versies, niet meer werken in de nieuwste Magento versie. Ook moet je voor sommige basis functionaliteit die je als developer gewoon in de admin interface verwacht in de files zelf knoeien (denk hierbij aan producten op nieuwste eerst sorteren, of het uitschakelen van 'Add to wishlist', terwijl je 'Add to compare' bijv. wel weer kan uitschakelen via de admin interface). Maar goed dat is allemaal niet jouw probleem hehe.quote:Op woensdag 30 november 2011 17:12 schreef McCandless het volgende:
Ik heb even een vraag voor de experts. We hebben op dit moment een webshop met een front- en backoffice dat volledig door één bedrijf zelf ontwikkeld is en volledig voor ons op maat. Nu willen we over naar een OS zoals Magento.
De vraag is nu welke info hebben (Magento) programmeurs in ieder geval nodig voor ze een uitspraak kunnen doen hoeveel werk er in gaat zitten om onze huidige webshop na te bouwen?
1 2 3 4 5 | <?php for($day = 1; $day <= 7; $day++) { $days[] = date('m/d/Y', strtotime($year. "W" . $week_number . $day)) . "\n"; } ?> |
1 | array(7) { [0]=> string(11) "03/14/2011 " [1]=> string(11) "03/21/2011 " [2]=> string(11) "03/28/2011 " [3]=> string(11) "04/04/2011 " [4]=> string(11) "04/11/2011 " [5]=> string(11) "04/18/2011 " [6]=> string(11) "04/25/2011 " } |
1 2 3 4 5 6 | <?php for($day = 1; $day <= 7; $day++) { $formatted = sprintf('%4d-W%d-%d', $year, $week_number, $day); $days[] = date('m/d/Y', strtotime($formatted)) . "\n"; } ?> |
Wat gebeurd er met het CSV bestand nadat het is geupload? Ik werk zelf ook veel met CSV bestanden uit verschillende bronnen, ik importeer de data die daarin staat naar een database dmv de standaard CSV functies die PHP biedt, zie http://php.net/manual/en/function.fgetcsv.php voor voorbeelden.quote:Op woensdag 30 november 2011 17:33 schreef McCandless het volgende:
Tja, we werkten al met een Excel-bestand toen ik hier kwam werken. We werken met meer dan 20 leveranciers die hun producten-informatie ook in Excel aanleveren. Helaas is hier niet de kennis om dat gemakkelijk en snel om te zetten in een database. Dat Excel-bestand wordt geëxporteerd naar csv, waarna we dat uploaden.
Het lijkt mij inderdaad handig om dat eerst te wijzigen. En waarom zou dat koppelen niet mogelijk zijn? Je werkt immers met dezelfde data als je het in een DB zet.quote:Misschien is het dus wel eerst zaak voor ons om dit eerst te wijzigen? Wat zijn de voordelen en hoe geef ik input aan zo'n database (automatisch koppelen met de productinformatie van de leveranciers zal niet mogelijk zijn?), want ik ben hier eerlijk gezegd totaal onbekend mee. .
Kan idd bij het weergeven ook nog wel.quote:Op donderdag 1 december 2011 07:44 schreef Light het volgende:
Waarschijnlijk is niet duidelijk welke string er precies in strtotime wordt gebruikt, of de string is niet eenduidig om te zetten naar een timestamp.
[ code verwijderd ]
En waarom voeg je een \n toe achter die datum? Dat kan bij het weergeven ook nog wel. (Ik zou denk ik ook gewoon kiezen om timestamps (of DateTime objecten) door te geven en de exacte notatie op het scherm pas bij daadwerkelijke weergave bepalen.)
1 | array(7) { [0]=> string(11) "01/01/1970 " [1]=> string(11) "01/01/1970 " [2]=> string(11) "01/01/1970 " [3]=> string(11) "01/01/1970 " [4]=> string(11) "01/01/1970 " [5]=> string(11) "01/01/1970 " [6]=> string(11) "01/01/1970 " } |
SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
$week_number moet met een 0 beginnen indien hij <2 digits is. bij week 01 werkt het dus gewoon, of week 10. etc.quote:Op donderdag 1 december 2011 03:04 schreef Diabox het volgende:
Hoe krijg ik de dagen van een specifieke week uit 'n jaar? Ik heb momenteel:
[ code verwijderd ]
Deze werkt bij sommige weeknummers wel, maar bijv. als het jaar 2011 is, en het week nummer 1, dan krijg ik de volgende array:
[ code verwijderd ]
Thanks, voeg nu 'n 0 toe als <2 digits. Was me niet opgevallen dat ie het wel deed bij weken bestaande uit 2 digitsquote:Op donderdag 1 december 2011 20:54 schreef Luchtkoker het volgende:
[..]
$week_number moet met een 0 beginnen indien hij <2 digits is. bij week 01 werkt het dus gewoon, of week 10. etc.
Gewoon W%d vervangen door W%02d is dan de makkelijkste oplossing.quote:Op donderdag 1 december 2011 21:06 schreef Diabox het volgende:
[..]
Thanks, voeg nu 'n 0 toe als <2 digits. Was me niet opgevallen dat ie het wel deed bij weken bestaande uit 2 digits
quote:Op vrijdag 2 december 2011 00:36 schreef Light het volgende:
[..]
Gewoon W%d vervangen door W%02d is dan de makkelijkste oplossing.
Je kan een excel bestand makkelijk gebruiken om een CSV te maken en deze in je DB te stoppen . Je kan het als basis gebruiken daarvanuit normaliseren. (velden en tabellen op een goede manier organiseren ). Vervolgens kun je hieruit weer een DB maken en zoals eerder werd gezegt een Excel bestand is een soort van DB en kan als DB gebruikt worden. Of dit nou zo optimaal is is een ander verhaal.quote:Op woensdag 30 november 2011 17:26 schreef Pizzalucht het volgende:
Een Excel bestand gebruiken als database voor je webshop?
Zelfde idee, hiero zelfs al ben je wat verder met magento heb je een te beroerde documentatie.quote:Op woensdag 30 november 2011 17:31 schreef Diabox het volgende:
[..]
Ik heb momenteel 3 webshops met Magento afgeleverd, en des te meer ik met Magento werk, des te meer begin ik het te haten. Beroerde documentatie en een vrij 'slechte' gebruikerscommunity, zitten er wel tussen met verstand hoor, maar de meeste tutorials en posts met 'oplossingen' die je voorbij ziet komen zijn meestal van die hacks en vage trucjes om iets voor elkaar te krijgen. En dan nog het geneuk dat 'n miljard dingen die wel werkte in voorgaande versies, niet meer werken in de nieuwste Magento versie. Ook moet je voor sommige basis functionaliteit die je als developer gewoon in de admin interface verwacht in de files zelf knoeien (denk hierbij aan producten op nieuwste eerst sorteren, of het uitschakelen van 'Add to wishlist', terwijl je 'Add to compare' bijv. wel weer kan uitschakelen via de admin interface). Maar goed dat is allemaal niet jouw probleem hehe.
Wat wel jouw probleem is, is dat het gigantisch uitgebreid is, en als je 'n leek bent dat je 'verdwaald' kan raken in de admin, als je geen computer leek bent is het wel easy uiteraard.
Verder zorgen voor goeie hosting, Magento is erg resource intensief en op normale shared hosting rete traag. Zelf ben ik te spreken over de Magento hosting die skyberate.net biedt.
Voor 'n developer gewoon je huidige webshop laten zien en je eisen geven qua functionaliteit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php class Klant{ function insertKlant($data){ //functie global $db; } function deleteKlant($id){ //functie return true; } } ?> |
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 | <?php class Customer { private $name; public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } private $address; public function getAddress() { return $this->address; } public function setAddress($address) { $this->address = $address; } // More properties ... :) public function __construct($name = '', $address = '') { $this->setName($name); $this->setAddress($address); } public function save() { // save logic here } public function delete() { // delete logic here } } ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php $adres = strip_tags( get_the_term_list($post->ID, 'adres') ); $postcode = strip_tags( get_the_term_list($post->ID, 'postcode') ); $httpadres = "http://maps.google.com/maps/api/geocode/json?address="; $httpadres .= str_replace(" ", "+", $adres); $httpadres .= "+"; $httpadres .= str_replace(" ", "+", $postcode); $httpadres .= "&sensor=false"; $geocode=file_get_contents($httpadres); $output= json_decode($geocode); $lat = $output->results[0]->geometry->location->lat; $long = $output->results[0]->geometry->location->lng; ?> |
Teveel requests gedaan?quote:Op dinsdag 6 december 2011 13:05 schreef _superboer_ het volgende:
edit: gister werkte de code nog wel
Hoe worden requests geteld? Gaat het om dan om het aantal requests vanaf de domein japansesushi.nl of vanaf mijn ip-adres?quote:
https://code.google.com/i(...)on/geocoding/#Limitsquote:Op dinsdag 6 december 2011 13:18 schreef _superboer_ het volgende:
[..]
Hoe worden requests geteld? Gaat het om dan om het aantal requests vanaf de domein japansesushi.nl of vanaf mijn ip-adres?
Als ik vanaf een ander device probeer werkt het ook niet, terwijl als ik zelf in m'n browser naar de api-url surf ik wel iets terug krijg.quote:Op dinsdag 6 december 2011 13:21 schreef mstx het volgende:
[..]
https://code.google.com/i(...)on/geocoding/#Limits
Ik neem aan dat hij het aantal requests per IP telt. Als je fiile_get_contents doet stuurt hij volgens mij sowieso geen domeinnaam mee dus die kan google niet achterhalen.
Wie doet de request bij Google?quote:
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 | <?php mysql_query('INSERT INTO toll_free_cross_corporation (`LINE_NO`, `CORPORATION_ID`, `BILL_PLAYER_ID`, `NODE_NO`, `ACCOUNT_NO`, `PAGE_NO`, `INVOICE_NO`, `INVOICE_DATE`, `ACCOUNTING_CODE`, `ACCOUNTING_DESCRIPTION`, `ACCOUNTING_ID_DESCRIPTION`, `NUMBER_CALLED_FROM`, `DATE_CALLED`, `TIME_CALLED`, `CALLER_NUMBER`, `PLACE_CALLED_FROM`, `MINUTES_CALLED`, `ROUTED_FROM_NETWORK`, `ROUTED_FROM_NCP`, `ROUTED_FROM_RATE`, `ROUTED_FROM_TYPE`, `USAGE`, `PAYPHONE_USE_CHARGE`, `SURCHARGE`, `TOTAL`, `END_TIME`, `CALCULATED_RATE`, `MINUTES_TRANSLATED_TO_SECONDS`, `START_DATE_TIME_TIMESTAMP`, `END_DATE_TIME_TIMESTAMP` ) VALUES '.implode(',', $sql)) or die (mysql_errno() . ": ". mysql_error()); ?> |
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 | <?php foreach( $toll_free_cross_corporation_data_array as $row ) { $sql[] = '("'.mysql_real_escape_string($row['LINE_NO']).'", "'.mysql_real_escape_string($row['CORPORATION_ID']).'", "'.mysql_real_escape_string($row['BILL_PLAYER_ID']).'", "'.mysql_real_escape_string($row['NODE_NO']).'", "'.mysql_real_escape_string($row['ACCOUNT_NO']).'", "'.mysql_real_escape_string($row['PAGE_NO']).'", "'.mysql_real_escape_string($row['INVOICE_NO']).'", "'.mysql_real_escape_string($row['INVOICE_DATE']).'", "'.mysql_real_escape_string($row['ACCOUNTING_CODE']).'", "'.mysql_real_escape_string($row['ACCOUNTING_DESCRIPTION']).'", "'.mysql_real_escape_string($row['ACCOUNTING_ID_DESCRIPTION']).'", "'.mysql_real_escape_string($row['NUMBER_CALLED_FROM']).'", "'.mysql_real_escape_string($row['DATE_CALLED']).'", "'.mysql_real_escape_string($row['TIME_CALLED']).'", "'.mysql_real_escape_string($row['CALLER_NUMBER']).'", "'.mysql_real_escape_string($row['PLACE_CALLED_FROM']).'", "'.mysql_real_escape_string($row['MINUTES_CALLED']).'", "'.mysql_real_escape_string($row['ROUTED_FROM_NETWORK']).'", "'.mysql_real_escape_string($row['ROUTED_FROM_NCP']).'", "'.mysql_real_escape_string($row['ROUTED_FROM_RATE']).'", "'.mysql_real_escape_string($row['ROUTED_FROM_TYPE']).'", "'.mysql_real_escape_string($row['USAGE']).'", "'.mysql_real_escape_string($row['PAYPHONE_USE_CHARGE']).'", "'.mysql_real_escape_string($row['SURCHARGE']).'", "'.mysql_real_escape_string($row['TOTAL']).'", "'.mysql_real_escape_string($row['END_TIME']).'", "'.mysql_real_escape_string($row['CALCULATED_RATE']).'", "'.mysql_real_escape_string($row['MINUTES_TRANSLATED_TO_SECONDS']).'", "'.mysql_real_escape_string($row['START_DATE_TIME_TIMESTAMP']).'", "'.mysql_real_escape_string($row['END_DATE_TIME_TIMESTAMP']).'" )'; } ?> |
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 | CREATE TABLE IF NOT EXISTS `toll_free_cross_corporation` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `LINE_NO` text NOT NULL, `PAGE_NO` int(11) NOT NULL, `CORPORATION_ID` text NOT NULL, `BILL_PLAYER_ID` text NOT NULL, `NODE_NO` text NOT NULL, `ACCOUNT_NO` text NOT NULL, `INVOICE_NO` text NOT NULL, `INVOICE_DATE` date NOT NULL, `ACCOUNTING_CODE` text NOT NULL, `ACCOUNTING_DESCRIPTION` text NOT NULL, `ACCOUNTING_ID_DESCRIPTION` text NOT NULL, `NUMBER_CALLED_FROM` text NOT NULL, `DATE_CALLED` date NOT NULL, `TIME_CALLED` time NOT NULL, `CALLER_NUMBER` text NOT NULL, `PLACE_CALLED_FROM` text NOT NULL, `MINUTES_CALLED` decimal(6,2) NOT NULL, `ROUTED_FROM_NETWORK` varchar(1) NOT NULL, `ROUTED_FROM_NCP` varchar(1) NOT NULL, `ROUTED_FROM_RATE` varchar(1) NOT NULL, `ROUTED_FROM_TYPE` varchar(2) NOT NULL, `USAGE` decimal(6,2) NOT NULL, `PAYPHONE_USE_CHARGE` decimal(6,2) NOT NULL, `SURCHARGE` decimal(6,2) NOT NULL, `TOTAL` decimal(6,2) NOT NULL, `END_TIME` time NOT NULL, `CALCULATED_RATE` decimal(4,4) NOT NULL, `MINUTES_TRANSLATED_TO_SECONDS` int(11) NOT NULL, `START_DATE_TIME_TIMESTAMP` text NOT NULL, `END_DATE_TIME_TIMESTAMP` text NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1"; |
Zit wat in, zou ook een varchar moeten zijn eigenlijk.quote:Op dinsdag 6 december 2011 20:46 schreef GlowMouse het volgende:
verander mysql_query in echo en kijk wat eruit komt
let ook op je datatypes, text om een datum op te slaan is raar
1 2 3 4 5 | if (file_exists(DIR_DATABASE . $driver . '.php')) { require_once(DIR_DATABASE . $driver . '.php'); } else { exit('Error: Could not find database file ' . DIR_DATABASE . $driver . '.php!'); } |
Het moet em ergens in de includes zitten, want als ik het volgende aanpasquote:Op woensdag 7 december 2011 14:06 schreef GlowMouse het volgende:
Zoek op cwd of stel een absoluut pad in.
1 2 | // define('DIR_DATABASE', DIR_SYSTEM.'database/'); define('DIR_DATABASE', $_SERVER['DOCUMENT_ROOT'].'/OpenCart/system/database'); |
1 2 3 4 5 6 | // DIR define('INCLUDE_PATH', $_SERVER['DOCUMENT_ROOT'].'/OpenCart'); define('DIR_CATALOG', 'catalog/'); define('DIR_APPLICATION', DIR_CATALOG); define('DIR_SYSTEM', 'system/'); |
1 2 | // Set Include Path ini_set('include_path', INCLUDE_PATH); |
Die zag ik aankomen idd en had ik al gedaan, zit nu weer met een nieuwe error dus ga weer even debuggenquote:Op woensdag 7 december 2011 14:28 schreef GlowMouse het volgende:
Ook de map voor je language file absoluut instellen dan maar. Of stel DIR_SYSTEM absoluut in.
Verander /index\.php eens naar /index.phpquote:Op woensdag 7 december 2011 15:37 schreef cablegunmaster het volgende:
URL: /producten/303/45/
Resultaat: index.php?page=producten&gid=303&product=45
RewriteRule ^/?producten/(.*)/?(.*)/$ /index\.php?page=producten&gid=$1&product=$2 [L]
Alleen klopt dit niet, en ik zie niet wat. ik heb geprobeerd met een regex pattern checker:
Te kijken of de regex overeen kwam met de url: http://regexpal.com/
maar hij wil de URL niet in Resultaat veranderen.
1 | RewriteRule ^producten/(.*)/(.*)/$ /index.php?page=producten&gid=$1&product=$2 [L] |
Dat zal hem wel zijn. hoe kan ik dat voorkomen?quote:Op woensdag 7 december 2011 15:42 schreef GlowMouse het volgende:
^/?producten/(.*)/?(.*)/$
Die eerste .* kan nu 303/45 matchen
Dankje . zag hem net staan en had het ook net zo gedaan en dat werktequote:Op woensdag 7 december 2011 15:40 schreef mstx het volgende:
[..]
Verander /index\.php eens naar /index.php
Of probeer het anders eens zo:
[ code verwijderd ]
1 2 3 4 5 6 | <?php $videoplayer->setSource('http://blabla.mpg'); $videoplayer->setDimensions($x, $y); $videoplayer->etc; $videoplayer->start(); ?> |
Heeft vrij weinig met PHP te maken gezien dit uiteindelijk met HTML moet worden opgelost, PHP is slechts een serverside taal, die kan zoiets niet. Dit zou dan een soort wrapper worden die uiteindelijk ook een HTML oplossing moet gebruiken.quote:Op donderdag 8 december 2011 02:20 schreef Diabox het volgende:
Weet iemand of het volgende al bestaat:
Ik zoek iets waarmee ik heel simpel 'n video bestand kan embedden op 'n pagina, dat ik het als volgt ongeveer kan aanroepen:
[ code verwijderd ]
Oid. Wil geen poespas admin panel of wat dan ook erbij. Wil puur en alleen in m'n php bestand alles kunnen setten, en dat ie vervolgens het embed in m'n div
In welk topic hoort dit precies thuis?
Ik weet wat PHP is ik zit bij je in de klas rememberquote:Op donderdag 8 december 2011 02:23 schreef Luchtkoker het volgende:
[..]
Heeft vrij weinig met PHP te maken gezien dit uiteindelijk met HTML moet worden opgelost, PHP is slechts een serverside taal, die kan zoiets niet. Dit zou dan een soort wrapper worden die uiteindelijk ook een HTML oplossing moet gebruiken.
1 2 3 4 | <?php $controlegetal = 10112310549223002232100; $controlegetal = 98 - ($controlegetal % 97); //een echo hierna geeft 20 ?> |
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 | <?php function controleer_iban($iban) { $iban = str_replace(array(" ", " ", " ", "\t"), "", $iban); $iban = strtoupper(str_replace(" ", "", $iban)); if(strlen($iban)>34) return false; $acceptabel = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0"; $acceptabel = explode(" ", $acceptabel); for($i = 0; $i<strlen($iban); $i++) { if(in_array(substr($iban, $i, 1), $acceptabel) === false) return false; } $alfa = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"; $alfa = explode(" ", $alfa); for($i = 1; $i<27; $i++) { $alfa_replace[] = $i+9; } $controlegetal = str_replace($alfa, $alfa_replace, substr($iban, 4, strlen($iban)-4).substr($iban, 0, 2)."00"); $controlegetal = 98 - (int)bcmod($controlegetal,97); if((int)$controlegetal === (int)substr($iban, 2, 2)) return true; else return false; } ?> |
1 2 3 4 | <?php $a = 182316110001234567232100; var_dump($a); ?> |
Ik krijg inderdaadquote:Op donderdag 8 december 2011 12:14 schreef GlowMouse het volgende:
Het probleem is dat als jij 182316110001234567232100 invoert, er niet als 182316110001234567232100 mee wordt gerekend. Doe dit maar eens:
[ code verwijderd ]
Wat je kunt doen zonder bcmod, is het getal als string opslaan en dan zelf een staartdeling uitvoeren.
1 2 3 | <?php string(24) "101123100549223002232100" ?> |
1 2 3 | <?php 9.5086309658297E+16 ?> |
Het is niet dat ik er bang voor ben, maar dit is dan veel makkelijkerquote:Op donderdag 8 december 2011 12:23 schreef GlowMouse het volgende:
Mensen die bang zijn van een staartdeling.
quote:These functions are only available if PHP was configured with --enable-bcmath
Ik krijg trouwens als type float terug, ligt dat aan het feit dat ik 64bit OS heb ?quote:Op donderdag 8 december 2011 12:14 schreef GlowMouse het volgende:
Het probleem is dat als jij 182316110001234567232100 invoert, er niet als 182316110001234567232100 mee wordt gerekend. Doe dit maar eens:
[ code verwijderd ]
Wat je kunt doen zonder bcmod, is het getal als string opslaan en dan zelf een staartdeling uitvoeren.
Nee, dat komt omdat het getal groter is dan PHP_INT_MAX.quote:Op donderdag 8 december 2011 18:38 schreef Pakspul het volgende:
[..]
Ik krijg trouwens als type float terug, ligt dat aan het feit dat ik 64bit OS heb ?
Anyway het is "opgelost". In ieder geval de functie werkt. PHP is opnieuw compiled met bc_math supportquote:Op donderdag 8 december 2011 19:06 schreef Light het volgende:
[..]
Nee, dat komt omdat het getal groter is dan PHP_INT_MAX.
1 2 3 4 5 6 | N_ID | CALLING_CARD_NO | CALLED_FROM | START_TIMESTAMP | END_TIMESTAMP 1 | 0123 | BOSTON | 1230000 | 1230020 2 | 0123 | BOSTON | 1230040 | 1230060 3 | 0123 | CHINA | 1230080 | 1230100 4 | 0123 | NETHERLANDS | 1245000 | 1245010 5 | 0124 | TAIWAN | 1230000 | 1230100 |
Als er een foreign key op acc_id moet, moet je de tabel users wijzigen.quote:Op maandag 12 december 2011 11:43 schreef cablegunmaster het volgende:
SQL-query:
ALTER TABLE `accounts` ADD FOREIGN KEY ( `id` ) REFERENCES `DB_NAME`.`users` (
`acc_id`
) ON DELETE CASCADE ON UPDATE RESTRICT ;
MySQL retourneerde: Documentatie
#1452 - Cannot add or update a child row: a foreign key constraint fails (`DB_NAME`.<result 2 when explaining filename '#sql-419_1bae51'>, CONSTRAINT `#sql-419_1bae51_ibfk_1` FOREIGN KEY (`id`) REFERENCES `users` (`acc_id`) ON DELETE CASCADE)
Hoe kan ik dit oplossen?
Wat ik wou doen was een Foreign key op een acc_id uit users zetten. en op Accounts als ik daar 1 verwijderde dat uit accounts een corresponderend ID verdween. Alleen krijg ik opeens deze melding. Uit google wordt ik niet veel wijzer. beide tabellen hebben een InnoDB engine.
1 2 | ALTER TABLE `users` ADD FOREIGN KEY (`acc_id`) REFERENCES `accounts` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; |
Zoiets, denk ik.quote:Op zondag 11 december 2011 11:24 schreef ViPeRII het volgende:
Hulp gezocht met een query!
Ik heb mijn gegevens in 1 tabel zitten, en daar wil ik een vergelijking op loslaten.
Tabel: Card
Velden: N_ID, CALLING_CARD_NO, CALLED_FROM, START_TIMESTAMP, END_TIMESTAMP
nu wil ik een selectie maken, waarbij ik per CALLING_CARD kijk, of de CALLED_FROM veranderd is, binnen een bepaalde tijd (zeg 2 uur). Maar ik kom totaal niet uit mijn query
Hij moet dus zichzelf gaan itereren, maar als ik dat doe, krijg ik meer resultaten terug dan dat er rijen in mijn tabel zitten.
[ code verwijderd ]
Waarbij dan dus rij 2 + 3 geselecteerd zouden moeten worden, maar niet 4 omdat die dan buitend mijn zoekgebied valt (buiten de 2 uur), en 2 + 3 eigenlijk om dat ik de resultaten meteen wil hebben, maar als ik het ID bijvoorbeeld heb van 3 omdat die foutief is, denk ik dat ik er ook nog wel uit kan komen. Wie kan mij helpen?
Ik was begonnen met:
SELECT n1.*, n2.* FROM card n1 JOIN card n2 ON n1.CALLING_CARD_NO = n2.CALLING_CARD_NO WHERE n1.N_ID <> n2.N_ID AND n1.CALLED_FROM <> n2.CALLED_FROM
Maar ook dat levert al meer resultaten op dan dat er rijen in mijn tabel zitten :S
1 2 3 4 5 6 7 8 9 10 | SELECT n1 . * , n2 . * FROM card n1 INNER JOIN card n2 ON n1.calling_card_no = n2.calling_card_no WHERE n1.called_from <> n2.called_from AND n2.id = ( SELECT min( id ) FROM card n WHERE n.id > n1.id AND n.calling_card_no = n1.calling_card_no ) |
Ik krijg dezelfde foutmelding met jou query , ik probeer dit simpelweg met phpmyadmin uit te voeren en ik word er niet wijzer van. na 3 pagina's google doorzoeken op deze melding.quote:Op maandag 12 december 2011 21:46 schreef Light het volgende:
[..]
Als er een foreign key op acc_id moet, moet je de tabel users wijzigen.
[ code verwijderd ]
Bevatten de tabellen al data? En zijn de kolommen wel gelijk?quote:Op dinsdag 13 december 2011 01:15 schreef cablegunmaster het volgende:
[..]
Ik krijg dezelfde foutmelding met jou query , ik probeer dit simpelweg met phpmyadmin uit te voeren en ik word er niet wijzer van. na 3 pagina's google doorzoeken op deze melding.
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT table_schema, table_name, column_name, column_type FROM information_schema.columns WHERE table_schema='db_name' AND ( ( table_name = 'users' AND column_name = 'acc_id' ) OR ( table_name = 'accounts' AND column_name = 'id' ) ) |
1 2 3 4 5 6 | SELECT product.*, count(order_content.ProductID) as productcount FROM product, order_content WHERE product.ID = order_content.ProductID GROUP BY product.ID ORDER BY productcount LIMIT 0, 10 |
Gebruik je in products zowel NULL als 0 om aan te geven dat een product niet actief is? Is het niet handiger om daar 1 oplossing voor te kiezen, altijd 0 bij inactief en 1 bij actief?quote:Op dinsdag 13 december 2011 21:22 schreef Swetsenegger het volgende:
Simpele vraag, ik een tabel (order_content) waar in elke row, naast andere gegevens, een product ID staat. En dit is een gekocht produkt.
In een andere tabel (products) staat of een product actief is (NOT NULL or <>0)
Nu wil ik een top 10 van de meest verkochte produkten die nog actief zijn. Kan iemand me even op weg helpen met de query(ies)?
idd, gebruik Tinyant(1) als boolean.quote:Op dinsdag 13 december 2011 21:41 schreef Light het volgende:
[..]
Gebruik je in products zowel NULL als 0 om aan te geven dat een product niet actief is? Is het niet handiger om daar 1 oplossing voor te kiezen, altijd 0 bij inactief en 1 bij actief?
Kleine mier?quote:Op dinsdag 13 december 2011 21:43 schreef Pakspul het volgende:
[..]
idd, gebruik Tinyant(1) als boolean.
Het heeft een geschiedenisquote:Op dinsdag 13 december 2011 21:41 schreef Light het volgende:
[..]
Gebruik je in products zowel NULL als 0 om aan te geven dat een product niet actief is? Is het niet handiger om daar 1 oplossing voor te kiezen, altijd 0 bij inactief en 1 bij actief?
Echt, als het zo eenvoudig was had ik het gedaan . De table aanpassen is het minste van mijn zorg. Het cms aanpassen om die wijziging door te voeren is een groter probleem.quote:
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 48 49 50 | <?php define('TIMEDHASH_MAX_TIME_SECONDS', 1); define('TIMEDHASH_ALGORITHM', 'sha256'); function get_timedhash($str) { $start_time = microtime(true); $end_time = $start_time+TIMEDHASH_MAX_TIME_SECONDS; $a= 0; $new_str = $str; while(microtime(true) < $end_time) { $new_str = hash(TIMEDHASH_ALGORITHM, $new_str.$a); $a++; } return $new_str; } function match_timedhash($hash,$str) { $max_time_seconds = TIMEDHASH_MAX_TIME_SECONDS*1.5; $start_time = microtime(true); $end_time = $start_time+$max_time_seconds; $a= 0; $new_str = $str; while(microtime(true) < $end_time) { $new_str = hash(TIMEDHASH_ALGORITHM, $new_str.$a); if ($new_str == $hash) return true; $a++; } return false; } echo $hash = get_timedhash('test'); echo ' '; var_dump(match_timedhash($hash, 'test')); die(); ?> |
Nou dan heb je de juiste variabelen nodig lijkt mij als ik het zo 1-2-3 lees.quote:Op woensdag 14 december 2011 20:29 schreef Faux. het volgende:
Hoe kan ik met PHP bij een pagina komen die beveiligd is met HTTP 401?
Nee. Ik probeer nu een cURL-oplossing die ik ergens op internet gevonden heb. Even testenquote:Op woensdag 14 december 2011 20:54 schreef cablegunmaster het volgende:
[..]
Nou dan heb je de juiste variabelen nodig lijkt mij als ik het zo 1-2-3 lees.
Is de pagina van jezelf?
En anders kan het ook door een header mee te sturen, zie: http://www.electrictoolbo(...)g-username-password/quote:Op woensdag 14 december 2011 20:58 schreef Faux. het volgende:
[..]
Nee. Ik probeer nu een cURL-oplossing die ik ergens op internet gevonden heb. Even testen
Dank je voor je bijdrage, maar de cURL-oplossing werktequote:Op woensdag 14 december 2011 21:27 schreef The_Terminator het volgende:
[..]
En anders kan het ook door een header mee te sturen, zie: http://www.electrictoolbo(...)g-username-password/
Waarom gebruik je niet gewoon http://php.net/manual/en/function.crypt.php ? SHA-512 encryptie? In combinatie met afdwingen van lange wachtwoorden die sterk moeten zijn (meer dan acht symbolen lang en moet volgende bezitten: hoofdletters, kleine letters, cijfers en mogelijk symbolen) dan heb je redelijke garantie dat wanneer ze het wachtwoord hebben ze deze de eerste tijd niet zullen kraken.quote:Op woensdag 14 december 2011 01:30 schreef wipes66 het volgende:
Ik zocht een goede manier om wachtwoorden op te slaan. Van vinden jullie van deze methode? Hashen gebaseerd op tijd... md5 doet het 0,3 miljoen keer bij mij
[ code verwijderd ]
En zorg voor een goede, lange salt zodat je ook geen last hebt van rainbow table attacks. Want een wachtwoord als "Secret1234!" voldoet aan je eisen maar staat vast wel in wat rainbow tabellen.quote:Op donderdag 15 december 2011 08:20 schreef Pakspul het volgende:
[..]
Waarom gebruik je niet gewoon http://php.net/manual/en/function.crypt.php ? SHA-512 encryptie? In combinatie met afdwingen van lange wachtwoorden die sterk moeten zijn (meer dan acht symbolen lang en moet volgende bezitten: hoofdletters, kleine letters, cijfers en mogelijk symbolen) dan heb je redelijke garantie dat wanneer ze het wachtwoord hebben ze deze de eerste tijd niet zullen kraken.
Altijd met salts gaan werken.quote:Op woensdag 14 december 2011 01:30 schreef wipes66 het volgende:
Ik zocht een goede manier om wachtwoorden op te slaan. Van vinden jullie van deze methode? Hashen gebaseerd op tijd... md5 doet het 0,3 miljoen keer bij mij
[ code verwijderd ]
Dit werkt met wat aanpassingen perfect:quote:Op dinsdag 13 december 2011 21:37 schreef Pakspul het volgende:
[ code verwijderd ]
Zoiets Haalt alle product informatie op en geeft als extratje nog mee het aantal keren dat product is verkocht (voorkomt in order_content)
Je moet zelf evens in de WHERE de AND product.active = ja NOT NULL, weet niet precies hoe je het hebt.
1 2 3 4 5 6 | SELECT produkten.*, count(order_content.product_id) as productcount FROM produkten, order_content WHERE produkten.product_id = order_content.product_id AND produkten.product_menu IS NOT NULL AND produkten.product_menu<>0 GROUP BY produkten.product_id ORDER BY productcount DESC LIMIT 0, 10 |
1 2 | WHERE orders between order_date ('2010/01/01', 'yyyy/mm/dd') AND order_date ('2010/12/31', 'yyyy/mm/dd'); |
1 2 3 4 5 6 7 8 | SELECT produkten.*, count(order_content.product_id) as productcount FROM produkten, order_content WHERE produkten.product_id = order_content.product_id AND produkten.product_menu IS NOT NULL AND orders between order_date ('2010/01/01', 'yyyy/mm/dd') AND order_date ('2010/12/31', 'yyyy/mm/dd') AND produkten.product_menu<>0 GROUP BY produkten.product_id ORDER BY productcount DESC LIMIT 0, 10 |
Ik vind het altijd vervelend als een site mij afdwingt wat ik wel en niet in mijn wachtwoord mag hebben. Met een goede salt (en de eis dat het wachtwoord niet leeg mag zijn) moet je een heel eind kunnen komen. Je kunt de salt (of een deel van de salt) ook afhankelijk maken van het id van de user.quote:Op donderdag 15 december 2011 08:20 schreef Pakspul het volgende:
[..]
Waarom gebruik je niet gewoon http://php.net/manual/en/function.crypt.php ? SHA-512 encryptie? In combinatie met afdwingen van lange wachtwoorden die sterk moeten zijn (meer dan acht symbolen lang en moet volgende bezitten: hoofdletters, kleine letters, cijfers en mogelijk symbolen) dan heb je redelijke garantie dat wanneer ze het wachtwoord hebben ze deze de eerste tijd niet zullen kraken.
Klinkt alsof je een index moet toevoegen aan de tabel. Met EXPLAIN SELECT kun je zien hoe MySQL de query wil uitvoeren (en dat geeft ook informatie over waarom het zo lang duurt).quote:Op donderdag 15 december 2011 19:54 schreef Swetsenegger het volgende:
Met wat aanpassingen lijkt het te werken, alleen duurt de query 59 seconden
Ik ga even verder knutselen. Misschien is het handiger als ik met subqueries ga werken? Dat ik eerst alle ordercontent van 2011 eruit trek en met die resultset de count query doe.
quote:Op donderdag 15 december 2011 22:08 schreef Light het volgende:
[..]
Klinkt alsof je een index moet toevoegen aan de tabel. Met EXPLAIN SELECT kun je zien hoe MySQL de query wil uitvoeren (en dat geeft ook informatie over waarom het zo lang duurt).
Ik denk dat er geen index op orders.orderdate staat. Een index daar zal helpen. En verder wat GlowMouse zegt.quote:
ANSI ken ik alleen van BBS systemen, glowmouse ;-) Ik ga er mee aan de slag en hou jullie op de hoogte.quote:Op donderdag 15 december 2011 23:15 schreef GlowMouse het volgende:
Schrijf gewoon COUNT(*), zet een index op order_content.product_id en kijk naar ansi style joins
Dat is inderdaad een goede oplossing Je zou het ook clientside kunnen doen via javascript. Als je wilt inloggen vul je eerst het email adres in. Dat wordt het aantal loops opgehaald dat bij het email adres hoort en vervolgens wordt de boel (e-mail + ww) x aantal keer gehashed en naar de server verstuurd. via deze manier is een challenge response systeem ook mogelijkquote:Op woensdag 14 december 2011 10:13 schreef _Flash_ het volgende:
Ik vind het maar een riskante methode. Kom je niet in de problemen als er bijvoorbeeld meerdere mensen tegelijk willen inloggen, de processorkracht verdeeld wordt over die berekeningen en ze dus allemaal de juiste diepte niet halen? Soort van oplossing is natuurlijk wel om het aantal gebruikte loopjes ook in de tabel op te slaan, dan hoef je niet met die factor anderhalf te werken ;-)
Ik zit met de aanpassingen nog steeds op een query van 57 seconden. Ik heb alleen de ANSI join nog niet gedaanquote:Op vrijdag 16 december 2011 08:34 schreef Swetsenegger het volgende:
[..]
ANSI ken ik alleen van BBS systemen, glowmouse ;-) Ik ga er mee aan de slag en hou jullie op de hoogte.
order_content.product_id had ik ondertussen een index opgezet maar dat helpt niet echt.
Dat hij een manier zoekt om iedereen aan een andere willekeurige persoon te koppelen.quote:
Oh zo. Maak gewoon een resultset op basis van alle id`s van de gebruikers, minus je eigen, en laat hem daar 1tje van kiezen?quote:Op vrijdag 16 december 2011 20:56 schreef Pizzalucht het volgende:
[..]
Dat hij een manier zoekt om iedereen aan een andere willekeurige persoon te koppelen.
Je hebt 5 personen, en iedereen is aan iemand gekoppeld, maar niet aan zichzelf.
Hoe doe je dat het beste, proberen totdat je de goede combi hebt, of is daar een soort algoritme voor.
Dat is zijn vraag.
niet pas trekken als iemand de url aanroept, of bij het een na laatste loodje zorgen dat je niet in een foute situatie komtquote:Op vrijdag 16 december 2011 21:15 schreef das_phantom het volgende:
Ter info. Ik heb iedereen de url gegeven. Iedereen trekt het lootje wanneer diegene wil. De persoon selecteert zijn eigen naam en het systeem bekijkt dan in de database wie er nog in zit, en daaruit kiest hij de naam <> eigen naam. Als er nog maar een naam inzit en die is van diegene zelf, dan gaat het fout.
Wat nou als randomizen van personen dezelfde lijst oplevert als je lijst waar je aan gaat koppelen? Dan krijgt iedereen zichzelfquote:Op vrijdag 16 december 2011 23:33 schreef ErikNijland het volgende:
Oplossing voor dat lootjes trekken.
Zet de personen in een random volgorde. Bijvoorbeeld:
edacb
En elke persoon krijgt de volgende persoon in de array:
e krijgt d
d krijgt a
a krijgt c
c krijgt b
en bij b is er geen volgende daarom krijgt hij de eerste uit de array: e
zo; en nu weekend
Iemand nog een idee?quote:Op vrijdag 16 december 2011 17:47 schreef Swetsenegger het volgende:
[..]
Ik zit met de aanpassingen nog steeds op een query van 57 seconden. Ik heb alleen de ANSI join nog niet gedaan
Het is niet zo dat hij 2 lijsten gaat koppelen. Hij heeft 1 lijst met personen a,b,c,d en e.quote:Op zaterdag 17 december 2011 11:24 schreef Pakspul het volgende:
[..]
Wat nou als randomizen van personen dezelfde lijst oplevert als je lijst waar je aan gaat koppelen? Dan krijgt iedereen zichzelf
Ik zou een functie (class liever) maken die bijhoudt welke personen meedoen, random persoon toewijst aan iemand en daarbij rekening houdt dat het niet persoon is waar die aan toe wordt gewezen.
1 2 3 4 5 6 7 | SELECT produkten.*, count(*) as productcount FROM produkten, order_content JOIN orders on (orders.order_id=order_content.order_id) WHERE produkten.product_id = order_content.product_id AND produkten.product_menu IS NOT NULL AND produkten.product_menu<>0 AND orders.wishlist=0 AND orders.activated=1 AND orders.orderdate between ('2011-01-01 0:0:0') AND ('2012-01-01 0:0:0') GROUP BY produkten.product_id ORDER BY productcount DESC LIMIT 0, 5 |
jajajaquote:Op zaterdag 17 december 2011 19:13 schreef GlowMouse het volgende:
twee join stijlen door elkaar, lelijk hoor
1 2 3 4 5 6 7 8 | SELECT produkten.*, count(*) as productcount FROM order_content JOIN orders on (orders.order_id=order_content.order_id) JOIN produkten on (produkten.product_id=order_content.product_id) WHERE produkten.product_id = order_content.product_id AND produkten.product_menu IS NOT NULL AND produkten.product_menu<>0 AND orders.wishlist=0 AND orders.activated=1 AND orders.orderdate between ('2011-01-01 0:0:0') AND ('2012-01-01 0:0:0') GROUP BY produkten.product_id ORDER BY productcount DESC LIMIT 0, 5 |
Deze query draait in 37ms, mijn eerste zonder ANSI join in 57 seconden.quote:Op zaterdag 17 december 2011 19:34 schreef GlowMouse het volgende:
Je WHERE is nog te uitgebreid. Deze query zou ook niet sneller draaien dan de eerste.
1 2 3 4 5 6 7 8 | SELECT produkten.*, count(*) as productcount FROM order_content JOIN orders on (orders.order_id=order_content.order_id) JOIN produkten on (produkten.product_id=order_content.product_id) WHERE produkten.product_menu IS NOT NULL AND produkten.product_menu<>0 AND orders.wishlist=0 AND orders.activated=1 AND orders.orderdate between ('2011-01-01 0:0:0') AND ('2012-01-01 0:0:0') GROUP BY produkten.product_id ORDER BY productcount DESC LIMIT 0, 5 |
wat bedoel je? Dat de laatste query en de eerste query net zo snel zouden moeten zijn?quote:Op zaterdag 17 december 2011 20:20 schreef GlowMouse het volgende:
De joinvolgorde zal wel gewijzigd zijn, ANSI vs. theta-style heeft geen invloed.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |