[alg] Slechtste programmeervoorbeelden deel 4 Vorige deel Overzicht Laatste deel

Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.

Pagina: 1 ... 20 ... 103 Laatste
Acties:
  • 993.603 views

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 09:07

MueR

Admin Tweakers Discord

is niet lief

Woy schreef op dinsdag 15 december 2009 @ 13:31:
Via een post stuur je x gegevens naar de bank. Bijvoorbeeld DoelRekening/DoelRekeningHouder/Bedrag, om die gegevens te controleren tegen wijziging stuur je ook een op de server gegenereerde Hash( DoelRekening + DoelRekeningHouder + Bedrag + PrivateKey ( Alleen bij de bank en bij jou bekend ) ) mee. De bank weet al die gegevens, jij weet al die gegevens, en voor de rest niemand. Daar kun je toch perfect op valideren?
Klopt als een bus, muv de rekeningen, want die weet je niet met iDeal. Echter, wat ik dus in de huidige iDeal implementatie van $klant tegenkom is:
HTML:
1
2
3
4
<!-- Letterlijke, hardcoded html ipv feitelijke hash ter controle -->
<INPUT type="hidden" NAME="SHASign" VALUE="<fill here your signature>">
<!-- Hoi preshared key -->
<INPUT type="hidden" NAME="PSPID" value="***removed***">

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
De doel-rekening weet je als het goed is toch wel. Je weet alleen niet wat de rekening van de persoon die het overmaakt is. Maar waar het geld heen moet is wel gewoon bekend.

Maar het ging dus over het feit dat er geen hash stond. Dan heb je natuurlijk groot gelijk. Maar het lijkt me ook dat je dan geen enkele iDeal betaling kunt doen. Die zal hem immers af moeten keuren als er geen geldige hash is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Nu online
Of het het slechste voorbeeld is, tsja.. maar waarom die if-statements zo onlogisch verpakken.

code:
1
2
3
4
5
6
if (len && len > 0) 
      ret = len === 1 ? "1 task" : "%@ tasks".fmt(len);
else
      ret = "No tasks";
  
return ret;


Of hoe ik het zou doen:

code:
1
2
3
4
5
6
if(len == 0) 
    return 'No tasks';
if(len == 1)
    return '1 Task';
else
    return len + ' Tasks';


Vind ik imho toch een stuk duidelijker.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Omdat sommige mensen koste wat kost slechts 1 return in hun method willen hebben. Ben ik zelf ook geen voorstander van maar ik houd het wel zo laag mogelijk (eigenlijk alleen guard clauses).

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 18:10

BM

Moderator Spielerij
Heb wel eens ergens gewerkt waar zelfs die guard clauses eigenlijk niet mochten. Kun je de boel weer gaan omschrijven naar wat onleesbaars omdat ze per se maar 1 return statement willen. Was sowieso beetje vreemde kerel, die het volgens mij niet zo op externen had, maar goed. Wat ie er nu daadwerkelijk op tegen had is me nog steeds niet bekend.

Vind 2e voorbeeld ook stukken duidelijker, en vriendelijker voor degene die het later mag gaan onderhouden.

[ Voor 20% gewijzigd door BM op 15-12-2009 16:17 ]

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Meerdere returns vindt ik vanuit een performance aspect wel goed. En als je functie te groot is dat je de return punten niet meer kunt overzien, heb je wel andere problemen dan meerdere returns.

code:
1
2
3
4
for (zoekding in zoektermen)
  if zoekding = dingdatikzoek
    return dingdatikzoek
end for


versus
code:
1
2
3
4
5
6
7
8
mijnvar = null
for (zoekding in zoektermen)
  if zoekding == dingdatikzoek then
    mijnvar = zoekding
    break
  end if
end for
return mijnvar


gelijk returnen heb je geen lokale var met een levensduur van 0.0001 seconde, dus, 0.0001 seconde winst!

code:
1
2
3
if(len == 0) 
    return 'No tasks';
return len + ' Task' + (len == 1) ? 's' : '';


is ook een optie. Als de eerste if true is, wordt de else overbodig daar de functie exit bij een return. Een else is wel wat beschrijvender misschien.

code:
1
return ((len == 0) ? 'No' : len) + ' Task' + (len <= 1) ? 's' : '';


als we toch bezig zijn om vage code te schrijven.

[ Voor 8% gewijzigd door YopY op 15-12-2009 16:30 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:08

Haan

dotnetter

Onderstaande stukje code een stukje vereenvoudigd en ingekort (ging om acht labels waarbij de waarde gezet wordt door een andere functie)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string label1 = "label1";
string label2 = "label2";
string label3 = "label3";
// etc tm 8

StringBuilder builder = new StringBuilder();
string value = string.Empty;
for (int i = 1; i <= 8; i++)
{
    if (i == 1) { value = label1; }
    if (i == 2) { value = label2; }
    if (i == 3) { value = label3; }
    // etc tm 8

    if (!string.IsNullOrEmpty(value))
    {
        builder.AppendFormat("{0}", value);
    }   
}

:'(

En als klap op de vuurpijl komt exact dezelfde code op nog 5 plekken in het project voor, hoezo OO programmeren :P

[ Voor 8% gewijzigd door Haan op 15-12-2009 16:52 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
YopY schreef op dinsdag 15 december 2009 @ 16:25:
gelijk returnen heb je geen lokale var met een levensduur van 0.0001 seconde, dus, 0.0001 seconde winst!
Dat argument gaat echter niet op. Het betekent niet dat als jij geen variabele ziet dat er onderwater geen geheugen voor gebruikt word. De waarde zal alsnog ergens opgeslagen/bewaard moeten worden. Dus stellen dat je 0.0001 seconde winst hebt is wat overdreven.

Daarbij wil ik niet zeggen dat er geen winst kan zijn door voortijdig te returnen, maar dat is waarschijnlijk niet zozeer doordat je een variabele minder declareert.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 11:12
Vandaag alweer wat leuks gevonden in de code van een klasgenoot:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
echo "/* Het script is begonnen */"; //Hij dacht dus echt dat dit dan commentaar was wat niet te zien was als je de pagina bekeek

mysql_connect("localhost", "test", "");
mysql_select_db("test");
$query = mysql_query("SELECT * FROM tester WHERE naam = script"); //Waarom zou de query failen ^^
echo $query;

echo "/* Het einde van script 'test.php' */";
?>

En dan keek die gek op dat het script niet werkte, hij had de hele MySQL / PHP handleidingen al nagezocht, in totaal 8 uur er over gedaan had die het over en weet ik wat. Maar als dit in 8 uur niet duidelijk is (laat ik hier maar vanuit gaan), dan heeft die toch echt een basiscursus MySQL & PHP nodig. :+

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 12:39
waarom faalt die query?
"SELECT naam, script FROM tester" O-)

Acties:
  • 0 Henk 'm!

Verwijderd

--
Edit nevermind :P

[ Voor 97% gewijzigd door Verwijderd op 16-12-2009 17:57 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 11:12
MBV schreef op woensdag 16 december 2009 @ 16:31:
waarom faalt die query?
"SELECT naam, script FROM tester" O-)
Hierdoor: WHERE naam = script

Een string moet je altijd een quote tekentje meegeven like 'string' :-)
*Het was eigenlijk bedoelt als string en niet als celnaam :+

