1 2 3 4 5 6 7 8 9 10 11 12 13 | include("models/post.php"); class TVP extends Post { public static function makeTvp() { parent::makePost("TVP!"); } } TVP::makeTvp(); ?> |
Whehe, ja. Daar kunnen een hoop mensen de mist in gaan. empty kan ook toch?quote:Op woensdag 18 maart 2009 11:33 schreef Roy_T het volgende:
On topic: ik erger me nog steeds dood aan het feit dat "array() == null" in PHP naar true evalueertJa, ik kan === gebruiken, maar het gaat om het principe. Een lege array is niet "niets", het is een lege array.
1 2 3 4 5 6 7 8 9 10 11 | class TVP extends Post { public TVP() { parent::makePost("TVP!"); } } TVP(); |
Geen geldige constructor in PHP 5, officieel :Pquote:
1 2 3 4 5 6 7 8 9 10 11 | class TVP extends Post { public function __construct() { parent::__construct("TVP!"); } } new TVP(); ?> |
Ja, dat kan. Maar dat is symptoombestreiding: het is gewoon onlogisch om een lege array "null" te vinden.quote:Op woensdag 18 maart 2009 11:52 schreef Scorpie het volgende:
Whehe, ja. Daar kunnen een hoop mensen de mist in gaan. empty kan ook toch?
En een lege array is niks. Je ergert je zeker ook aan het feit dat $var = 0 ook failed met isempty().quote:Op woensdag 18 maart 2009 11:33 schreef Roy_T het volgende:
On topic: ik erger me nog steeds dood aan het feit dat "array() == null" in PHP naar true evalueertJa, ik kan === gebruiken, maar het gaat om het principe. Een lege array is niet "niets", het is een lege array.
Hoezo?quote:Op woensdag 18 maart 2009 12:16 schreef Roy_T het volgende:
[..]
Ja, dat kan. Maar dat is symptoombestreiding: het is gewoon onlogisch om een lege array "null" te vinden.
Er is een array "object" gemaakt, het zou er imo niet toe moeten doen of hier wel of niet iets in staat. Hetzelfde geldt overigens voor een lege string, de integer 0, etc.quote:Op woensdag 18 maart 2009 13:44 schreef slacker_nl het volgende:
Hoezo?
De array heeft wat memory toegewezen gekregen is bevat verder geen enkele waarde, aka NULL.
1 2 3 4 5 6 7 8 9 | feeds.*, feeds_items.* FROM feeds INNER JOIN feeds_items ON feeds_items.feed_id = feeds.id |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ---------------------------------- 1 | bla 1 | Blalala 1 | lalal 1 | blalala 1 | Blalala 1 | Bla 2 | Lalala 2 | Tralala 2 | Lalalala 2 | Joehoe 2 | Bla 2 | Blalala 2 | Blala 3 | Joehoe 3 | Hello 3 | Daag |
1 2 3 4 5 6 7 8 | ---------------------------------- 1 | bla 1 | Blalala 2 | Lalala 2 | Tralala 3 | Joehoe 3 | Hello |
Het is geen object, aangezien ik niet $array->functie() kan aanroepen. Zoals je wel kan met java met String.toLower, python idem. Dat zijn echte objecten.quote:Op woensdag 18 maart 2009 13:52 schreef Roy_T het volgende:
Er is een array "object" gemaakt, het zou er imo niet toe moeten doen of hier wel of niet iets in staat. Hetzelfde geldt overigens voor een lege string, de integer 0, etc.
Noem er eens eentje.quote:Zo onlogisch is mijn denkwijze overigens niet, want in tig andere talen is een lege array niet null, net zo min als een lege string of het getal 0 :)
Perl ziet een lege array ook als false:quote:In PHP is ervoor gekozen om het te doen zoals het gedaan is (PHP is niet de enige taal), maar dat neemt niet weg dat ik het stom, onlogisch en irritant vind :P
1 2 3 4 5 6 7 | if (@array) { print "found something\n"; } else { print "found nothing\n"; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | include_once('sys_db.inc'); $resultaat = mysql_query("SELECT COUNT(*) AS count FROM todo WHERE ". "Soort = 'l' OR Soort = 'v';") or die(mysql_error()); $gegevens = mysql_fetch_assoc($resultaat); $count = $gegevens["count"]; if ($count==0) exit(0); else exit(1); ?> |
Het ligt trouwens niet aan de sys_db.inc want andere programma's waar ik dat in gebruik werken wel zonder problemen. Dus wie o wie kan mij vertellen waarom dit imbeciel simpele programmaatje ervoor zorgt dat PHP constant crasht?quote:$ ./klaar.php
Segmentation fault
$ ./klaar.php
$ ./klaar.php
$ ./klaar.php
$ ./klaar.php
Segmentation fault
$ ./klaar.php
$ ./klaar.php
Segmentation fault
$ ./klaar.php
$ ./klaar.php
Segmentation fault
$ ./klaar.php
$
hmz.. misschien ff een memtest doen?quote:Segmentation fault can also occur under following circumstances:
a) A buggy program / command, which can be only fixed by applying patch.
b) It can also appear when you try to access an array beyond the end of an array under C programming.
c) Inside a chrooted jail this can occur when critical shared libs, config file or /dev/ entry missing.
d) Sometime hardware or faulty memory or driver can also create problem.
e) Maintain suggested environment for all computer equipment (overheating can also generate this problem).
isempty() bestaat niet, empty() en isset() wel.quote:Op woensdag 18 maart 2009 13:30 schreef slacker_nl het volgende:
[..]
En een lege array is niks. Je ergert je zeker ook aan het feit dat $var = 0 ook failed met isempty().
1 2 3 4 5 | $var = 0; var_dump(empty($var)); var_dump(isset($var)); ?> |
Ja, php en z'n naming conventions.. Dat vind ik nou bloedje irritant van php.quote:Op woensdag 18 maart 2009 21:45 schreef Light het volgende:
[..]
isempty() bestaat niet, empty() en isset() wel.
Eensquote:Op donderdag 19 maart 2009 00:15 schreef slacker_nl het volgende:
[..]
Ja, php en z'n naming conventions.. Dat vind ik nou bloedje irritant van php.
Ik ook inderdaadquote:Op donderdag 19 maart 2009 07:59 schreef Tuvai.net het volgende:
Ik heb voor PHP altijd die cheat sheet klaar liggen.Zelfs ik vergeet af en toe (de volgorde van) parameters van functies/methoden, terwijl ik al bijna 10 jaar met PHP werk.
$haystack, $needle. $needle, $haystack.
Note de aanhalingstekens rond "object" in mijn post. Ik weet dat het geen object is in PHP.quote:Op woensdag 18 maart 2009 18:12 schreef slacker_nl het volgende:
Het is geen object, aangezien ik niet $array->functie() kan aanroepen. Zoals je wel kan met java met String.toLower, python idem. Dat zijn echte objecten.
Dat is nog geen reden om er blij mee te zijn toch?quote:Een lege string is emtpy, een 0 is een boolean false waarde, dus het is logisch in een loose typed taal dit als "empty" ziet.
Nou, eentje dan: Ruby.quote:Noem er eens eentje.
Er zit dan ook echt geen lijn inquote:Op donderdag 19 maart 2009 07:59 schreef Tuvai.net het volgende:
Zelfs ik vergeet af en toe (de volgorde van) parameters van functies/methoden, terwijl ik al bijna 10 jaar met PHP werk.
quote:Op donderdag 19 maart 2009 09:00 schreef Catch22- het volgende:
je kan ook eclipse proberen (dat is een beetje als anale sex, daar moet je wel van houden)
Een array is daar net zoals in Java een echt object als ik dit zo lees:quote:Op donderdag 19 maart 2009 08:25 schreef Roy_T het volgende:
Note de aanhalingstekens rond "object" in mijn post. Ik weet dat het geen object is in PHP.
[..]
Dat is nog geen reden om er blij mee te zijn toch?
[quote]
Nou, eentje dan: Ruby.
Ja, dat klopt helemaal. En ik stoor me er dus aan dat dat in PHP niet zo is, omdat je daardoor onlogisch gedrag krijgt. Jij misschien niet, maar er zijn natuurlijk geen argumenten waarom ik dat niet zou mogenquote:Op donderdag 19 maart 2009 14:04 schreef slacker_nl het volgende:
Een array is daar net zoals in Java een echt object als ik dit zo lees:
http://www.techotopia.com/index.php/Understanding_Ruby_Arrays
1 2 3 4 5 6 7 8 | method makeTime(){ $queryTime = 1; $this->time = $queryTime; echo $queryTime; echo $this->time; } ?> |
Probeer eens self:: i.p.v. $this->.quote:Op donderdag 19 maart 2009 15:39 schreef Scorpie het volgende:
Hm. Als ik in een singleton class het volgende doe:
[ code verwijderd ]
Dan krijg ik 1,0 te zien. Moet ik variabelen in een singleton class anders definieren ?
Zal het eens ff proberen.quote:Op donderdag 19 maart 2009 15:53 schreef Tuvai.net het volgende:
[..]
Probeer eens self:: i.p.v. $this->.
Dit lijkt me wel mooier omdat de pagina dan niet opnieuw geladen dient te worden, maar daar heb ik nog minder kaas van gegeten.quote:
quote:Op donderdag 19 maart 2009 15:53 schreef Tuvai.net het volgende:
[..]
Probeer eens self:: i.p.v. $this->.
TCPDF (gebaseerd op FPDF, maar dan met unicode en html-support).quote:Op donderdag 19 maart 2009 23:31 schreef qu63 het volgende:
Hoe kan je nou een PDF-document netjes opmaken dmv PHP? Ik wil een soort van orderbevestiging/facturen systeem maken, waarbij er dus PDF's aangemaakt moeten worden inclusief logo's etc. Welke class is nou het makkelijkst/beste om te gebruiken?
Thanks!quote:Op vrijdag 20 maart 2009 09:17 schreef Tiemie het volgende:
[..]
TCPDF (gebaseerd op FPDF, maar dan met unicode en html-support).
Hm...moet ik eerst constante variable definieren ofzo........quote:Op donderdag 19 maart 2009 22:44 schreef Scorpie het volgende:
[..]
Werkt niet. Heb de hele code hier staan: http://pastebin.com/m37ccfcc0
Database class, extended class MySQL , en dan singleton pattern. Geen idee wat er mis gaat though.
1 2 3 | $sql = "SELECT id, startdate, enddate, eventname, place, country, eventtype, subscribedate, organizer, print FROM agenda ORDER BY startdate ASC, enddate ASC, subscribedate ASC LIMIT 8"; ?> |
Dat moet aan je overige code liggen.quote:Op vrijdag 20 maart 2009 23:04 schreef poepeneesje het volgende:
Iemand enig idee waarom bij onderstaande code de boel niet werkt? Bij het veranderen van de eerst ASC naar DESC toont hij wel iets, maar niet het goede. Het verwijderen van LIMIT of de notatie LIMIT 0,8 geeft ook geen verandering.
[ code verwijderd ]
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | include "./database/mysql-database-connect.php"; $sql = "SELECT id, startdate, enddate, eventname, place, country, eventtype, subscribedate, organizer, print FROM agenda ORDER BY startdate ASC, enddate ASC, subscribedate ASC LIMIT 8"; $query = mysql_query($sql) or die (mysql_error ()); while($request = mysql_fetch_array($query)) { $id = $request["id"]; $startdate = $request["startdate"]; $enddate = $request["enddate"]; $eventname = $request["eventname"]; $place = $request["place"]; $country = $request["country"]; $eventtype = $request["eventtype"]; $subscribedate = $request["subscribedate"]; $organizer = $request["organizer"]; $print = $request["print"]; $startday = date("d", strtotime($startdate)); $startmonth = date("m", strtotime($startdate)); $startyear = date("Y", strtotime($startdate)); $endday = date("d", strtotime($enddate)); $endmonth = date("m", strtotime($enddate)); $endyear = date("Y", strtotime($enddate)); $subscribeday = date("d", strtotime($subscribedate)); $subscribemonth = date("m", strtotime($subscribedate)); $subscribeyear = date("Y", strtotime($subscribedate)); if(($print == 1) && ($enddate >= date("Y-m-d"))) { $year = date("Y"); $nextyear = $year + 1; if(($startyear == $year) && ($endyear == $year)) { if($startmonth < 13) { if($startday == $endday) { if(strlen($eventname) > 45) { $shortEventname = trim(substr($eventname, 0, 42)); echo "<div class=\"date\">$startday/$endmonth/$endyear</div><div class=\"event\">$shortEventname...</div>"; } else { echo "<div class=\"date\">$startday/$endmonth/$endyear</div><div class=\"event\">$eventname</div>"; } } else { if(strlen($eventname) > 45) { $shortEventname = trim(substr($eventname, 0, 42)); echo "<div class=\"date\">$startday-$endday/$endmonth/$endyear</div><div class=\"event\">$shortEventname...</div>"; } else { echo "<div class=\"date\">$startday-$endday/$endmonth/$endyear</div><div class=\"event\">$eventname</div>"; } } } } } } include "./database/mysql-database-disconnect.php"; ?> |
De 8 die je opvraagt voldoen niet aan de IF, klaar. En 'een hele lijst met data' kun je prima met je query filteren.quote:Op vrijdag 20 maart 2009 23:21 schreef poepeneesje het volgende:
Zou met LIMIT gewoon moeten kunnen lijkt mij. Ik zie trouwens ook niet echt iets fout gaan in de IF's...
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 | function getrecords(){ $sql = "SELECT * from SPELERS"; $db = mysql_pconnect('localhost'); if(!db){ echo 'fout: kreeg geen verbinding met de database'; exit; } mysql_select_db('zaalvoetbal'); $result=mysql_query($sql); if (!$result){ echo 'fout: sql statement niet correct'; exit; } return $result; } function queryString ($id,$a,$b,$c,$d){ return htmlspecialchars('spelers_id='.$id.'spelers_voornaam='.$a.'spelers_achternaam='.$b.'spelers_gsm='.$c.'spelers_punten='.$d); } $result = getrecords(); $num_results = mysql_num_rows($result); echo 'aantal records:'.$num_results.'<BR><BR>'."\n"; echo '<table border=1>'; for ($i=0; $i < $num_results;$i++){ $row = mysql_fetch_array($result); $spelers_id = $row['spelers_id']; $spelers_voornaam = $row['spelers_voornaam']; $spelers_achternaam = $row['spelers_achternaam']; $spelers_gsm = $row['spelers_gsm']; $spelers_punten = $row['spelers_punten']; echo '<tr><td>'; echo $spelers_id; echo '</td><td>'; echo $spelers_voornaam; echo '</td><td>'; echo $spelers_achternaam; echo '</td><td>'; echo $spelers_gsm; echo '</td><td>'; echo $spelers_punten; echo '</td><td>'; echo '<a href="spelers_edit.php?'; echo queryString($spelers_id,$spelers_voornaam,$spelers_achternaam,$spelers_gsm,$spelers_punten); echo '">edit</a>'; echo '</td></tr>'."\n"; } echo '</table>'; ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php $spelers_id = $HTTP_GET_VARS['spelers_id']; $spelers_voornaam = $HTTP_GET_VARS['spelers_voornaam']; $spelers_achternaam = $HTTP_GET_VARS['spelers_achternaam']; $spelers_gsm = $HTTP_GET_VARS['spelers_gsm']; $spelers_punten = $HTTP_GET_VARS['spelers_punten']; ?> <?php echo $spelers_voornaam?>; <form method="post" action="spelersUpdateRecord.php"> <input type="hidden" name="spelers_id" value="<?php echo $spelers_id?>"> Voornaam:<br> <input type="Text" name="spelers_voornaam" size=20 value="<?php echo $spelers_voornaam?>"><br><br> achternaam:<br> <input type="Text" name="spelers_achternaam" size=20 value="<?php echo $spelers_achternaam?>"><br><br> gsm:<br> <input type="Text" name="spelers_gsm" size=20 value="<?php echo $spelers_gsm?>"><br><br> punten:<br> <input type="Text" name="spelers_punten" size=20 value="<?php echo $spelers_punten?>"><br><br> <input type="submit" name="bewaren" value="bewaren"> </form> |
ten eerste thx voor de tips! ik ben net begonnen en heb een boek gelezen die (net gekeken) in 2005 is uitgekomen. Ik ga een nieuw boek aanschaffen.quote:Op zondag 22 maart 2009 12:48 schreef GlowMouse het volgende:
1. Je wilt geen verbinding maken met de database in een algemene functie.
2. mysql_pconnect kost lekker veel verbindingen wanneer je veel apache workerthreads hebt.
3. gebruik geen for én mysql_fetch_array($result), maar het kortere while($row = mysql_fetch_array($result)) { }
4. gebruik urlencode
5. gebruik $_GET['varname'] ipv $HTTP_GET_VARS['varname']
6. zoek eens op XSS (cross site scripting)
7. gebruik templates om code en opmaak te scheiden
heb de$HTTP..vervangen door $_GET. Nog steeds wordt in invulvelden de waarde niet gevuld. Weet je waaraan het kan liggen?quote:Op zondag 22 maart 2009 12:48 schreef GlowMouse het volgende:
1. Je wilt geen verbinding maken met de database in een algemene functie.
2. mysql_pconnect kost lekker veel verbindingen wanneer je veel apache workerthreads hebt.
3. gebruik geen for én mysql_fetch_array($result), maar het kortere while($row = mysql_fetch_array($result)) { }
4. gebruik urlencode
5. gebruik $_GET['varname'] ipv $HTTP_GET_VARS['varname']
6. zoek eens op XSS (cross site scripting)
7. gebruik templates om code en opmaak te scheiden
Nee, heb je een linkje?quote:Op zondag 22 maart 2009 13:57 schreef jakees het volgende:
[..]
heb de$HTTP..vervangen door $_GET. Nog steeds wordt in invulvelden de waarde niet gevuld. Weet je waaraan het kan liggen?
nee ik werk alleen lokaal nog. Site is nog niet up zeg maar. Als ik in mijn spelers_edit.phpquote:
1 |
1 |
ik heb een scherm waarin spelers wil wijzigen één voor één. ik selecteer een speler in een scherm waarna ik in het wijzig scherm kom. Ik wil dan dat de waardes van de tabel in de velden gevuld zijn. Dus bij voornaam staat dan al bijvoorbeeld "piet". Deze tekst kan worden overschreven door hetgeen ik intyp in het veld.quote:Op zondag 22 maart 2009 14:05 schreef GlowMouse het volgende:
Puntkomma's moeten sowieso voor de ?> komen. Het statement is 'echo $spelers_voornaam', en dat moet je afsluiten met een puntkomma.
Je post begrijp ik niet.
Dan moet je je variablen vullen door middel van een database query, niet met een GET request.quote:Op zondag 22 maart 2009 15:04 schreef jakees het volgende:
[..]
ik heb een scherm waarin spelers wil wijzigen één voor één. ik selecteer een speler in een scherm waarna ik in het wijzig scherm kom. Ik wil dan dat de waardes van de tabel in de velden gevuld zijn. Dus bij voornaam staat dan al bijvoorbeeld "piet". Deze tekst kan worden overschreven door hetgeen ik intyp in het veld.
<?= $bla ?> werkt prima zonder ; hoor (idem voor het langere <?php echo $bla ?>)quote:Op zondag 22 maart 2009 14:05 schreef GlowMouse het volgende:
en dat moet je afsluiten met een puntkomma.
Eensch. Daarnaast zou een topic voor de wat meer onderlegde PHP-ers onder ons geen kwaad kunnen.quote:Op maandag 23 maart 2009 08:39 schreef Roy_T het volgende:
Eens met Catch22. Het is dan wel voor dummies, maar dat wil niet zeggen dat iets van het niveau "ik wil iets, heb gehoord dat het met PHP kan en nu vraag ik jullie om een klant en klaar script" veel bijdraagt.
Eens. De ingewikkeldere vragen zijn leuker dan de 'help, ik heb iets gejat en het werkt niet' vragen.quote:Op maandag 23 maart 2009 08:53 schreef Catch22- het volgende:
naja ik heb persoonlijk geen zin om newbies te helpen die nog niet weten hoe ze een formulier moeten posten en ik denk dat dat voor meer mensen geldt.
Als het leuke vragen zijn die getuigen van iets aan eigen inzet wil ik er best even over nadenken
Niemand verplicht je om vragen te beantwoorden, als jij ergens een vraag ziet waarvan je denkt, dat ga ik niet beantwoorden, doe het vooral ook niet.quote:Op maandag 23 maart 2009 08:53 schreef Catch22- het volgende:
naja ik heb persoonlijk geen zin om newbies te helpen die nog niet weten hoe ze een formulier moeten posten en ik denk dat dat voor meer mensen geldt.
Als het leuke vragen zijn die getuigen van iets aan eigen inzet wil ik er best even over nadenken
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Werknemers ----------- id name [meer info] ------------------ specialiteiten ------------------ werknemer_id specialiteit_naam waarde ------------------ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | werknemers ------------ 1 - Mark 23 - Pieter 45 - Hans 54 - Willem -------------------------------------- specialiteiten -------------------------------------- 1 - OperatingSystems - Windows 1 - OperatingSystems - Linux 1 - ProgrammingLanguages - PHP 23 - OperatingSystems - MAC 23 - ProgrammingLanguages - ASP 45 - ProgrammingLanguages - JavaScript 45 - ProgrammingLanguages - PHP 45 - ProgrammingLanguages - ASP.NET 54 - OperatingSystems - Windows 54 - ProgrammingLanguages - ASP.NET -------------------------------------- |
1 2 3 4 5 | FROM werknemers w, specialiteiten s WHERE w.id = s.werknemer_id AND (s.specialiteit_naam = 'OperatingLanguages' AND s.waarde IN ('Windows', 'Mac')) AND (s.specialiteit_naam = 'ProgrammingLanguages' AND s.waarde IN ('ASP', 'PHP')) |
1 2 3 4 | FROM werknemers w, specialiteiten s WHERE w.id = s.werknemer_id AND (s.specialiteit_naam = 'OperatingLanguages' AND s.waarde IN ('Windows', 'Mac')) |
De namen van de medewerkers die kunnen werken met Windows en MAC én gespecialiseerd zijn in PHP en ASP wil ik er uit halen..quote:Op dinsdag 24 maart 2009 16:08 schreef Tuvai.net het volgende:
Wat moet uitgebreider? Wat wil je precies uit je database laten rollen? Je huidige queries zijn overigens erg slordig, probeer met (LEFT / RIGHT OUTER) JOINs te werken waar het mogelijk is in plaats van 2 hele tabellen leeg te trekken en daar vervolgens een filtering op toe te passen.
Je voorbeeld-data voldoet niet aan je where. Daarom krijg je 0 results.quote:Op dinsdag 24 maart 2009 16:15 schreef markiemark het volgende:
[..]
De namen van de medewerkers die kunnen werken met Windows en MAC én gespecialiseerd zijn in PHP en ASP wil ik er uit halen..
Gaat het werken wanneer ik left/right/inner joins ga gebruiken? Nooit gedaan namelijk...
Thnx! Hier ga ik ff mee aan de slag!quote:Op dinsdag 24 maart 2009 16:19 schreef Tiemie het volgende:
[..]
Je voorbeeld-data voldoet niet aan je where. Daarom krijg je 0 results.
vind zelf onderstaande netter.
[ code verwijderd ]
zie editquote:Op dinsdag 24 maart 2009 16:20 schreef markiemark het volgende:
[..]
Thnx! Hier ga ik ff mee aan de slag!
1 2 3 4 5 6 7 8 | w.Naam FROM medewerkers w RIGHT OUTER JOIN specialiteiten s ON s.werknemer_id = w.id WHERE s.specialiteit_naam = 'OperatingSystems' AND s.waarde = 'Windows' |
1 2 3 4 5 6 7 8 | w.Naam FROM specialiteiten s LEFT OUTER JOIN werknemers w ON w.id = s.werknemer_id WHERE s.specialiteit_naam = 'OperatingSystems' AND s.waarde = 'Windows' |
Dat sowieso. Een specialiteiten tabel, een gebruikers tabel en een koppeltabel tussen die 2 is voldoende, meerdere vermeldingen in die koppeltabel -> meer specialiteiten.quote:Op dinsdag 24 maart 2009 16:33 schreef Catch22- het volgende:
He?
Sla je nu in een aparte tabel een specialiteit op met een id, naam en waarde?
Ik zou dit toch anders oplossen. Het liefst een tussenentiteit (de kans is groot dat je ooit meerdere specialiteiten wil kunnen toekennen aan iemand) of een veld in de werknemer.
quote:Op dinsdag 24 maart 2009 16:39 schreef Catch22- het volgende:
Juist. En het kan nu voor komen dat je bij een entry 'OperatingSystems' hebt, en 'Operating Systems' en 'Opareating systems'. Die zal je niet bijelkaar kunnen rapen.
Dus, normaliseren!
1 2 3 4 5 | FROM fotoboek_comments GROUP BY foto ORDER BY datum DESC LIMIT 0 , 2 |
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.dit ga ik nog even aan de binnekant van mij ogen bekijken
Ik kan niet zien wanneer het plaatje aangepast is helaasquote:Op dinsdag 24 maart 2009 18:44 schreef GlowMouse het volgende:
Kijken wanneer het plaatje voor het laatst is aangepast, en indien lang genog, een ander plaatje tonen?
SELECT distinct(id), date, comment FROM `fotoboek_comments` order by date limit 0,2quote:Op dinsdag 24 maart 2009 18:19 schreef qwox het volgende:
heb een mysql vraagje, je waarschijnelijk simpel maar ik snap het niet
Onderbouwde uitspraak, vooral omdat je z'n datamodel ook zo goed kan achterhalen bij het zien van 1 SQL statement..quote:Op dinsdag 24 maart 2009 18:33 schreef GlowMouse het volgende:
De performance met jouw datamodel is wel om te janken.
Ziet er leuk uit, maar wekt niet. DISTINCT gaat over een rij.quote:Op dinsdag 24 maart 2009 18:48 schreef slacker_nl het volgende:
[..]
SELECT distinct(id), date, comment FROM `fotoboek_comments` order by date limit 0,2
Daar heb ik voor geleerd. Met dit datamodel krijgt hij die query onmogelijk snel tenzij er slechts een beperkt aantal records in de tabel zit.quote:Op dinsdag 24 maart 2009 18:55 schreef slacker_nl het volgende:
[..]
Onderbouwde uitspraak, vooral omdat je z'n datamodel ook zo goed kan achterhalen bij het zien van 1 SQL statement..
Wat bedoel je met een subquery by wherequote:Je wilt reacties waarvan id (of tijd) gelijk is aan het maximum id (of tijd) bij die persoon. Dat kun je in je WHERE zetten met een mooie subquery. De performance met jouw datamodel is wel om te janken.
Je kunt bijvoorbeeld zeggen: WHERE id = (SELECT max(id) FROM fotoboek_comments WHERE ...)quote:Op dinsdag 24 maart 2009 19:06 schreef qwox het volgende:
[..]
Wat bedoel je met een subquery by where
PHP/MySQL?quote:Op dinsdag 24 maart 2009 19:24 schreef Scorpie het volgende:
Welk pattern gebruiken jullie om objecten aan te maken binnen jullie applicatie? Voor domain objecten lijkt mij een DomainObjectFactory class handig, die elke keer 1 instantie van een object retourneert?
Of gebruiken jullie een generieke oplossing voor al jullie objecten?
Ik heb het over design patterns voor mijn project in PHP, zie ook http://www.fluffycat.com/PHP-Design-Patterns, zulke patterns heb ik het over. Wilde eens wat ervaringen polsen.quote:
1. Ik snap even niet.quote:Op dinsdag 24 maart 2009 19:10 schreef GlowMouse het volgende:
[..]
Je kunt bijvoorbeeld zeggen: WHERE id = (SELECT max(id) FROM fotoboek_comments WHERE ...)
Flaccid:
1. Domtree of regex, kies maar
2. Wat is per entry? je wilt van élk record 2 velden? Dat is snel maar je moet geen duizenden records hebben.
3. Zoek eens op xmlHttpRequest, er komt wat JavaScript en PHP bij kijken
Hoezo zou het niet werken? Werkt bij mij anders perfect...quote:Op dinsdag 24 maart 2009 18:59 schreef GlowMouse het volgende:
[..]
Ziet er leuk uit, maar wekt niet. DISTINCT gaat over een rij.
Knappe studiebol ben je dat je aan de hand van 1 table kan zien hoe zijn datamodel eruit ziet. Jij hebt zeker de glazen bol gejat die iedereen mist (zie OP).quote:Daar heb ik voor geleerd. Met dit datamodel krijgt hij die query onmogelijk snel tenzij er slechts een beperkt aantal records in de tabel zit.
Uit nieuwsgierigheid, wat is je query en waar kunnen we het resultaat zien?quote:Op dinsdag 24 maart 2009 19:59 schreef qwox het volgende:
ik heb me probleem weten op de lossen met een subquery, volgens mij is die niet optimaal maar dat maakt niet uit.
Het is een script op de website van een studentenvereniging, ik weet 100% zeker dat er slechtere code te vinden is op die site.
bedankt voor de hulp
thanks, je hebt me op een idee gebracht die ook nog werkt..quote:Op dinsdag 24 maart 2009 18:44 schreef GlowMouse het volgende:
Kijken wanneer het plaatje voor het laatst is aangepast, en indien lang genog, een ander plaatje tonen?
En welk idee is dat?quote:Op dinsdag 24 maart 2009 23:48 schreef bassiedekloon het volgende:
thanks, je hebt me op een idee gebracht die ook nog werkt..
het is niet super maar werkt wel goed![]()
http://dev.mysql.com/doc/refman/5.1/en/select.htmlquote:Op dinsdag 24 maart 2009 19:59 schreef slacker_nl het volgende:
[..]
Hoezo zou het niet werken? Werkt bij mij anders perfect...
Daar heb je geen glazen bol voor nodig. Ik zal je de algemene regel schenken: wanneer je wilt sorteren op kolom A en slechts één A wilt bij iedere unieke waarde uit kolom B (met B ongelijk A) dan kan MySQL die query niet efficiënt uitvoeren.quote:Knappe studiebol ben je dat je aan de hand van 1 table kan zien hoe zijn datamodel eruit ziet. Jij hebt zeker de glazen bol gejat die iedereen mist (zie OP).
Subqueries zie ik ook liever niet, maar die zijn er niet voor niks. Als de functionaliteit van de applicatie iets vereist dat alleen met subqueries op te lossen is, dan kom je er in sommige gevallen niet onderuit.quote:Op woensdag 25 maart 2009 12:36 schreef GlowMouse het volgende:
Daar heb je geen glazen bol voor nodig. Ik zal je de algemene regel schenken: wanneer je wilt sorteren op kolom A en slechts één A wilt bij iedere unieke waarde uit kolom B (met B ongelijk A) dan kan MySQL die query niet efficiënt uitvoeren.
Als je 30k reacties hebt en je query heeft 60+ seconden nodig, dan staan je indices niet goed. Misschien moet je ook de query zelf aanpassen, maar goed geplaatste indices doen heel veel.quote:Op woensdag 25 maart 2009 13:01 schreef GlowMouse het volgende:
Websites moeten snel zijn omdat dat fijn is voor de gebruikeren omdat je server dan meer bezoekers aan kan. Voor je back-end zijn subqueries minder erg en kunnen ze soms leuke statistieken tevoorschijn toveren.
Per geval kun je nadenken wat je het beste kunt doen. Soms valt de query iets te herschrijven. Hier is dat niet mogelijk, dus zul je het resultaat moeten cachen.
Deze query gaat er bij een wat grotere dataset seconden over doen (benchmark: 60+ seconden bij 30k reacties) en dat is onacceptabel. MySQL kan hem slecht cachen omdat de reactietabel vaak geüpdatet wordt. Dus dan moet je applicatie maar helpen.
Je hebt gelijk, subquery met LIMIT en een tweetal indices doet wonderen hier. Blijft een relatief langzame query, maar het is nu te overzien (paar honderdsten van een seconde, afhankelijk van waar de laatste reacties geplaatst zijn).quote:Op woensdag 25 maart 2009 13:12 schreef Tuvai.net het volgende:
Sowieso is je voorbeeld erg overdreven. Op iets eenvoudigs als een reactie-tabel, kun je toch snelle queries draaien waar subqueries in zitten. Sowieso haal je in geval van reacties altijd maar een bepaald aantal op (hee, LIMIT), en zit er in die reactie-tabel een veld dat verwijst naar de bovenliggende tabel (hee, een INDEX
). Als er honderdduizenden records in die reactie tabel zitten dan zal die ietsjes langzamer zijn dan wanneer er maar 10 records in zitten, maar 60+ seconden?
Kom op zeg.
Extra veld in de rubriektabel.quote:Ik geef je eens een ander voorbeeld. Stel je hebt een webshop met rubrieken. Die rubrieken zijn dusdanig opgezet dat je onbeperkt diep child-rubrieken kunt aanmaken onder bestaande rubrieken. Van elke rubriek wil je het actuele aantal producten in diezelfde rubriek en diens onderliggende rubrieken hebben. Hoe zou jij dat oplossen?
Zo 'relatief' langzaam dat de gebruiker er niks van merkt. Ook in geval van honderdduizenden records niet. Die paar milliseconden op zo veel records zijn verwaarloosbaar, vooral als dat de schaalbaarheid, overzichtelijkheid en flexibiliteit van de broncode ten goede doet.quote:Op woensdag 25 maart 2009 13:38 schreef GlowMouse het volgende:
Je hebt gelijk, subquery met LIMIT en een tweetal indices doet wonderen hier. Blijft een relatief langzame query, maar het is nu te overzien (paar honderdsten van een seconde, afhankelijk van waar de laatste reacties geplaatst zijn).
Dus elke keer wanneer een product toegevoegd of verwijdert wordt ga je alle rubrieken (en subrubrieken, en diens subrubrieken, enz) nalopen, het aantal producten in die rubriek (en subrubrieken, en diens subrubrieken) met een COUNT(*) ophalen en die waarde wegschrijven? Waar leg je die functionaliteit en hoe doe je dat dan?quote:Op woensdag 25 maart 2009 13:38 schreef GlowMouse het volgende:
Extra veld in de rubriektabel.
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 | - - A A - - - A A A - - - A A B - - - A A C - - A B - - - A B A - - - A B B - - - A B C - - A C - - - A C A - - - A C B - - - A C C - - A D - - - A D A - - - A D B - - - A D C - - A E - - - A E A - - - A E B - - - A E C - - A F - - - A G A - - - A G B - - - A G C |
1 2 3 4 5 6 7 8 9 | $lines = array("<td>{=test}</td>", "<td>{te=st}</td>", "<td>{test=}</td>"); $regexp = '/(\{)(\w+)?=?(\w+)?(\})/'; foreach ($lines as $v) { print preg_replace($regexp, '\1\2\3\4', $v); } ?> |
Beter bij het updaten dan bij het opvragen. Bij een webwinkel gebeurt dat laatste veel vaker. En als je voor je site die getallen veel nodig hebt, dan ga je denormaliseren. Gebeurt ook veel in fora, bijvoorbeeld de berichtenteller, zie phpbb, zie vbulletin, zie myreact.quote:Op woensdag 25 maart 2009 13:48 schreef Tuvai.net het volgende:
Stel je verwijdert een product in rubriek '- - - A E C', dan zal het productaantal van rubriek '- A' ook actueel moeten worden. Erg veel COUNT(*) query`tjes zeg.
Dan bouw je een knop in waarmee alle tellers opnieuw berekend worden.quote:Wat doe je overigens als een DBA in 'geval van nood' een product via de database moet verwijderen of 'recoveren'?
Nee, maar jouw methode houdt wel in dat je op gigantisch veel plekken in je applicatie herhaaldelijke en overbodige code gaat neer plempen. Je hebt producten die besteld worden (en dus in aantal krimpen), beheermodules waar producten toegevoegd en verwijderd kunnen worden, en tig andere situaties die de aantallen in kwestie beïnvloeden en waar jij dus in je broncode stukjes voor moet gaan plaatsen om die aantallen bij te houden. Nog even afgezien van het feit dat DBA`ers 'in geval van nood' (recovery) of uit pure gemakszucht ook nog wel eens zo je database in gaan om e.e.a. aan te passen, buiten de applicatie om. Ja, je kunt een knopje maken waarmee je wederom wéér letterlijk alles na moet gaan lopen (dus ook de rubrieken die niet ter sprake zijn) en berekenen, maar da's ook niet echt lekker voor daadwerkelijk actuele cijfers (want hoe vaak moet jij deze zware functie niet gaan uitvoeren om je cijfers daadwerlelijk actueel te houden?quote:Op woensdag 25 maart 2009 17:47 schreef GlowMouse het volgende:
Mooie code is niet altijd het criterium.
1 2 3 | $fp = fopen ("online/room101.txt","r+"); ?> |
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 51 52 53 54 55 56 | <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>online</title> <META HTTP-EQUIV="refresh" CONTENT="5"> </head> <body> <? //simple user's online script $ip = $_SERVER['REMOTE_ADDR']; $time = time(); $cutoff = 15; //online cut of time $exists = 0; $users = 0; $user = ""; $fp = fopen ("online/room$_GET['room'].txt","r+"); //if the file exists open it while (!feof($fp)) { $user[] = chop(fgets($fp,65536)); } fseek($fp,0,SEEK_SET); foreach ($user as $line) { list($oldip,$oldtime) = explode('|',$line); if ($oldip == $ip) {$oldtime = $time;$exists = 1;} //check to see if the user is already in the text file if ($time < $oldtime + ($cutoff * 60)) //see if the last time the user visited is past the cut off time { fputs($fp,"$oldip|$oldtime\n"); //write the old data to the text file $users = $users + 1; // add one to the user count } } if ($exists == 0) //if the user isn't in the text file already: { fputs($fp,"$ip|$time\n"); //write the new data to the text file $users = $users + 1; //add one to the user count } fclose ($fp); //close the text file print "$users"; //display the number of users online ?> </body> </html> |
quote:
YES het werktquote:Op woensdag 25 maart 2009 20:46 schreef Roy_T het volgende:
Je code is zo insecure als de pest, maar { en } om $_GET['room'] lost het op
Het is in principe mogelijk met dat script iedere willekeurige tekstfile te lezen. (Het besturingssysteem kan nog wel beperkingen opleggen, maar iemand anders kan die rechten ook weer aanpassen. Daar moet je dus niet op vertrouwen.)quote:Op woensdag 25 maart 2009 20:53 schreef bassiedekloon het volgende:
[..]
YES het werkt![]()
Thnx voor de snelle reactie, maar hoe bedoel je insecure?
Ik hoef daar toch alleen rekening mee te houden als ik een database gebruik?
Die gebruik ik nog niet omdat ik nog niet weet hoe.
Kan. Maar fopen() geeft ook gewoon false terug als het bestand niet bestaat.quote:Op woensdag 25 maart 2009 22:02 schreef Catch22- het volgende:
eerst ff een file_exists op de gevraagde filename doen dus
@ voor de functie aanroep,niet echt een nette oplossing,maar het kan...quote:Op woensdag 25 maart 2009 22:07 schreef Light het volgende:
[..]
Kan. Maar fopen() geeft ook gewoon false terug als het bestand niet bestaat.
1 2 | { spul } |
Ik zal deze vandaag eens testenquote:Op woensdag 25 maart 2009 14:24 schreef slacker_nl het volgende:
Beetje simpele variant, kan volgens mij wel mooier:
[ code verwijderd ]
Ok, cool, werkt goed, maar nu wil ik mijn zoekopdracht meer specificeren, dus: mensen die gespecialiseerd zijn in operating system windows of mac en in programming language PHP of ASP.quote:Op dinsdag 24 maart 2009 16:22 schreef Tuvai.net het volgende:
Voorbeeldje om namen op te halen van mensen die gespecialiseerd zijn in OperatingSystem Windows:
[ code verwijderd ]
OF
[ code verwijderd ]
Kort samengevat: Met een LEFT OUTER JOIN ga je vanuit de 'diepere' tabel werken, met RIGHT OUTER JOIN ga je vanuit de bovenliggende tabel werken. Voor de rest is het in jouw geval simpelweg met de WHERE clausule spelen om de goede filtering toe te passen.
1 2 3 4 5 6 7 8 9 10 11 12 | w.name FROM werknemer w RIGHT OUTER JOIN specialiteiten s ON s.werknemer_id = w.id WHERE s.specialiteit_naam = 'OperatingSystems' AND s.waarde IN ('MAC', 'Windows') AND s.specialiteit_naam = 'ProgrammingLanguage' AND s.waarde IN ('PHP', 'ASP') ; |
Dan zul je toch e.e.a. met de WHERE clausule moeten goochelen, je statements met AND / OR aanvullen en eventueel in aparte 'blokjes' zetten, voorbeeld:quote:Op donderdag 26 maart 2009 10:27 schreef markiemark het volgende:
[..]
Ok, cool, werkt goed, maar nu wil ik mijn zoekopdracht meer specificeren, dus: mensen die gespecialiseerd zijn in operating system windows of mac en in programming language PHP of ASP.
[ code verwijderd ]
Hoe doe ik dat dan?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | w.name FROM werknemer w RIGHT OUTER JOIN specialiteiten s ON s.werknemer_id = w.id WHERE ( s.specialiteit_naam = 'OperatingSystems' AND ( s.waarde = 'MAC' OR s.waarde = 'Windows' ) ) AND ( s.specialiteit_naam = 'ProgrammingLanguage' AND ( s.waarde = 'PHP' OR s.waarde = 'ASP' ) ) |
quote:Op donderdag 26 maart 2009 10:52 schreef Tuvai.net het volgende:
[..]
Dan zul je toch e.e.a. met de WHERE clausule moeten goochelen, je statements met AND / OR aanvullen en eventueel in aparte 'blokjes' zetten, voorbeeld:
[ code verwijderd ]
1 2 3 4 5 6 7 8 9 10 11 12 | w.name FROM werknemer w RIGHT OUTER JOIN specialiteiten s ON s.werknemer_id = w.id WHERE ( s.specialiteit_naam = 'OperatingSystems' AND ( s.waarde = 'MAC' OR s.waarde = 'Windows' ) ) |
Kun je een tipje van de sluier oplichten wat betreft subqueries?quote:Op donderdag 26 maart 2009 11:27 schreef Tuvai.net het volgende:
EDIT: Ah klopt, ik had er even geen rekening mee gehouden dat het over een one-to-many tabel ging.Je selecteert in dit geval immers elke keer een losse 'specialiteiten' record. Je zult vrees ik toch e.e.a. met subqueries moeten doen.
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 | w.naam FROM werknemer w WHERE ( SELECT COUNT(*) FROM specialiteiten s WHERE s.werknemer_id = w.id AND s.specialiteit_naam = 'OperatingSystems' AND s.waarde IN ('MAC', 'Windows') ) > 0 AND ( SELECT COUNT(*) FROM specialiteiten s WHERE s.werknemer_id = w.id AND s.specialiteit_naam = 'ProgrammingLanguages' AND s.waarde IN ('PHP', 'ASP') ) > 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | w.naam FROM werknemer w WHERE ( SELECT COUNT(*) FROM specialiteiten s WHERE s.werknemer_id = w.id AND ( (s.specialiteit_naam = 'OperatingSystems' AND s.waarde IN ('MAC', 'Windows')) OR (s.specialiteit_naam = 'ProgrammingLanguages' AND s.waarde IN ('PHP', 'ASP')) ) ) = 2 |
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 | <FORM METHOD="post" ACTION="mail.php"> <INPUT TYPE="hidden" NAME="to" VALUE="naam@domein.com"> <p> <INPUT TYPE="hidden" NAME="subject" VALUE="Voorbeeldformulier Handleiding HTML"> <strong>Naam*:</strong> <br><INPUT NAME="name" SIZE="45"> <br><strong>E-mail adres*:</strong> <br><INPUT NAME="email" SIZE="45"> <br><strong>Telefoonnummer*:</strong> <br><INPUT NAME="phone" SIZE="45"> <br><strong>Bericht/vraag:</strong> <br><INPUT TYPE="hidden" NAME="required_fields" VALUE="name, from, phone"> <TEXTAREA NAME="message" ROWS="3" COLS="45"></TEXTAREA> <br> <img class="rde_img_smiley" src="http://i.fok.nl/s/shiny.gif" width="15" height="15" alt="" /> svp invullen <br><br> <INPUT TYPE="reset" VALUE="Verwijder invoer"> <INPUT TYPE="submit" VALUE="Verzend gegevens"> </p> </FORM> ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | $name=$_POST['name']; $email=$_POST['email']; $phone=$_POST['phone']; $message=$_POST['message']; $ToEmail = "naam@domein.com"; $ToSubject = "Contact Form from domein.com"; $EmailBody = "Name: $name\n Email: $email\n Phone: $phone\n Message: $message\n"; $Message = $EmailBody; $headers .= "Content-type: text; charset=iso-8859-1\r\n"; $headers .= "From:".$email."\r\n"; mail($ToEmail,$ToSubject,$Message, $headers); header( "Location: contact2.html" ); ?> |
EDIT: snap hem al...quote:Op donderdag 26 maart 2009 12:13 schreef SuperRembo het volgende:
Die kan je ook samenvoegen:
[ code verwijderd ]
Ik denk dat er niet veel regels zijn waarbij specialiteit_naam = 'OperatingSystems' en specialiteit_naam = 'ProgrammingLanguages' is.quote:Op donderdag 26 maart 2009 13:05 schreef markiemark het volgende:
[..]
Kan ik daar ook dit van maken?
[ code verwijderd ]
* AND ipv OR
Hehe nee ik snap hem al..quote:Op donderdag 26 maart 2009 13:26 schreef SuperRembo het volgende:
[..]
Ik denk dat er niet veel regels zijn waarbij specialiteit_naam = 'OperatingSystems' en specialiteit_naam = 'ProgrammingLanguages' is.
Ik heb hem gelimit op 5, en dat duurt 6 seconden... Hoe kan dat?quote:Op donderdag 26 maart 2009 13:27 schreef markiemark het volgende:
[..]
Hehe nee ik snap hem al..
Je geeft denk ik een goede oplossing voor mij, maar mijn mysql server lijkt het niet te slikken...
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |