abonnement Unibet Coolblue
  FOK!-Schrikkelbaas donderdag 27 augustus 2009 @ 13:02:12 #1
1972 Swetsenegger
Egocentrische Narcist
pi_72197658

cd niet bijgeleverd

Als je vragen hebt over PHP/MySQL, dan zit je hier goed met een vaste kliek guru's en een groot aantal regelmatige bezoekers. Beperk je vragen niet tot "hij doet het niet" of "hij geeft een fout" - onze glazen bol is kapot en we willen graag van je weten wát er niet lukt en wélke foutmelding je precies krijgt

Vorige delen:
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, 69, 70, 71, 72, 73, 74

Zie ook:
  • PHP Dataverwerking
  • Officiële PHP website
  • PHP Documentatie
  • MySQL Reference Manual
  • Yet Another PHP Faq
  • PHP Cheat Sheet
  • PHP5 Power Programming - boek met uitleg over OOP, Pear, XML, etc

    Tutorials:
  • W3Schools PHP
  • W3Schools SQL

    Deze OP en instructies voor nieuw topic: http://wiki.fok.nl/index.php/OP/PHP
  • pi_72197668
    quote:
    Op donderdag 27 augustus 2009 12:58 schreef Swetsenegger het volgende:

    [..]

    35
    [..]

    eh sorry
    Dat gezeik dat de jouwe korter is. I dont care. Als het maar doet wat het moet doen en duidelijk is.
    Ik kan wel een compact script schijven van 10 regels en dat nu begrijpen. Maar ik moet het over een jaar nog steeds begrijpen als ik het weer in zie omdat er iets aangepast moet worden. Dan schrijf ik liever een duidelijk script van 20 regels wat ik na een jaar meteen weer snap door de duidelijkheid en nodige comments
    pi_72197678
    quote:
    Op donderdag 27 augustus 2009 13:00 schreef GlowMouse het volgende:
    Ha ha, nu moet jij een nieuwe aanmaken.
    Lol
    pi_72197699
    pi_72197717
    tvp
      FOK!-Schrikkelbaas donderdag 27 augustus 2009 @ 13:05:52 #6
    1972 Swetsenegger
    Egocentrische Narcist
    pi_72197739
    quote:
    Op donderdag 27 augustus 2009 13:02 schreef Moozzie het volgende:

    [..]

    Dat gezeik dat de jouwe korter is.
    Zeiken Hij vraagt commentaar ik zeg dat het script me in eerste instantie wat lang leek en geef direct aan dat ik niet inhoudelijk gekeken heb. Vervolgens geeft hij aan nieuwsgierig te zijn.
    quote:
    I dont care.
    Nou gelet op je overtrokken reactie blijkbaar wel.
    quote:
    Als het maar doet wat het moet doen en duidelijk is.
    Ik kan wel een compact script schijven van 10 regels en dat nu begrijpen. Maar ik moet het over een jaar nog steeds begrijpen als ik het weer in zie omdat er iets aangepast moet worden. Dan schrijf ik liever een duidelijk script van 20 regels wat ik na een jaar meteen weer snap door de duidelijkheid en nodige comments
    Ja, ik heb volgens mij nergens a. een waarde oordeel aan het script gehangen of b. aanleiding gegeven om voor jou te denken dat ik er anders over denk.

    Doe ff normaal.
    pi_72197818
    quote:
    Op donderdag 27 augustus 2009 12:58 schreef GlowMouse het volgende:

    [..]

    Beter: je returnt de data die je nodig hebt voor de output. Serieus, als ik zo'n script tegenkom als het jouwe dan begin ik liever opnieuw.

    En Chandler: voorkom toepassen van functies op kolomnamen omdat dat niet indexeerbaar is.
    Doel je op de date_format? kun je eens meer info geven?

    @Swets; mijn class is bedoeld om de data uit te lezen en eventueel in te voeren, zo beknopt maar flexibel mogelijk. Meer heeft een poll eingelijk niet nodig.
    Just say hi!
      FOK!-Schrikkelbaas donderdag 27 augustus 2009 @ 13:09:08 #8
    1972 Swetsenegger
    Egocentrische Narcist
    pi_72197841
    Ik heb een vraagje. Ik heb een site die wat tweets naar twitter verstuurt. En in die tweets staat een euro teken. Nu doe ik dat met & euro; zodat ik een crossplatform euroteken krijg. Maar.... voor twitter zijn ook allerlei desktop applicaties en die zijn in de regel NIET webbased. En in plaats van een mooi teken zie die nu dus de html entity.

    Zend dan gewoon het euroteken daadwerkelijk mee, maar dan heb ik het probleem dat een ¤ er op bv OSX of Linux er als æ ofzo uitziet.

    Hoe krijg ik een cross platform, cross applicatie euroteken?
      donderdag 27 augustus 2009 @ 13:10:28 #9
    75592 GlowMouse
    l'état, c'est moi
    pi_72197886
    bv.
    UNIX_TIMESTAMP(date_started) < ....
    omschrijven naar
    date_started < FROM_UNIXTIME(...)

    en
    UNIX_TIMESTAMP(date_started) < NOW()
    klopt niet eens: NOW() is geen unix timestamp.
    eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
      FOK!-Schrikkelbaas donderdag 27 augustus 2009 @ 13:11:02 #10
    1972 Swetsenegger
    Egocentrische Narcist
    pi_72197908
    quote:
    Op donderdag 27 augustus 2009 13:08 schreef Chandler het volgende:

    @Swets; mijn class is bedoeld om de data uit te lezen en eventueel in te voeren, zo beknopt maar flexibel mogelijk. Meer heeft een poll eingelijk niet nodig.
    Het was geen kritiek hoor, het viel me op.
    pi_72197919
    quote:
    Op donderdag 27 augustus 2009 11:38 schreef Swetsenegger het volgende:

    Ik heb een vraagje. Ik heb een site die wat tweets naar twitter verstuurt. En i9n die tweets staat een euro teken. Nu doe ik dat met & euro; zodat ik een crossplatform euroteken krijg. Maar.... voor twitter zijn ook allerlei desktop applicaties en die zijn in de regel NIET webbased. En in plaats van een mooi teken zie die nu dus de html entity.

    Zend dan gewoon het euroteken daadwerkelijk mee, maar dan heb ik het probleem dat een ¤ er op bv OSX of Linux er als æ ofzo uitziet.

    Hoe krijg ik een cross platform, cross applicatie euroteken?
    Twitter gebruikt UTF-8 (iig voor de website). Dan zou je dus zonder problemen ¤ moeten kunnen gebruiken en heb je geen html entity nodig.
      FOK!-Schrikkelbaas donderdag 27 augustus 2009 @ 13:14:29 #12
    1972 Swetsenegger
    Egocentrische Narcist
    pi_72198008
    quote:
    Op donderdag 27 augustus 2009 13:11 schreef Light het volgende:

    [..]

    Twitter gebruikt UTF-8 (iig voor de website). Dan zou je dus zonder problemen ¤ moeten kunnen gebruiken en heb je geen html entity nodig.
    Ja, maar desktop apps zijn niet altijd UTF-8. Dus krijg ik op OSX in een twitter app bv geen ¤ te zien. Ik vraag me af of ik niet wat in ASCII kan doen ofzo.

    -edit- hoewel ik nu in m'n blackberry keurig een ¤ te zien krijg. Toen ik de ¤ er op mijn apple in had geplakt was dat niet zo. Blijkbaar staat mijn apple omgeving niet op UTF-8 ingesteld. Vanavond eens kijken.

    [ Bericht 12% gewijzigd door Swetsenegger op 27-08-2009 13:21:54 ]
    pi_72198646
    quote:
    Op donderdag 27 augustus 2009 10:34 schreef Chandler het volgende:
    Mag ik commentaar op mijn class? wil nameljik leren en juist door te spelen leer ik dus.

    PS ik gebruik mijn eigen mysql class, deze werkt nog niet middels PDO maar komt ooit nog
    [ code verwijderd ]
    Der zijn wel een hoop dingen die ik anders zou doen.
    Ik ga het niet allemaal in 1 keer opneurien want heb wel meer te doen

    Vandaag bij aflevering 1 van wat zou moozzie doen zullen we het hebben over je database.
    Let op! Dit is wat ik zou doen, wil niet altijd zeggen dat het beter is.

    Even voor de gemak jouw database erbij pakken

    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
    tinyPoll
      id            (int)
      title         (varchar * 64)
      comment       (text)
      date_started  (date)
      date_ended    (date)
      answers       (tinyint)
      votes         (int)
      views         (int)
      
    tinyPollAnswers
       id           (int)
       pollID       (int)
       answer       (varchar * 64)
       votes        (int)

    tinyPollVotesIp
       id           (int)
       ip           (varchar * 64)
       hostname     (varchar * 128)

    tinyPollVotes
       ipID         (int)
       pollID       (int)
       answerID     (int)
       votedate     (date)


    Jouw benaming vind ik dus ronduit bagger.
    Het lijkt misschien leuk maar jij hebt in bijna elke tabel een 'id' veld.
    Greaaat... dan krijg je dus dingen als dit (let op dit is je eigen query)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
        tinyPoll.id
    FROM
        tinyPoll
        LEFT JOIN tinyPollAnswers ON tinyPollAnswers.pollID = tinyPoll.id
    WHERE
            tinyPoll.id = '" . $this->db->escape($pollID) . "'
        AND tinyPollAnswers.id = '" . $this->db->escape($answerID) . "'
        AND UNIX_TIMESTAMP(date_ended) >  NOW()
    LIMIT 1

    Nu krijg je dus tinyPoll.id, tinyPollAnswers.id etc.
    En wil je die 2 velden ophalen moet je ze nog hernamen ook (tinyPollAnswers.id AS answer_id etc)

    Dit is hoe ik je tabellen zou noemen

    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
    tiny_poll
      tpo_id
      tpo_title
      tpo_comment
      tpo_date_started
      tpo_date_ended
      tpo_answers
      tpo_votes
      tpo_views
      
    tiny_poll_answer
       tpa_id
       tpa_tpo_id
       tpa_answer
       tpa_votes

    tiny_poll_votes_ip
       tpi_id
       tpi_ip
       tpi_hostname

    tiny_poll_vote
       tpv_tpi_id
       tpv_tpo_id
       tpv_tpa_id
       tpv_votedate


    Note: ik hou er niet van om me tabellen aan elkaar te schrijven omdat als je dan een lijst hebt van 100 tabellen onder elkaar in phpmyadmin het best onoverzichtelijk lezen is. Ik doe er altijd een _ tussen als spatie wat een net iets overzichterlijker lijstje maakt in phpmyadmin. Je kan natuurlijk tinyPoll houden etc als je dat wilt. Dat is verders net zo goed. Waar het me in dit voorbeeld omgaat is de benaming van je velden en niet je tabellen.

    Oke wat ik heb gedaan is voor elk veld de afkorting van de tabel gezet.
    Het id van de tabel tiny_poll heet nu dus tpo_id

    Als ik naar een record in de tabel tiny_poll wil refereren doe ik dus met xxx_tpo_id (xxx = de prefix van de tabel waar dit veld in staat)
    De tabel tiny_poll_vote is een mooi voorbeeld.
    tpv_tpi_id refereert naar tpi_id uit de tabel tiny_poll_votes_ip etc

    Nu zou je query er zo uitzien

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
        tpo_id
    FROM
        tiny_poll
        LEFT JOIN tiny_poll_answer ON tpa_tpo_id = tpo_id
    WHERE
            tpa_tpo_id = '" . $this->db->escape($pollID) . "'
        AND tpa_id = '" . $this->db->escape($answerID) . "'
        AND UNIX_TIMESTAMP(tpo_date_ended) >  NOW()
    LIMIT 1


    Wat vind ik de voordelen?
    - Je hebt nooit dubbele velden
    - Je hoeft niet de tabel naam op te schrijven als je dubbele velden hebt (zoals id bij jou)
    - Het joinen van tabellen (tpa_tpo_id = tpo_id) is lekker makkelijk.
    - Je kan elk veld selecten zonder dat je het hoeft te hernamen. Wat als gevolg dus heeft dat je overal in het script dus tpo_id kan gebruiken ipv dat je het in je ene script opslaat als poll_id en in je andere script als PollID.

    Verders over je database
    - Maak je int unsigned, dan kunnen ze langer mee en je votes, id etc kunnen toch niet negatief zijn
    - Zelf ben ik meer van de Char dan varchar (waar kan, in combinatie met een text veld gaat dat natuurlijk niet) Char is inderdaad groter in vele gevallen maar je tabel blijft wel fixt length. Waardoor het zoeken dus sneller gaat

    Als je dit al gemieren neuk vind laat ik me comentaar op je class wel achterwegen want dat wordt nog erger
      donderdag 27 augustus 2009 @ 13:43:46 #14
    75592 GlowMouse
    l'état, c'est moi
    pi_72198981
    Wat ids betreft zou ik consequent overal pollid,answerid en ipid gebruiken, maar afgezien daarvan zie ik het probleem niet.

    >> Je hebt nooit dubbele velden
    Zelfde veldnaam is zelfde data, geen probleem dus.
    >> Je hoeft niet de tabel naam op te schrijven als je dubbele velden hebt (zoals id bij jou)
    Alias
    >> Het joinen van tabellen (tpa_tpo_id = tpo_id) is lekker makkelijk.
    USING(id) is nog makkelijker
    >> Je kan elk veld selecten zonder dat je het hoeft te hernamen. Wat als gevolg dus heeft dat je overal in het script dus tpo_id kan gebruiken ipv dat je het in je ene script opslaat als poll_id en in je andere script als PollID.
    Zelfde veldnaam is zelfde data, geen probleem dus.

    >> Zelf ben ik meer van de Char dan varchar (waar kan, in combinatie met een text veld gaat dat natuurlijk niet) Char is inderdaad groter in vele gevallen maar je tabel blijft wel fixt length. Waardoor het zoeken dus sneller gaat
    En er minder in je geheugen past, waardoor het juist heel veel trager wordt.
    eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
    pi_72199088
    quote:
    Op donderdag 27 augustus 2009 13:43 schreef GlowMouse het volgende:
    >> Zelf ben ik meer van de Char dan varchar (waar kan, in combinatie met een text veld gaat dat natuurlijk niet) Char is inderdaad groter in vele gevallen maar je tabel blijft wel fixt length. Waardoor het zoeken dus sneller gaat
    En er minder in je geheugen past, waardoor het juist heel veel trager wordt.
    Mwa dus totaal niet mee eens. Wij hebben hier tabellen met miljoenen records en hadden eerst varchar. De hele boel liep daarop vast omdat het dus dynamic tabellen werden. Door er fixt tabellen van te maken werd de tabel wel groter maar onwijs veel sneller.
      FOK!-Schrikkelbaas donderdag 27 augustus 2009 @ 13:48:37 #16
    1972 Swetsenegger
    Egocentrische Narcist
    pi_72199159
    Zoals hier wel weer uit blijkt is het ook een kwestie van smaak, want ik krijg dus jeuk van dit soort benamingen

    1tpa_tpo_id


    Als we het er dan toch over hebben dat je over een jaar terug leest, snap je in eerste instantie van dit soort afkortingen ook niets meer. ID's per tabel benoemen is met het oog op joins inderdaad wel duidelijker.
    pi_72199211
    quote:
    Op donderdag 27 augustus 2009 13:48 schreef Swetsenegger het volgende:
    Zoals hier wel weer uit blijkt is het ook een kwestie van smaak, want ik krijg dus jeuk van dit soort benamingen
    [ code verwijderd ]

    Als we het er dan toch over hebben dat je over een jaar terug leest, snap je in eerste instantie van dit soort afkortingen ook niets meer. ID's per tabel benoemen is met het oog op joins inderdaad wel duidelijker.
    Het went vanzelf
    Maar ik ga er niet over in discussie. Ik geef mijn vissie en als je het niets lijkt dan probeer je het toch niet
    pi_72199547
    quote:
    Op donderdag 27 augustus 2009 13:10 schreef GlowMouse het volgende:
    bv.
    UNIX_TIMESTAMP(date_started) < ....
    omschrijven naar
    date_started < FROM_UNIXTIME(...)

    en
    UNIX_TIMESTAMP(date_started) < NOW()
    klopt niet eens: NOW() is geen unix timestamp.
    Lol, ik gebruikte altijd unix_timestamp icm now() maar weet dat unix_timestamp nogal heerlijk sloom is qua functie...

    dus zo zou het goed moeten zijn.

    1date_started =< FROM_UNIXTIME(NOW(), '%Y-%m-%d')

    @Moozzie:
    Bedankt voor je reactie, zelf vind ik jou opzet qua tabellen namen erg onoverzichtelijk, om overal maar een _ na te zetten. Je hebt wel een punt met tinyPoll_Answers etc...
    Netzoals swets vind ik dat je een script over een jaar nog moet kunnen begrijpen, en in dit geval maakt het weinig uit welke namen de cellen hebben aangezien het script ze eenmalig uitleest en returned aan het script at deze class/functie aanroept. Verder zullen deze tabellen ook niet gebruikt worden anders dan via deze class.

    Ook blijf ik kiezen voor varchar aangezien de velden die geinsert worden qua data niet veranderd gaan worden (ip, hostname, titel, antwoord(en) en comment) en denk dat het nogal scheelt als je 1000 votes per dag hebt.

    Ik zou graag meer mierengeneuk zien op de class aangezien ik daar nog steeds niet erg handig in ben en vaak het nut en de logica er niet van snap

    @GlowMouse:
    Ben het dus ook aardig met jou eens m.b.t using en de tabel/cell namen

    @Swets:

    Dat heb ik dus ook, je moet eerst het gehele script doorlezen wil je weten waar welke afkorting voor staat

    @Moozzie:

    Graag zie ik meer van je visie; om zo mijn visie eventueel te versterken en of aan te passen (lijkt wel scripten zo )

    [ Bericht 40% gewijzigd door Chandler op 27-08-2009 14:11:05 ]
    Just say hi!
    pi_72199603
    quote:
    Op donderdag 27 augustus 2009 13:48 schreef Swetsenegger het volgende:
    Zoals hier wel weer uit blijkt is het ook een kwestie van smaak, want ik krijg dus jeuk van dit soort benamingen
    [ code verwijderd ]
    Eens.

    Verder ben ik van mening dat je databasevelden moeten kloppen qua naam. Een veld met een ID noem je dus id, en niet weetikveelwat_id. Aangezien de ID in een tabel staat weet je al waar het om gaat. Ja, dan moet je het wel een je query fixen, so what?

    In de praktijk maakt het weinig uit natuuriljk, net wat je gewend bent. Als het maar consequent is
    In de ene tabel ID gebruiken en in de andere tabel TabelID is echt killing...
      donderdag 27 augustus 2009 @ 14:29:30 #20
    75592 GlowMouse
    l'état, c'est moi
    pi_72200667
    >> date_started =< FROM_UNIXTIME(NOW(), '%Y-%m-%d')
    nee, het moet zijn date_started <= NOW()

    >> Ook blijf ik kiezen voor varchar aangezien de velden die geinsert worden qua data niet veranderd gaan worden (ip,
    ip kan (ipv6 buiten beschouwing latend) best in een int mbv INET_ATON

    >> Wij hebben hier tabellen met miljoenen records en hadden eerst varchar. De hele boel liep daarop vast omdat het dus dynamic tabellen werden. Door er fixt tabellen van te maken werd de tabel wel groter maar onwijs veel sneller.
    Had je een hoop updates? Het kan zijn dat je rijen gefragmenteerd werden. En als je varchar(255) gebruikte en nu char(100) omdat je wel op lengte let, maakt dat ook behoorlijk uit, bv als je in geheugen sorteert.
    eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
    pi_72200817
    quote:
    Op donderdag 27 augustus 2009 14:29 schreef GlowMouse het volgende:
    >> date_started =< FROM_UNIXTIME(NOW(), '%Y-%m-%d')
    nee, het moet zijn date_started <= NOW()

    >> Ook blijf ik kiezen voor varchar aangezien de velden die geinsert worden qua data niet veranderd gaan worden (ip,
    ip kan (ipv6 buiten beschouwing latend) best in een int mbv INET_ATON

    >> Wij hebben hier tabellen met miljoenen records en hadden eerst varchar. De hele boel liep daarop vast omdat het dus dynamic tabellen werden. Door er fixt tabellen van te maken werd de tabel wel groter maar onwijs veel sneller.
    Had je een hoop updates? Het kan zijn dat je rijen gefragmenteerd werden. En als je varchar(255) gebruikte en nu char(100) omdat je wel op lengte let, maakt dat ook behoorlijk uit, bv als je in geheugen sorteert.
    Nope het ging fout bij de selects
      donderdag 27 augustus 2009 @ 14:35:15 #22
    75592 GlowMouse
    l'état, c'est moi
    pi_72200882
    na updates gaat het fout bij selects ja, bij rij-fragmentatie.
    eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
    pi_72200956
    quote:
    Op donderdag 27 augustus 2009 14:35 schreef GlowMouse het volgende:
    na updates gaat het fout bij selects ja, bij rij-fragmentatie.
    Nee de records werden niet geupdate
    Er werden alleen inserts op uitgevoerd om um te vullen en selects om te bekijken. Maar de selects waren te traag. na de tabel fixt length te hebben gemaakt liep het gesmeerd
    pi_72201896
    Tnx GlowMouse heb de aanpassingen doorgevoerd en blijkt goed te werken
    Just say hi!
    pi_72203989
    Ik heb gelijk de functie createPoll en listPolls toegevoegd, weer een handige class voor mijn verzameling
    Just say hi!
    abonnement Unibet Coolblue
    Forum Opties
    Forumhop:
    Hop naar:
    (afkorting, bv 'KLB')