[ Voor 9% gewijzigd door Manuel op 16-12-2009 18:33 ]


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Over slechte programmeervoorbeelden (of eerder de gevolgen ervan) te spreken: De T-mobile site. Takketraag, en takkebrak :X Op negen van de tien pagina's 'sorry er ging iets mis met het genereren van de pagina' bij My T-mobile.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Manuel schreef op woensdag 16 december 2009 @ 18:33:
[...]

Hierdoor: WHERE naam = script

Een string moet je altijd een quote tekentje meegeven like 'string' :-)
*Het was eigenlijk bedoelt als string en niet als celnaam :+
als zowel naam als script velden in de tabel tester zijn is het anders gewoon een valide query ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 11:12
Woy schreef op woensdag 16 december 2009 @ 19:09:
[...]

als zowel naam als script velden in de tabel tester zijn is het anders gewoon een valide query ;)
Ja wieso, maar jammer genoeg bedoelde ik het niet op die manier :).

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Overigens vind ik 'm nou ook niet echt bepaald in de topic thuishoren. Als het een klasgenoot van je is (en volgens je profiel ben je 16) zal het ook geen professional zijn, en dat maakt de code die hij produceert dan ook niet heel erg bijzonder. Het is meer een "haha kijk nou wat deze n00b voor code schrijft"-post, ipv een "ok, zo moet het dus niet"-post. En tendens van de topic neigt toch wel meer naar die laatste categorie :)

[ Voor 98% gewijzigd door .oisyn op 16-12-2009 21:57 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Een grotere WTF is misschien wel het gebruik van de mysql_ functies. Het blijft een raadsel dat die functies nog enthousiast aangeleerd worden, terwijl PDO sinds PHP 5.1 meegeleverd wordt (en er zijn tig andere libraries die hetzelfde doen). Veiliger, sneller, database-onafhankelijk, mooiere api.

[ Voor 5% gewijzigd door user109731 op 16-12-2009 21:51 ]


Acties:
  • 0 Henk 'm!

  • StM
  • Registratie: Februari 2005
  • Laatst online: 16:12

StM

Gezien het om mensen gaat die PHP leren lijkt het me nu niet echt HEEL handig om met PDO te gaan werken... PDO is toch flink wat complexer als de gewone mysql functie's en opzich werken die prima. Buiten het feit dat zowel MySQLi als PDO momenteel nog enkele hele wazige bugs hebben (als ik het me goed herinner oa in de afhandeling van connectie fouten) en je die niet met de MySQL extensie hebt.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Site.to.Make schreef op woensdag 16 december 2009 @ 22:43:
Gezien het om mensen gaat die PHP leren lijkt het me nu niet echt HEEL handig om met PDO te gaan werken... PDO is toch flink wat complexer als de gewone mysql functie's en opzich werken die prima. Buiten het feit dat zowel MySQLi als PDO momenteel nog enkele hele wazige bugs hebben (als ik het me goed herinner oa in de afhandeling van connectie fouten) en je die niet met de MySQL extensie hebt.
Tja, waarom zou je het in 1x goed aanleren als je het ook fout kan aanleren en dan rustig nog enkele jaartjes foute dingen doen...

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 18-09 20:25

TeeDee

CQB 241

JanDM schreef op woensdag 16 december 2009 @ 21:48:
Een grotere WTF is misschien wel het gebruik van de mysql_ functies. Het blijft een raadsel dat die functies nog enthousiast aangeleerd worden, terwijl PDO sinds PHP 5.1 meegeleverd wordt (en er zijn tig andere libraries die hetzelfde doen). Veiliger, sneller, database-onafhankelijk, mooiere api.
Och, dat kan ook een kwestie van simpelweg niet weten dat er iets beters is. Een beetje de melk hebben horen klotsen maar niet weten waar de uiers hangen.

Is dat niet iets waar bijvoorbeeld php.net/tutorial site melding van moet maken? Soort van certified tutorial of iets dergelijks?

[ Voor 10% gewijzigd door TeeDee op 16-12-2009 22:57 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
JanDM schreef op woensdag 16 december 2009 @ 21:48:
Een grotere WTF is misschien wel het gebruik van de mysql_ functies. Het blijft een raadsel dat die functies nog enthousiast aangeleerd worden, terwijl PDO sinds PHP 5.1 meegeleverd wordt (en er zijn tig andere libraries die hetzelfde doen). Veiliger, sneller, database-onafhankelijk, mooiere api.
Waarom zou het sneller zijn dan? Heb je een bron?

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


Acties:
  • 0 Henk 'm!

  • StM
  • Registratie: Februari 2005
  • Laatst online: 16:12

StM

En in hoeverre kan je spreken van fout? De mysql extensie is wat beperkter maar daarvoor is mysqli. En zover ik weet is de mysql extensie nog steeds niet deprecated. Ook niet in PHP6. Ga nu niet zeggen dat PDO de heilige graal is. Veiliger? Neehoor. Je zal nog steeds prepared statements of escaped variabeles moeten gebruiken. Sneller? Heb jed aar benchmarks van? Ik kan ze zo snel niet vinden. Database onafhankelijk? Hoe vaak switch jij? Sowieso zal je meestal alsnog je query's moeten aanpassen. Mooiere api? Dat is maar relatief.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

JanDM schreef op woensdag 16 december 2009 @ 21:48:
Een grotere WTF is misschien wel het gebruik van de mysql_ functies. Het blijft een raadsel dat die functies nog enthousiast aangeleerd worden, terwijl PDO sinds PHP 5.1 meegeleverd wordt (en er zijn tig andere libraries die hetzelfde doen). Veiliger, sneller, database-onafhankelijk, mooiere api.
Veiliger?
Het eerste wat me opvalt als ik die documentatie lees is een grote warning:
Warning

If your application does not catch the exception thrown from the PDO constructor, the default action taken by the zend engine is to terminate the script and display a back trace. This back trace will likely reveal the full database connection details, including the username and password. It is your responsibility to catch this exception, either explicitly (via a catch statement) or implicitly via set_exception_handler().
;)

Natuurlijk is het zo dat je de exceptions moet afvangen, maar in de praktijk gebeurd dat niet altijd, zeker bij dingen die "toch nooit falen" ;)

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 11:12
@.oisyn Hehe, nee logisch maar aangezien ik nergens de term professioneel voorbij zag komen dacht ik laat ik hem maar eens even posten, bedoelde het wat dat betreft ook niet met kwaad in de zin :)

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Site.to.Make schreef op woensdag 16 december 2009 @ 23:02:
Veiliger? Neehoor. Je zal nog steeds prepared statements of escaped variabeles moeten gebruiken.
Je hebt gelijk dat PDO ook 'misbruikt' kan worden, maar PDO 'dwingt' je wel meer om parameters te gebruiken dan mysql_query. Bij mysql_* leren de studenten dat ze alle parameters moeten escapen, maar dat gaan ze ooit ergens vergeten. Bij PDO is dat risico imho gewoon kleiner of niet aanwezig als je ze aanleert prepared statements te gebruiken voor argumenten.
Sneller? Heb jed aar benchmarks van? Ik kan ze zo snel niet vinden.
Prepared statements horen sneller te zijn omdat de database meer kan cachen (in theorie, nee ik heb geen benchmark). Bovendien is het escapen van parameters en het concatten van stukjes string in een taal als PHP ook niet bevorderlijk voor de performance...
Database onafhankelijk? Hoe vaak switch jij? Sowieso zal je meestal alsnog je query's moeten aanpassen.
Tja, als we zo beginnen... Het is gewoon een voordeel. Ik gebruik MySQL en PostgreSQL regelmatig, en vind het toch wel een fijn idee dat 90% van de queries ongewijzigd op allebei werken. Bovendien hoef ik enkel queries aan te passen en niet de PHP-code zelf. Anders kom je bij iets als Doctrine uit. Misschien is dat nog wel beter :p
Mooiere api? Dat is maar relatief.
Het is relatief, maar ik merk zelf dat ik voor eenvoudige websites veel minder methodes nodig heb in mijn Database class, waar ik eerst een flink aantal mysql_* functies moest wrappen om een beetje object-georienteerd te werken. En de classes vind ik persoonlijk fijner werken dan losse functies; net zoals ik liever in C++ werk dan in C :)
Erkens schreef op woensdag 16 december 2009 @ 23:08:
Veiliger?
Het eerste wat me opvalt als ik die documentatie lees is een grote warning:
Dat is een FAIL idd. Het probleem is ook dat exceptions/errors in PHP standaard (?) met stacktrace geprint worden. Dat zou je alleen in 'ontwikkeling' moeten hebben imho.

Verwijderd

Woy schreef op dinsdag 15 december 2009 @ 16:31:
[...]

Dat argument gaat echter niet op. Het betekent niet dat als jij geen variabele ziet dat er onderwater geen geheugen voor gebruikt word. De waarde zal alsnog ergens opgeslagen/bewaard moeten worden. Dus stellen dat je 0.0001 seconde winst hebt is wat overdreven.

Daarbij wil ik niet zeggen dat er geen winst kan zijn door voortijdig te returnen, maar dat is waarschijnlijk niet zozeer doordat je een variabele minder declareert.
optimaliseert je compiler die variabele dan niet weg?

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 12:39
Verwijderd schreef op donderdag 17 december 2009 @ 08:14:
[...]

optimaliseert je compiler die variabele dan niet weg?
Wie weet, kans bestaat van niet. Welke taal en welke compiler gebruik je? ;)
JanDM schreef op woensdag 16 december 2009 @ 21:48:
Een grotere WTF is misschien wel het gebruik van de mysql_ functies. Het blijft een raadsel dat die functies nog enthousiast aangeleerd worden, terwijl PDO sinds PHP 5.1 meegeleverd wordt (en er zijn tig andere libraries die hetzelfde doen). Veiliger, sneller, database-onafhankelijk, mooiere api.
Dat is geen WTF. PHP is een taal die simpel te leren is omdat hij weinig abstracties heeft, procedureel is, enzovoort. Welk stuk code is eenvoudiger te doorgronden voor iemand zonder programmeerervaring?

PHP:
1
2
3
4
5
6
7
8
9
//hoe heet die veilige functie op dit moment?
$sql = "SELECT * FROM table WHERE id = " + mysql_real_escape_all_evil($_GET[id]);
mysql_query($sql);

//of:

$stmt = $dbh->prepare("SELECT * FROM table WHERE id = :id");
$stmt->bindParam(":id", $_GET[id]);
$stmt->execute();

Die tweede heeft minstens 2 extra moeilijkheidsstappen:
- OOP: $dbh->prepare en $stmt->bindParam
- abstractie: eerst een variabele neerzetten, daarna binden. Wat gebeurt er als je tussen bindParam en execute de variabele verandert? Dat soort dingen is voor een beginner moeilijk te volgen.

[edit]
Ik blijk dat zelf niet eens te snappen. Dit is het voorbeeld van PHP.net:
PHP:
1
2
3
4
5
6
7
8
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

OMG, de variabele wordt by reference meegegeven aan bindParam 8)7 Welke idioot heeft dat verzonnen :X Waarom niet de java-manier? Waarom niet gewoon laten werken als OO method call? WHY!! :'(
Manuel schreef op woensdag 16 december 2009 @ 23:12:
@.oisyn Hehe, nee logisch maar aangezien ik nergens de term professioneel voorbij zag komen dacht ik laat ik hem maar eens even posten, bedoelde het wat dat betreft ook niet met kwaad in de zin :)
TS niet gezien? ;)

[ Voor 11% gewijzigd door MBV op 17-12-2009 10:47 ]


  • Matis
  • Registratie: Januari 2007
  • Nu online

Matis

Rubber Rocket

Wie leest er na 1 pagina nog de TS :+

If money talks then I'm a mime
If time is money then I'm out of time


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

MBV schreef op donderdag 17 december 2009 @ 10:44:
OMG, de variabele wordt by reference meegegeven aan bindParam 8)7 Welke idioot heeft dat verzonnen :X
Dat is op zich niet heel vreemd, ODBC werkt op een vergelijkbare manier. Op die manier kun je makkelijker data voeren aan een statement die je meer dan een keer uitvoert. Het nadeel is weer wel dat references lastig te tracken zijn in PHP, waardoor fouten er makkelijker in sluipen.
Waarom niet de java-manier?
De vraag die je kunt stellen is waarom Java het niet op een andere manier doet, maar dat is natuurlijk om dat Java geen andere manier ondersteunt.
Waarom niet gewoon laten werken als OO method call? WHY!! :'(
Wat is hier niet OO aan dan?

[ Voor 11% gewijzigd door .oisyn op 17-12-2009 11:18 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
MBV schreef op donderdag 17 december 2009 @ 10:44:
PHP:
1
2
3
4
5
6
7
8
9
//hoe heet die veilige functie op dit moment?
$sql = "SELECT * FROM table WHERE id = " + mysql_real_escape_all_evil($_GET[id]);
mysql_query($sql);

//of:

$stmt = $dbh->prepare("SELECT * FROM table WHERE id = :id");
$stmt->bindParam(":id", $_GET[id]);
$stmt->execute();
Ik ga toch voor mijn eigen variant...
C++:
1
Csql_query(m_database, "select * from table where id = ?").p(id).execute();
JanDM schreef op woensdag 16 december 2009 @ 23:40:
Dat is een FAIL idd. Het probleem is ook dat exceptions/errors in PHP standaard (?) met stacktrace geprint worden. Dat zou je alleen in 'ontwikkeling' moeten hebben imho.
In productie zet je het printen van errors toch zoiezo uit? De 'FAIL' is dat dat niet de PHP default is.

[ Voor 26% gewijzigd door Olaf van der Spek op 17-12-2009 14:47 ]


Verwijderd

MBV schreef op donderdag 17 december 2009 @ 10:44:
[...]

Wie weet, kans bestaat van niet. Welke taal en welke compiler gebruik je? ;)
geen, maar het lijkt me dat een beetje compiler geen variabelen gaat aanmaken als die de volgende regel al weer destroyed worden.

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

MBV schreef op donderdag 17 december 2009 @ 10:44:
[edit]
Ik blijk dat zelf niet eens te snappen. Dit is het voorbeeld van PHP.net:
PHP:
1
2
3
4
5
6
7
8
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

OMG, de variabele wordt by reference meegegeven aan bindParam 8)7 Welke idioot heeft dat verzonnen :X
Misschien dezelfde 'idioot' die heeft verzonnen dat er ook gewoon een alternatief is waar de variabele niet by reference wordt meegegeven? :?

Verwijderd

Olaf van der Spek schreef op donderdag 17 december 2009 @ 14:43:
[...]

Ik ga toch voor mijn eigen variant...
C++:
1
Csql_query(m_database, "select * from table where id = ?").p(id).execute();



[...]

In productie zet je het printen van errors toch zoiezo uit? De 'FAIL' is dat dat niet de PHP default is.
De code die je quote is niet goed, maar even uitgaand van de correcte variant (die hij later toegevoegd heeft), heeft jouw code níet de voordelen die prepared statements hebben. En verder is jouw voorbeeld ook niet bepaald overzichtelijk, vind je wel?

Ik vind het persoonlijk overzichtelijker om ":id" te gebruiken dan om "?" te gebruiken en dan maar hopen dat je de de parameters in juiste volgorde toewijst en een jaar later als je wat moet wijzigen ook... :9

  • chielsen
  • Registratie: Oktober 2003
  • Laatst online: 18-09 21:48
Denk je even makkelijk wat aanpassingen te doen aan ween webshop, kom je allemaal van deze code tegen:

PHP:
1
<?php if ($task == 'bewerkinfo') {}else{if ($task == 'toevoegen') {}else{if ($task == 'bewerken') {}else{if ($task == 'info') {}else{if ($task == 'bewerkinfo') {}else{?>


ipv

PHP:
1
2
<?php
if($task != 'bewerkinfo' && $task != 'toevoegen' && $task != 'bewerken' && $task != 'info' && $task != 'bewerkinfo') {


Ja dit kan ook met een in_array oid, ligt een beetje aan hoeveel argumenten je hebt.

Of dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    if ($cat == ''){}
    else {
        if ($cat == 'media'){echo '<div id="onderdeel">In de media</div><br />';}
        else{
            if ($cat == 'over'){echo '<div id="onderdeel">Over ons</div><br />';}
            else{
                if ($cat == 'disney'){echo '<div id="onderdeel">Disney Couture</div><br />';}
                else{
                    if ($cat == 'ahj'){echo '<div id="onderdeel">AH Jewelry</div><br />';}
                    else{
                        if ($cat == 'mb'){echo '<div id="onderdeel">Mischa Barton</div><br />';}
                        else{
                            if ($cat == 'outlet'){echo '<div id="onderdeel">Sale</div><br />';}
                            else{
                                echo '<div id="onderdeel">'.$cat.'</div><br />';
                            }
                        }
                    }
                }
            }
        }
    }


Nog nooit van switch gehoord blijkbaar, of elseif of uberhaupt van normale flowcontrol.

[ Voor 3% gewijzigd door chielsen op 17-12-2009 19:16 ]


Verwijderd

@ chielsen: dat er iets op die site is over Mischa Barton maakt het dan weer wat minder erg.. :9~ :9~

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op donderdag 17 december 2009 @ 18:51:
En verder is jouw voorbeeld ook niet bepaald overzichtelijk, vind je wel?

Ik vind het persoonlijk overzichtelijker om ":id" te gebruiken dan om "?" te gebruiken en dan maar hopen dat je de de parameters in juiste volgorde toewijst en een jaar later als je wat moet wijzigen ook... :9
Ik vind mijn voorbeeld prima werken. Je hebt wel een goed punt, maar of het met ":id" zoveel beter werkt weet ik niet. Ook dan moeten wijzigingen op meerdere plaatsen worden doorgevoerd.

Welke voordelen van prepared statements mist mijn voorbeeld trouwens?

[ Voor 5% gewijzigd door Olaf van der Spek op 17-12-2009 20:21 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:51

Janoz

Moderator Devschuur®

!litemod

Olaf van der Spek schreef op donderdag 17 december 2009 @ 20:21:
Welke voordelen van prepared statements mist mijn voorbeeld trouwens?
Het voordeel dat een statement ge-'prepared' wordt en daarna meerdere keren gebruikt kan worden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Janoz schreef op donderdag 17 december 2009 @ 20:33:
Het voordeel dat een statement ge-'prepared' wordt en daarna meerdere keren gebruikt kan worden.
Ik heb geen implementatie gepost, dus er kan achter de schermen best gebruik worden gemaakt van prepared statements. Al moet ik toegeven dat ik daar nog steeds niet naar gekeken heb.

[ Voor 9% gewijzigd door Olaf van der Spek op 17-12-2009 21:03 ]


Acties:
  • 0 Henk 'm!

  • Maghiel
  • Registratie: Maart 2004
  • Laatst online: 20:22
Al die voorbeelden hierboven...ik prefereer dan toch:

PHP:
1
2
3
4
5
6
7
$db     = Zend_Db::factory(// Je adapter en configuratie);

$query  = $db->select()
             ->from('table')
             ->where('id = ?', $_GET['id']); // Al zou ik natuurlijk never een get zo uitlezen :p
             
$result = $db->fetchAll($query);


:p

Denk ook dat dit voor beginners helemaal niet moeilijker is om aan te leren dan een sql dialect wat toch 9 van de 10 keer mysql is, en dan leren ze het gelijk goed :)

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Nu online

Matis

Rubber Rocket

Maghiel schreef op vrijdag 18 december 2009 @ 04:37:
Al die voorbeelden hierboven...ik prefereer dan toch:

PHP:
1
2
3
4
5
6
7
$db     = Zend_Db::factory(// Je adapter en configuratie);

$query  = $db->select()
             ->from('table')
             ->where('id = ?', $_GET['id']); // Al zou ik natuurlijk never een get zo uitlezen :p
             
$result = $db->fetchAll($query);


:p

Denk ook dat dit voor beginners helemaal niet moeilijker is om aan te leren dan een sql dialect wat toch 9 van de 10 keer mysql is, en dan leren ze het gelijk goed :)
Nomineer je dit nu als slecht voorbeeld of als eigen inbreng zoals het wel moet :X :X

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
chielsen schreef op donderdag 17 december 2009 @ 19:13:
Nog nooit van switch gehoord blijkbaar, of elseif of uberhaupt van normale flowcontrol.
Nog nooit van een database gehoord bedoel je..

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

chielsen schreef op donderdag 17 december 2009 @ 19:13:
Nog nooit van switch gehoord blijkbaar, of elseif of uberhaupt van normale flowcontrol.
Waar heb je elseif in dit geval voor nodig dan? Je kunt ook gewoon "else if" schrijven. Grammaticaal is dat exact hetzelfde als wat jij post, met het verschil dat je niet een compound statement gebruikt per if.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Nu online
Maghiel schreef op vrijdag 18 december 2009 @ 04:37:
Al die voorbeelden hierboven...ik prefereer dan toch:

PHP:
1
2
3
4
5
6
7
$db     = Zend_Db::factory(// Je adapter en configuratie);

$query  = $db->select()
             ->from('table')
             ->where('id = ?', $_GET['id']); // Al zou ik natuurlijk never een get zo uitlezen :p
             
$result = $db->fetchAll($query);


:p

Denk ook dat dit voor beginners helemaal niet moeilijker is om aan te leren dan een sql dialect wat toch 9 van de 10 keer mysql is, en dan leren ze het gelijk goed :)
Die $_GET daar zo uitlezen zal niet zo veel uitmaken, aangezien het toch wordt ge-escaped door de Zend DB Adapter.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Olaf van der Spek schreef op donderdag 17 december 2009 @ 20:21:
[...]

Ik vind mijn voorbeeld prima werken. Je hebt wel een goed punt, maar of het met ":id" zoveel beter werkt weet ik niet. Ook dan moeten wijzigingen op meerdere plaatsen worden doorgevoerd.
En wat als je een tiental (of meer) parameters hebt? En wat als de volgorde van je statements verandert naar gelang je de code aanpast? Het is een stuk makkelijker om een deel van je sql alleen aan te hoeven passen, dan je sql én de volgorde van je parameters. Niet dat ik ook maar enige ervaring heb met prepared statements, maar het gaat om het idee.

SQL:
1
2
3
4
5
6
7
select iets from wat
join piet on piet.henk = henk.piet and henk.durk = ?
where henk = ?
and piet = ?
and durk = ?
and foppe = ?
and klaas = ?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:51

Janoz

Moderator Devschuur®

!litemod

ZpAz schreef op vrijdag 18 december 2009 @ 11:16:
[...]


Die $_GET daar zo uitlezen zal niet zo veel uitmaken, aangezien het toch wordt ge-escaped door de Zend DB Adapter.
Het gaat niet om het escapen, maar om het scheiden van verantwoordelijkheden. Als er UI code in je databasecode staat is de kans groot dat je project een keurige 1-laagsspaghettibende is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • mathijs92
  • Registratie: December 2007
  • Laatst online: 16-09 20:34
Ik kreeg deze week mijn nieuwe cultuurkaart binnen op school (is een landelijke kaart, voor korting op bv bioscopen), de envelop was al geopend maar mijn kaart zat er nog in. Uit verveling heb ik de brief een keer doorgelezen. Staat daar midden op de pagina de gebruikersnaam en het wachtwoord dat ik gebruikt heb om me te registreren, natuurlijk in een groter lettertype en dikgedrukt 8)7 . Dit was bij iedereen het geval, dus het was niet toevallig een nieuw random password.

Dat ze wachtwoorden opslaan zonder hash vind ik al slecht, maar om ze dan ook nog te versturen per post, vind ik toch echt te ver gaan. Je zou toch iets meer mogen verwachten van een redelijk grote organisatie?

Misschien geen slecht programmeervoorbeeld, maar toch relevant

[ Voor 9% gewijzigd door mathijs92 op 18-12-2009 16:06 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:08

Haan

dotnetter

Dat is best wel pijnlijk ja :X

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

De woningbouw bij mij is leuker, die sturen als je je hebt geregistreerd een brief: "Uw lidmaatschapsnummer is YYYYMMDDnnn, en uw wachtwoord is welkom. Verander dit wachtwoord zo snel mogelijk!"

En nnn was bij mij nummer 002 :') Ik heb de verleiding maar weerstaan om ook even het wachtwoord voor nummer 001 te veranderen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je zal maar per ongeluk een tikfout maken en zo inloggen op (en het ww wijzigen van) het account van een ander zonder dat je het doorhebt 8)7

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Nu online
Janoz schreef op vrijdag 18 december 2009 @ 11:53:
[...]


Het gaat niet om het escapen, maar om het scheiden van verantwoordelijkheden. Als er UI code in je databasecode staat is de kans groot dat je project een keurige 1-laagsspaghettibende is.
Kan je uit die 4 regels halen dat er UI code bij staat? ;)

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

ZpAz schreef op vrijdag 18 december 2009 @ 17:24:
[...]


Kan je uit die 4 regels halen dat er UI code bij staat? ;)
Waarschijnlijk omdat hij rechtstreeks in de SELECT $_GET gebruikt. Dus geen afscheiding tussen handler van een $_GET / $_POST en de database :)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ZpAz schreef op vrijdag 18 december 2009 @ 17:24:
[...]


Kan je uit die 4 regels halen dat er UI code bij staat? ;)
GET is input en dus onderdeel van de UI!

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Nu online
Woy schreef op vrijdag 18 december 2009 @ 17:44:
[...]

GET is input en dus onderdeel van de UI!
Ajaa, nee idd. Gelijk heb je. Was er niet helemaal bij. O-)

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
MBV schreef op donderdag 17 december 2009 @ 10:44:
OMG, de variabele wordt by reference meegegeven aan bindParam 8)7 Welke idioot heeft dat verzonnen :X Waarom niet de java-manier? Waarom niet gewoon laten werken als OO method call? WHY!! :'(
Even uit pure interesse, maar wat is er eigenlijk zo slecht aan het passen van variables by reference? Het feit dat het tot PHP 5.3.0 heeft geduurt totdat dit deprecated was betekent dus dat er heeeeel veel idioten hebben rondgelopen.

[ Voor 13% gewijzigd door armageddon_2k1 op 19-12-2009 12:38 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
armageddon_2k1 schreef op zaterdag 19 december 2009 @ 12:09:
[...]


Even uit pure interesse, maar wat is er eigenlijk zo slecht aan het passen van variables by reference?
Dat snap ik even ook niet, als je dat niet wilt gebruik je toch gewoon bindValue :?

Acties:
  • 0 Henk 'm!

Verwijderd

armageddon_2k1 schreef op zaterdag 19 december 2009 @ 12:09:
[...]


Even uit pure interesse, maar wat is er eigenlijk zo slecht aan het passen van variables by reference? Het feit dat het tot PHP 5.3.0 heeft geduurt totdat dit deprecated was betekent dus dat er heeeeel veel idioten hebben rondgelopen.
Nou het probleem kan zijn dat als je vervolgens de variabele wijzigt waar naar gerefereerd word dat de waarde in de statement ook verandert. Helemaal met php zijn loose typing kan het elke waarde aannemen.
Voordeel ervan is ook al genoemt, je kunt een statement vaker uitvoeren en enkel de gebinde variabelen aanpassen, dan hoef je niet steeds de statement opnieuw op te bouwen.
Zoals ook al gezegt bied Zend ook een mogelijkheid om via value te doen (dan word er dus een nieuwe lokale variabele gebruikt voor de waarde).

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

armageddon_2k1 schreef op zaterdag 19 december 2009 @ 12:09:
[...]


Even uit pure interesse, maar wat is er eigenlijk zo slecht aan het passen van variables by reference? Het feit dat het tot PHP 5.3.0 heeft geduurt totdat dit deprecated was betekent dus dat er heeeeel veel idioten hebben rondgelopen.
Even voor de duidelijkheid, het call-time passen by reference is sinds 5.3 deprecated. M.a.w. dit is deprecated:

PHP:
1
2
3
4
5
6
7
8
9
<?php

function foo($bar) { $bar++; return $bar; }

$val = 0;
echo foo(&$val);
echo $val;

?>


Maar dit is niet deprecated:

PHP:
1
2
3
4
5
6
7
8
9
<?php

function foo(&$bar) { $bar++; return $bar; }

$val = 0;
echo foo($val);
echo $val;

?>


Het passen van references is dus niet deprecated.

[ Voor 3% gewijzigd door Patriot op 19-12-2009 14:14 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:08

Haan

dotnetter

Ben ik nou kippig, of staat er 2x precies hetzelfde?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Haan schreef op zaterdag 19 december 2009 @ 19:50:
Ben ik nou kippig, of staat er 2x precies hetzelfde?
code:
1
2
foo(&$bar)
foo($bar)


;)

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Haan schreef op zaterdag 19 december 2009 @ 19:50:
Ben ik nou kippig, of staat er 2x precies hetzelfde?
Het doet hetzelfde, als dat is wat je bedoeld ;)

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 12:39
hmm, bij nader inzien was mijn reactie 'ietsje' overdreven. Toch vind ik het 'binden' op deze manier niet echt netjes, misschien omdat ik prepared statements voornamelijk in Java en C# heb gebruikt.

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 20:29

Twazerty

AVCHDCoder developer

Hier een grote WTF uit mijn project:

Java:
1
2
3
4
5
            if(discInQueue.isEmpty()){
                discInQueue.add(getLastDisc());
            }else{
                discInQueue.add(getLastDisc());
            }


Hoezo onnodig nutteloze regels schrijven 8)7 Allemaal het resultaat van 12 maanden evolutie. :*)

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 12:39
bij mij staat er een todo naast: //TODO can this distinction be removed?

al sinds februari :+ * MBV is scriptie aan het afronden.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zoals sommigen van jullie misschien wel weten werk ik bij een bedrijf waar we veel met Asterisk doen en daar onze eigen producten op/om heen bouwen. Nu rant ik met regelmaat Asterisk want het stikt van de WTF's (ondanks dat 't product in z'n geheel overigens best goed werkt). Vandaag kwam ik weer een juweeltje tegen...

Onderstaande quote gaat, kort-door-de-bocht, over een (database) tabel welke als alternatief dient voor .conf bestanden (en dus feitelijk gewoon configuratiemeuk bevat):
NOTE: Column order is important!! If you place "ipaddr" before "host" (in the case of dynamic), you will never load the public IP address of your sip device, as it will be overwritten when "host" is encountered. allow/disallow and permit/deny, the order of these statements is crucial in the config file, as they are applied in order. In the realtime db, the order is determined by the order of the columns in the table. You will note that the deny/disallow entries come before the allow/permit entries, to support the common usage of 'deny all', then permit '192.168.....'.
:X 8)7 Zo kom ik er wel meer tegen, als in: op dagelijkse basis, maar deze kon ik jullie niet onthouden :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Sibylle
  • Registratie: Juli 2006
  • Laatst online: 13-07-2023
RobIII schreef op woensdag 23 december 2009 @ 10:58:
Zoals sommigen van jullie misschien wel weten werk ik bij een bedrijf waar we veel met Asterisk doen en daar onze eigen producten op/om heen bouwen. Nu rant ik met regelmaat Asterisk want het stikt van de WTF's (ondanks dat 't product in z'n geheel overigens best goed werkt). Vandaag kwam ik weer een juweeltje tegen...

Onderstaande quote gaat, kort-door-de-bocht, over een (database) tabel welke als alternatief dient voor .conf bestanden (en dus feitelijk gewoon configuratiemeuk bevat):


[...]


:X 8)7 Zo kom ik er wel meer tegen, als in: op dagelijkse basis, maar deze kon ik jullie niet onthouden :+
Zo gek is dat toch niet? Nu kunnen jullie bijvoorbeeld alle denkbare configuraties en instellingen toepassen door alleen de columns van volgorde te veranderen en de juiste waarde toe te voegen.
Als alles gewoon per columnname ging, dan moest je ook nog ergens aangeven welke columns boven welke gaan bij een conflict (om alle configs te maken).

Of mis ik nu iets ? :P

Ctrl+k


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Geen idee, want ik kan even geen touw aan je uitleg/goedpraatpoging knopen :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 06:53
Was weer eens mijn achterstand in dit topic aan het inhalen en liep tegen deze opmerking aan:
Standeman schreef op woensdag 30 september 2009 @ 12:10:
[...]

Dat is net zoiets als een datum opslaan als met de kolommen dag, maand, jaar, uur, minuut. Wat ik ooit ook wel eens ben tegengekomen :')
Oh, ik heb ooit eens een compleet tijdregistratie systeem geschreven waar de tijden werden geregistreerd in jaar, maand, dag en "minuten sinds begin van de dag" (dus niet uur en minuut). Dit deed ik makkelijke rapportages te kunnen maken uit de database. Voor de medewerkers werd per maand aangegeven hoeveel er gewerkt mocht worden. En nu kon ik joinen op jaar en maand. Voor de som van dagelijkse/maandelijkse werkzaamheden kon ik groeperen op jaar, maand (en evt. dag)

Ik vond het dus alleen maar handig. Vooral omdat MS SQL 2000 geen echt datum-veld ondersteunde en dus ook berekeningen van de tijd lastige queries opleverden.

  • chielsen
  • Registratie: Oktober 2003
  • Laatst online: 18-09 21:48
.oisyn schreef op vrijdag 18 december 2009 @ 10:31:
[...]

Waar heb je elseif in dit geval voor nodig dan? Je kunt ook gewoon "else if" schrijven. Grammaticaal is dat exact hetzelfde als wat jij post, met het verschil dat je niet een compound statement gebruikt per if.
Ik zei alleen dat diegene die het gemaakt heeft dat niet kent, anders schrijf je niet zo else ifs op.
Het voorbeeld maakt volgens mij duidelijk genoeg dat er nog nooit van iets anders dan if en else is gehoord.

In elk geval kan je elseif vervangen door else if, het is juist in het leven geroepen om wanneer je else if gebruikt de statements wat korter en duidelijker te maken.

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

jvdmeer schreef op woensdag 23 december 2009 @ 22:21:
Was weer eens mijn achterstand in dit topic aan het inhalen en liep tegen deze opmerking aan:


[...]


Ik vond het dus alleen maar handig. Vooral omdat MS SQL 2000 geen echt datum-veld ondersteunde en dus ook berekeningen van de tijd lastige queries opleverden.
Mis ik iets?

smalldatetime
datetime

http://msdn.microsoft.com...aa258277%28SQL.80%29.aspx

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:51

Janoz

Moderator Devschuur®

!litemod

chielsen schreef op donderdag 24 december 2009 @ 23:07:
[...]


Ik zei alleen dat diegene die het gemaakt heeft dat niet kent, anders schrijf je niet zo else ifs op.
Het voorbeeld maakt volgens mij duidelijk genoeg dat er nog nooit van iets anders dan if en else is gehoord.

In elk geval kan je elseif vervangen door else if, het is juist in het leven geroepen om wanneer je else if gebruikt de statements wat korter en duidelijker te maken.
Ja inderdaad, die ene spatie maakt echt een wereld van verschil [/sacrasm]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 20:11

Onbekend

...

chielsen schreef op donderdag 24 december 2009 @ 23:07:
In elk geval kan je elseif vervangen door else if, het is juist in het leven geroepen om wanneer je else if gebruikt de statements wat korter en duidelijker te maken.
Als je in meerdere programmeertalen programmeert en 1 daarvan ondersteunt geen "elseif" zal je het ook niet direct in andere programmeertalen gebruiken.
Zo gebruik ik eigenlijk nooit de case-functie. :)

[ Voor 18% gewijzigd door Onbekend op 25-12-2009 15:59 ]

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 17-09 17:56
PHP:
1
2
3
4
5
6
$res = unlink($directory);
if($res) {
   return true;
} else {
   return false;
}

Oude code doorspitten, altijd leuk :/

Of dingen als:
PHP:
1
2
3
4
5
6
7
8
class zus {  /* ... */ }
class zo { /* ... */ }
$zus = new zus;
$zo = new zo;
function doeDit() {
  global $zus, $zo;
  $zus->doe($zo);
}

En dan overal die global variablen gebruiken 8)7

[ Voor 44% gewijzigd door hostname op 25-12-2009 17:36 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 12:39
die eerste vind ik niet zo'n ramp: dan weet je tenminste zeker dat het een boolean is. Ja, 'return $res == true' doet hetzelfde, maar PHP is nogal irritant wat dat betreft.

Maar ja, die 2e... :X

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
MBV schreef op vrijdag 25 december 2009 @ 20:57:
die eerste vind ik niet zo'n ramp: dan weet je tenminste zeker dat het een boolean is. Ja, 'return $res == true' doet hetzelfde, maar PHP is nogal irritant wat dat betreft.

Maar ja, die 2e... :X
unlink geeft altijd een boolean terug, het kan dus gewoon zo:

PHP:
1
return unlink($directory);

Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 06:53
Yep, dat zijn combivelden van tijd en datum. terwijl ik makkelijk wilde groeperen op dag/maand of jaar en dan de tijden optellen. Dat lukt niet echt met een datumtijd-veld. Helaas...

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:51

Janoz

Moderator Devschuur®

!litemod

jvdmeer schreef op vrijdag 25 december 2009 @ 21:44:
[...]

Yep, dat zijn combivelden van tijd en datum. terwijl ik makkelijk wilde groeperen op dag/maand of jaar en dan de tijden optellen. Dat lukt niet echt met een datumtijd-veld. Helaas...
huh? mssql kent MONTH, DAY en YEAR toch wel?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Simon Verhoeven
  • Registratie: Juni 2008
  • Laatst online: 30-08-2018

Simon Verhoeven

The trial never ends.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:51

Janoz

Moderator Devschuur®

!litemod

mssql hadden we het over ;)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 06:53
Janoz schreef op zaterdag 26 december 2009 @ 08:47:
[...]

huh? mssql kent MONTH, DAY en YEAR toch wel?
Waarschijnlijk wel.

Maar ik vind dit toch wel een leuke view geworden (van ca 8 jaar geleden):
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE VIEW dbo.V_JaarOverzicht
AS
SELECT TOP 100 PERCENT dbo.MaxUren.Maand, dbo.MaxUren.TotaalUren, SUM(dbo.Tijden.MinutenEffectief) AS Expr1, dbo.MaxUren.WerknID,  dbo.MaxUren.Jaar
     FROM dbo.MaxUren 
     FULL OUTER JOIN dbo.Tijden ON 
          dbo.MaxUren.WerknID = dbo.Tijden.WerknID AND 
          dbo.MaxUren.Maand = dbo.Tijden.Maand AND
          dbo.MaxUren.Jaar = dbo.Tijden.Jaar
    GROUP BY 
          dbo.MaxUren.Maand, dbo.MaxUren.TotaalUren, dbo.MaxUren.WerknID, dbo.MaxUren.Jaar
     HAVING (dbo.MaxUren.WerknID IS NOT NULL)
     ORDER BY dbo.MaxUren.Maand

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MONTH en YEAR volgens mij wel, DAY volgens mij niet. Maar je kunt het in ieder geval wel met DATEPART bereiken

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18-09 23:16
Woy schreef op zaterdag 26 december 2009 @ 22:42:
[...]

MONTH en YEAR volgens mij wel, DAY volgens mij niet. Maar je kunt het in ieder geval wel met DATEPART bereiken
* whoami mept Woy naar de BOL (als dat nog bestaat).

code:
1
2
3
select day(getdate())
select month(getdate())
select year(getdate())

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 09:07

MueR

Admin Tweakers Discord

is niet lief

Kom net in phpBB3 de volgende functie tegen in hun mysqli class:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
{
    $this->query_result = false;

    // if $total is set to 0 we do not want to limit the number of rows
    if ($total == 0)
    {
        // MySQL 4.1+ no longer supports -1 in limit queries
        $total = '18446744073709551615';
    }
    $query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);

    return $this->sql_query($query, $cache_ttl);
}

Waarom zou je de limit ook weglaten als je dit kan doen 8)7

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Dat voorbeeld komt anders letterlijk uit de MySQL documentatie:
http://dev.mysql.com/doc/refman/5.1/en/select.html ;)
LIMIT simpelweg weglaten, zoals jij suggereert, is geen optie als je wél een offset hebt maar geen totaal.

Acties:
  • 0 Henk 'm!

Verwijderd

Soultaker schreef op dinsdag 05 januari 2010 @ 01:41:
Dat voorbeeld komt anders letterlijk uit de MySQL documentatie:
http://dev.mysql.com/doc/refman/5.1/en/select.html ;)
LIMIT simpelweg weglaten, zoals jij suggereert, is geen optie als je wél een offset hebt maar geen totaal.
Moet je de code beter lezen:
PHP:
1
$query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);


Als de offset leeg is, wordt er toch een limit meegegeven.

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 19:49
PHP:
1
$query .= !empty($offset) ? "\n LIMIT " . $offset . ', ' . $total : '';


Maar om nou te zeggen dat dát nou zo'n verschrikkelijk slecht codevoorbeeld is: nee. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

ZpAz schreef op dinsdag 15 december 2009 @ 15:50:
Of het het slechste voorbeeld is, tsja.. maar waarom die if-statements zo onlogisch verpakken.

code:
1
2
3
4
5
6
if (len && len > 0) 
      ret = len === 1 ? "1 task" : "%@ tasks".fmt(len);
else
      ret = "No tasks";
  
return ret;


Of hoe ik het zou doen:

code:
1
2
3
4
5
6
if(len == 0) 
    return 'No tasks';
if(len == 1)
    return '1 Task';
else
    return len + ' Tasks';


Vind ik imho toch een stuk duidelijker.
Ik vind je tweede oplossing ook niet zo mooi. Je tweede if gaat er vanuit dat de return van de eerste if de flow doorbreekt, maar waarom ga je er dan een else achter plakken? Want de return van je tweede if doorbreekt de flow ook.
code:
1
2
3
4
5
if(len == 0) 
    return 'No tasks';
if(len == 1)
    return '1 Task';
return len + ' Tasks';

Of een iets creatievere variant
code:
1
2
3
4
5
6
7
8
if(len == 0) 
    str = 'No';
else
    str = len;
str .= ' Task';
if(len != 1)
    str .= 's';
return str;

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Verwijderd schreef op dinsdag 05 januari 2010 @ 02:03:
Moet je de code beter lezen:
PHP:
1
$query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);

Als de offset leeg is, wordt er toch een limit meegegeven.
Dat had ik wel begrepen, maar ik snap niet wat het probleem daar mee is (vandaar dat ik dacht dat je je verbaasde over het willekeurige grote getal in de code). Je zou de LIMIT clause wel helemaal weg kunnen laten als totaal noch offset gegeven is, maar dat maakt de code alleen maar complexer, terwijl het voor de efficiëntie van de query waarschijnlijk weinig tot niets uitmaakt.

Wat is er dan precies verkeerd aan overzichtelijke code die snel en correct werkt :?
Jaap-Jan schreef op dinsdag 05 januari 2010 @ 02:08:
PHP:
1
$query .= !empty($offset) ? "\n LIMIT " . $offset . ', ' . $total : '';
Dat volstaat dus niet, want als alléén een totaal gegeven is, moet je wél een LIMIT-clause genereren.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Da's net zoiets als:
C++:
1
2
3
unsigned num = myVector.size();
for (unsigned i = num - 1; i < num; i--)
    doIets(myVector[i]);

ipv allerlei casts naar signed zodat je i >= 0 kunt doen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 12:39
Wat is het hier stil :?

Ik hoor net een verhaal van een collega van me. Collega Y moet C#-code parsen voor metrieken, dependencies enzovoort. C#-grammar van ANTLR gevonden, dus dat moet best te doen zijn ('k heb iets vergelijkbaars voor Java al afgerond, voor mijn afstudeeropdracht). Y wil de parse-tree omzetten in XML zodat hij hem met een visitor kan analyseren. Dat is echt veeeeel handiger dan direct de parse-tree analyseren met een visitor :z

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 20:11

Onbekend

...

whoami schreef op zaterdag 26 december 2009 @ 23:00:
[...]

* whoami mept Woy naar de BOL (als dat nog bestaat).

code:
1
2
3
select day(getdate())
select month(getdate())
select year(getdate())
Leuk die code. :) Meestal gaat dat wel goed, maar soms ook niet. Op 31 januari 2010 om 23:59.59 uur kan, als hij net naar de volgende dag springt, de volgende uitkomst krijgen:
Day = 31
Month = 2
En reken maar dat weinig programma's met 31 februari kunnen werken. d:)b

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Onbekend schreef op woensdag 27 januari 2010 @ 00:03:
[...]

Leuk die code. :) Meestal gaat dat wel goed, maar soms ook niet. Op 31 januari 2010 om 23:59.59 uur kan, als hij net naar de volgende dag springt, de volgende uitkomst krijgen:
Day = 31
Month = 2
En reken maar dat weinig programma's met 31 februari kunnen werken. d:)b
Je moet ook eerst een timestamp opslaan en dan pas de bijbehoren getalletjes ophalen :P
Ik maak altijd een constant met de tijd in milliseconden in PHP, helemaal in het begin van de code.

Heb daarvoor echter nooit gehad dat ik zulke leuke datums krijg, maar het is inderdaad prima mogelijk, ook al is de kans klein.

[ Voor 10% gewijzigd door Gamebuster op 27-01-2010 05:10 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Is het niet gegarandeerd dat als je het in 1 query doet (dus select day(getdate()), month(getdate()), year(getdate())), dat ze dan allemaal dezelfde tijd teruggeven? Zou wat zijn als dat niet zo was eigenlijk... :X

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Otherside1982
  • Registratie: Februari 2009
  • Laatst online: 07:32
Ik heb samen met een collega een toepassing gemaakt voor een klant. Die collega werkt nu ergens anders aan een ander project en ik volg het project verder op bij de klant en doe bugfixes. Gisteren kreeg ik een leuke bug binnen: op een bepaald scherm zijn er in een grid verschillende velden verplicht in te vullen (NOT NULL in databank). De bug wordt als volgt gemeld: Als ik maar veld in de grid invul en de gegevens bewaar krijg ik geen foutmelding op de verplichte velden, ze worden gewoon op 0 gezet.

Ik kijk in de code en daar zie ik het volgende: 8)7
Delphi:
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
cdsBarema.First;
while not cdsBarema.Eof do begin
  if cdsBarema.FieldByName('verbruik_van').IsNull then begin
    cdsBarema.Edit;
    cdsBarema.FieldByName('verbruik_van').AsInteger := 0;
    cdsBarema.Post;
  end;
  if cdsBarema.FieldByName('waterprijs').IsNull then begin
    cdsBarema.Edit;
    cdsBarema.FieldByName('waterprijs').AsInteger := 0;
    cdsBarema.Post;
  end;
  if cdsBarema.FieldByName('abonnement').IsNull then begin
    cdsBarema.Edit;
    cdsBarema.FieldByName('abonnement').AsInteger := 0;
    cdsBarema.Post;
  end;
  if cdsBarema.FieldByName('per_persoon').IsNull then begin
    cdsBarema.Edit;
    cdsBarema.FieldByName('per_persoon').AsInteger := 0;
    cdsBarema.Post;
  end;
  if cdsBarema.FieldByName('cumulatief').IsNull then begin
    cdsBarema.Edit;
    cdsBarema.FieldByName('cumulatief').AsInteger := 0;
    cdsBarema.Post;
  end;
  
  cdsBarema.Next;
end;

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

.oisyn schreef op woensdag 27 januari 2010 @ 10:48:
Is het niet gegarandeerd dat als je het in 1 query doet (dus select day(getdate()), month(getdate()), year(getdate())), dat ze dan allemaal dezelfde tijd teruggeven? Zou wat zijn als dat niet zo was eigenlijk... :X
SQL:
1
select datepart(ms, getdate()), getdate()
Geeft steeds dezelfde resultaten.

Maar het EP zegt meer:

Afbeeldingslocatie: http://i45.tinypic.com/2e4lz12.png

Slechts 1 execution maar wel 2 resultaten.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
kenneth schreef op woensdag 27 januari 2010 @ 10:58:
[...]

SQL:
1
select datepart(ms, getdate()), getdate()
Geeft steeds dezelfde resultaten.

Maar het EP zegt meer:

[afbeelding]

Slechts 1 execution maar wel 2 resultaten.
Huh wat bedoel je?

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Dat de getdate() dus een keer wordt uitgevoerd, zoals .oisyn hoopte.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het zou ook wat zijn, als je in een query die heel lang duurt en records aan het ophalen bent adhv de huidige datum dat je dan inconsistente resultaten krijgt omdat de getdate() bij het eerste record niet meer hetzelfde is als de getdate() bij het laatste.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 12:39
Ik ben wel benieuwd naar het execution plan hiervan:
SQL:
1
2
SELECT getdate() as firstdate, seconddate
FROM (SELECT getdate() as seconddate)

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

MBV schreef op woensdag 27 januari 2010 @ 14:10:
Ik ben wel benieuwd naar het execution plan hiervan:
SQL:
1
2
SELECT getdate() as firstdate, seconddate
FROM (SELECT getdate() as seconddate)
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ')'.


:+

(MSSQL 2k5 Express)

Maar:
SQL:
1
SELECT getdate() as firstdate, (SELECT getdate()) as seconddate


geeft:

Afbeeldingslocatie: http://i46.tinypic.com/292b8eg.png

MSSQL 2000 geeft trouwens:

Afbeeldingslocatie: http://i46.tinypic.com/s5cxax.png

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
Otherside1982 schreef op woensdag 27 januari 2010 @ 10:56:
Ik heb samen met een collega een toepassing gemaakt voor een klant. Die collega werkt nu ergens anders aan een ander project en ik volg het project verder op bij de klant en doe bugfixes.
Wat is er slecht aan de code? Het feit dat het anders werkt dan dat de klant verwacht?

http://hawvie.deviantart.com/

Pagina: 1 ... 20 ... 103 Laatste

Dit topic is gesloten.

Let op:
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes. :)