SQL Server. Verkeerde topic.quote:Op woensdag 2 september 2009 08:00 schreef ReWout het volgende:
Ik heb even een vraagje over sql...
Ik zit met 't volgende probleem. Namelijk ik heb een tabel, laten we deze even y noemen. Deze heeft 2 velden.
id en naam. Nu kan een naam gekoppeld zijn aan 1 of meerdere andere namen in dezelfde tabel...
Dus gewoon een koppeltabel...
id_1 id_2
die beiden eigenlijk verwijzen naar de de eerste rij van de vorige tabel. Nu is mijn vraag.
Kan ik hier oor foreign key constraints op gebruiken? Ik probeer dit namelijk bij sql server maar lukt niet echt
Yup id in y is natuurlijk primary key. Mag ook geen null hebben en types zijn 't zelfde.quote:Op woensdag 2 september 2009 08:37 schreef Tuvai.net het volgende:
[..]
SQL Server. Verkeerde topic.
-> Het grote (?) .NET en MSSQL topic
Maar goed, wat gebruik je als ids? ints / bigints of uniqueidentifiers? De kolomtypes waar je de foreign key constraints op legt (dus de id kolom van je 'y' tabel en het betreffende id veld in je koppeltabel) dienen wel hetzelfde te zijn. Is het id veld van je 'y'-tabel wel primary key? Welke error krijg je overigens?
quote:Op woensdag 2 september 2009 08:37 schreef Tuvai.net het volgende:
Welke error krijg je overigens?
quote]quote:Op woensdag 2 september 2009 11:56 schreef ReWout het volgende:
nvm. heb 't al was een fout in 't schema.
1 2 3 4 5 | (id,bestelId,eigId,aantal,prijs) VALUES(0,'".$bestelId."','".$k."','".$v."',". SELECT prijs FROM eigenschappen WHERE id=$k .")"; |
Ja.quote:Op woensdag 2 september 2009 22:51 schreef Swetsenegger het volgende:
Kan je in een insert query een select subquery inbouwen?
voorbeeld
[ code verwijderd ]
Maar dan werkend
1 2 3 | (id, bestelId, eigId, aantal, prijs) VALUES(0, '".$bestelId."', '".$k."', '".$v."', (SELECT prijs FROM eigenschappen WHERE id=".$k.")) |
Handig spulquote:Op donderdag 3 september 2009 10:19 schreef Chandler het volgende:
vanaf welke versie (mysql) werken subqueries eingelijk?
Er zijn genoeg situaties waarin een subquery sneller is dan dezelfde data ophalen zonder subquery.quote:Op donderdag 3 september 2009 11:28 schreef Mordreth het volgende:
[..]
Handig spul. Vertraagdt de boel wel flink.
Dat dus.quote:Op donderdag 3 september 2009 12:43 schreef GlowMouse het volgende:
[..]
Er zijn genoeg situaties waarin een subquery sneller is dan dezelfde data ophalen zonder subquery.
Ook bij SELECTs kan een subquery sneller zijn.quote:Op donderdag 3 september 2009 12:45 schreef Tuvai.net het volgende:
[..]
Dat dus.
Om actuele data uit een andere tabel/record op te halen is een subquery ideaal bij een insert/update. Sowieso sneller dan de data zonder subquery ergens ophalen (en nog erger, dat IN je applicatie doen, buiten je database) en dan weer verwerken.
quote:Op donderdag 3 september 2009 18:57 schreef Darkomen het volgende:
Oke, ook ik zit met een mysql datum probleempje.
Ik probeer te checken of er al een afspraak is op een bepaalde tijdstip op een dag.
Na diverse opties geprobeerd te hebben dacht ik een werkende te hebben, maar na 2 weken niks gedaan te hebben (cursus) werkt de check ineens niet meer?
$sql = "SELECT aid, begin_stamp, eind_stamp FROM agenda WHERE (begin_stamp BETWEEN $beginDag AND $eindDag) AND ( (begin_stamp=<$eindStamp) (eind_stamp>=$beginStamp ) ) ORDER BY begin_stamp";
Ik begin door alleen de dag te selecteren, '(begin_stamp BETWEEN $beginDag AND $eindDag) '
en daarna te controleren of er een afspraak is.
Die levert bijvoorbeeld zo'n query op.
Afspraak Begin Dag: 03-09-2009, 00:00:00 1251928800
Afspraak Eind Dag: 04-09-2009, 00:00:00 1252015200
Nieuwe Afspraak Begin Stamp: 03-09-2009, 09:55:00 1251964500
Nieuwe Afspraak Eind Stamp: 03-09-2009, 10:10:00 1251965400
[SELECT aid, begin_stamp, eind_stamp FROM agenda WHERE aid<>18 AND (begin_stamp BETWEEN 1251928800 AND 1252015200) AND ( (begin_stamp BETWEEN 1251964500 AND 1251965400) OR (eind_stamp BETWEEN 1251964500 AND 1251965400) ) ORDER BY begin_stamp]
Deze check komt ook bij een update, mocht de tijd zijn aangepast.
Maar dan alleen worde aid toegevoegd.
1 |
En:quote:Op donderdag 3 september 2009 19:16 schreef Tuvai.net het volgende:
[..]
[ code verwijderd ]
Hoort er geen AND / OR te staan bij die sterretjes?
Niet per definitie met PHP. Je zorgt gewoon dat je één tabel categorieën hebt met daarin een veld ParentID. ParentID verwijst weer naar het ID van een ander record in diezelfde tabel.quote:Op donderdag 3 september 2009 21:39 schreef wobbel het volgende:
Op dit moment heb ik een zelfgeschreven webshop met een tabel Categorieen en tabel Subcategorieen...
Graag zou ik het willen maken dat je oneindig veel categorieen kan maken (in de praktijk 3 of 4 dus)
Hoe ga je dat oplossen met PHP? ik kan er geen tutorials over lezen...
En dat is juist het moeilijke....hoe kom ik erachter welke categorie waarin hoort en hoe kan ik dat makkelijk weergeven...Want ik zou wel ontiegelijk veel query's moeten uithalen om dat dan weer te geven...quote:Op donderdag 3 september 2009 21:42 schreef Tuvai.net het volgende:
[..]
Niet per definitie met PHP. Je zorgt gewoon dat je één tabel categorieën hebt met daarin een veld ParentID. ParentID verwijst weer naar het ID van een ander record in diezelfde tabel.
Afhankelijk van (wat je presenteert in) je applicatie, zul je bijvoorbeeld wel een 'recursieve functie' moeten schrijven als je een pagina hebt waar je de hele 'boomstructuur' van categorieën wilt weergeven.
Dat doe je dus met die ParentID kolom. Door rij ID 2 een ParentID van 1 te geven, wil dus zeggen dat rij ID 2 'onder' rij ID 1 ligt. Maak je nóg een record, maar dan met ParentID 2, dan leg je deze record 'onder' rij ID 2.quote:Op donderdag 3 september 2009 21:53 schreef wobbel het volgende:
En dat is juist het moeilijke....hoe kom ik erachter welke categorie waarin hoort
Het klinkt moeilijker dan het lijkt. In feite neem je gewoon de volgende stappen:quote:Op donderdag 3 september 2009 21:53 schreef wobbel het volgende:
En dat is juist het moeilijke....hoe kom ik erachter welke categorie waarin hoort en hoe kan ik dat makkelijk weergeven...Want ik zou wel ontiegelijk veel query's moeten uithalen om dat dan weer te geven...
Zal iets bij het copy/pasten fout gegaan zijn, er staat een or.quote:Op donderdag 3 september 2009 19:16 schreef Tuvai.net het volgende:
[..]
[ code verwijderd ]
Hoort er geen AND / OR te staan bij die sterretjes?
Dat werkt, maar is niet efficient. Een goede regel is dat je geen queries in loopjes uitvoert. Er kan altijd een reden zijn om daarvan af te wijken, maar voor iets als een menu (dat op iedere pagina terugkomt) lijkt me dat geen goed uitgangspunt.quote:Op donderdag 3 september 2009 22:10 schreef Tuvai.net het volgende:
[..]
Dat doe je dus met die ParentID kolom. Door rij ID 2 een ParentID van 1 te geven, wil dus zeggen dat rij ID 2 'onder' rij ID 1 ligt. Maak je nóg een record, maar dan met ParentID 2, dan leg je deze record 'onder' rij ID 2.
[..]
Het klinkt moeilijker dan het lijkt. In feite neem je gewoon de volgende stappen:
1) Maak een functie, die a.h.v. een ID, alle 'child' records ophaalt van dat ID. Oftewel, alle records ophalen waar de ParentID kolom gelijk staat aan de ID parameter die je mee stuurt naar je functie.
2) Als je door die records heen gaat loopen ( while($bla = mysql_fetch_array($QueryVanStapEen) ), roep je per iteratie (oftewel voor elke rij) wéér je functie aan, maar dit keer met het ID van de record die je aan het loopen bent, als parameter voor de functie.
Op dat moment is je functie dus 'recursief' (oftewel, blijft zichzelf aanroepen totdat je geen loopjes meer hebt).
Er zijn meerdere methodes om dit te doen. Maar dit vind ik persoonlijk in ieder geval de makkelijkste. Je kunt altijd naderhand nog zelf naar een 'moeilijkere' op zoek gaan die beter is voor de performance van je applicatie (want ja, deze methode haalt veel queries in één keer op).
Zie daarom dat laatste stukje tekst.quote:Op donderdag 3 september 2009 23:44 schreef Light het volgende:
[..]
Dat werkt, maar is niet efficient. Een goede regel is dat je geen queries in loopjes uitvoert. Er kan altijd een reden zijn om daarvan af te wijken, maar voor iets als een menu (dat op iedere pagina terugkomt) lijkt me dat geen goed uitgangspunt.
Dan zou ik het toch anders doen. Gewoon in 1 query alle menu-items ophalen en daar in 1 lus een tweedimensionale array van maken.quote:Op donderdag 3 september 2009 23:46 schreef Tuvai.net het volgende:
[..]
Zie daarom dat laatste stukje tekst. :P Ik weet dat er duizend en één efficientere (doch vaak meer complexe) methodes zijn, maar lijkt me niet zo handig om daar een beginneling meteen mee te confronteren. Nogmaals, bovenstaand voorbeeld is kinderlijk eenvoudig en voor een leek heel snel onder de knie te krijgen.
1 2 3 4 5 6 | $result = mysql_query('SELECT * FROM menu'); while($row = mysql_fetch_assoc($result)) { $menu[$row['parentId']] = $row; } ?> |
Zo do ik het dus ook vaak. Nog vaker heb ik dat je niet default al de hele boom wilt laten zien en een hele lap records / resultset naar je applicatie wilt trekken, maar alleen de hoofd nodes en bij het openklappen pas child nodes wilt zien. In zo'n geval wil ik ook nog wel eens AJAX gebruiken om het lijsje met onderliggende nodes op te halen.quote:Op vrijdag 4 september 2009 00:19 schreef Light het volgende:
[..]
Dan zou ik het toch anders doen. Gewoon in 1 query alle menu-items ophalen en daar in 1 lus een tweedimensionale array van maken.
[ code verwijderd ]
Dan heb je alleen nog een recursieve oplossing nodig voor het weergeven van het menu.
Je zult die informatie toch bij moeten houden. Je kunt het laatste bezoek bijhouden zodat je alleen maar nieuwe records op te vragen sinds het laatste bezoek.quote:Op zaterdag 5 september 2009 08:29 schreef Sjoe538 het volgende:
Het loggen van een persoon in de database met een datum/tijd/logged/gebruiker bij elke page refresh uitlezen of er een nieuwe record is bijgekomen én dit niet de user is die momenteel op de site zit én er (vandaag, dit uur, afgelopen 10 minuten) nog geen melding is gegeven dat deze persoon online is gekomen lijkt me omslachtig.
Heeft iemand hier een goed idee voor?
Ik zou beginnen met je sessies in de database op te slaan, dan ben je al een heel eind met bezoekers identificerenquote:Op zaterdag 5 september 2009 08:29 schreef Sjoe538 het volgende:
Ik heb een vraagje omtrent gebruikers die je site bezoeken (let op geregistreerd).
Wat ik aan het maken ben is een soort van hyves popup zoals je ziet wanneer iemand online komt. (als iemand een verwijzing naar zo'n dergelijk script heeft graag de URL)
Mijn probleem zit in het herkennen dat de gebruiker die de site bezoekt niet de gebruiker is die momenteel op de site zit. Zo heb ik niks aan de standaard PHP variablen als een IP uitlezen want ik kan deze niet vergelijken omdat je altijd de IP terug krijgt van de persoon die nu op de site zit.
Het loggen van een persoon in de database met een datum/tijd/logged/gebruiker bij elke page refresh uitlezen of er een nieuwe record is bijgekomen én dit niet de user is die momenteel op de site zit én er (vandaag, dit uur, afgelopen 10 minuten) nog geen melding is gegeven dat deze persoon online is gekomen lijkt me omslachtig.
Heeft iemand hier een goed idee voor?
Idd zo ver was ik al, alleen hoopte ik dat er een makkelijkere manier was, aangezien PHP server side werkt, ik hoopte dat het mogelijk moest zijn om alle sessies uit te lezen die momenteel open staan.quote:Op zaterdag 5 september 2009 11:53 schreef Xcalibur het volgende:
[..]
Ik zou beginnen met je sessies in de database op te slaan, dan ben je al een heel eind met bezoekers identificeren
Hadden jullie nog een idee, volgens mij is het niet zo lang geleden langsgekomen in de topics, alleen heb ik het toen niet gevolgdquote:Op donderdag 3 september 2009 18:57 schreef Darkomen het volgende:
Oke, ook ik zit met een mysql datum probleempje.
Ik probeer te checken of er al een afspraak is op een bepaalde tijdstip op een dag.
Na diverse opties geprobeerd te hebben dacht ik een werkende te hebben, maar na 2 weken niks gedaan te hebben (cursus) werkt de check ineens niet meer?
$sql = "SELECT aid, begin_stamp, eind_stamp FROM agenda WHERE $aid (begin_stamp BETWEEN $beginDag AND $eindDag) AND ( (begin_stamp BETWEEN $beginStamp AND $eindStamp) OR (eind_stamp BETWEEN $beginStamp AND $eindStamp) ) ORDER BY begin_stamp";
Ik begin door alleen de dag te selecteren, '(begin_stamp BETWEEN $beginDag AND $eindDag) '
en daarna te controleren of er een afspraak is.
Die levert bijvoorbeeld zo'n query op.
Afspraak Begin Dag: 03-09-2009, 00:00:00 1251928800
Afspraak Eind Dag: 04-09-2009, 00:00:00 1252015200
Nieuwe Afspraak Begin Stamp: 03-09-2009, 09:55:00 1251964500
Nieuwe Afspraak Eind Stamp: 03-09-2009, 10:10:00 1251965400
[SELECT aid, begin_stamp, eind_stamp FROM agenda WHERE aid<>18 AND (begin_stamp BETWEEN 1251928800 AND 1252015200) AND ( (begin_stamp BETWEEN 1251964500 AND 1251965400) OR (eind_stamp BETWEEN 1251964500 AND 1251965400) ) ORDER BY begin_stamp]
Deze check komt ook bij een update, mocht de tijd zijn aangepast.
Maar dan alleen worde aid toegevoegd.
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 | <status result="ok"> <ewallet> <id>45177</id> <status>completed</status> <created>20090906135439</created> <modified/> </ewallet> <customer> <currency>EUR</currency> <amount>1595</amount> <exchange_rate>1</exchange_rate> <firstname>Naam</firstname> <lastname>Achternaam</lastname> <city>Woonplaats</city> <state/> <country>NL</country> <countryname>Netherlands</countryname> </customer> <transaction> <id>6</id> <currency>EUR</currency> <amount>1595</amount> <description>Webshop order</description> <var1/> <var2/> <var3/> <items/> </transaction> </status> |
1 |
1 2 | preg_match('/\<id\>(.*)\<\/id\>/U', $transaction[1], $id); |
1 2 3 | preg_match('/\<transaction\>.*\<id\>(.*)\<\/id\>.*\<\/transaction\>/U', $reply, $id); ?> |
Doe je die HTML eerst replacen? Gooi eens een htmlentities / htmlspecialchars over je HTML data die je in je XML node stopt heen.quote:Op zondag 6 september 2009 22:31 schreef Swetsenegger het volgende:
xml functies ga ik even naar kijken.
Iemand trouwens ervaring met multisafepay? In de documentatie staat dat je in een bepaald element van de transaction request (XML) een uitgebreide beschrijving mee kan geven van de bestelling. Er staat letterlijk "Uitgebreide beschrijving (HTML)". Maar zodra ik HTML embed in het xml element krijg ik de melding terug dat het een fout XML bericht is.
Nou staan geen rare dingen in, gewoon een tabel met wat data.quote:Op zondag 6 september 2009 23:11 schreef Tuvai.net het volgende:
[..]
Doe je die HTML eerst replacen? Gooi eens een htmlentities / htmlspecialchars over je HTML data die je in je XML node stopt heen. :)
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 | <redirecttransaction ua="custom-1.2"> <merchant> <account>1000000</account> <site_id>1000</site_id> <site_secure_code>100000</site_secure_code> <notification_url>http://www.domein.nl:80//notificatie.php?type=initial</notification_url> </merchant> <customer> <locale>nl_NL</locale> <ipaddress>255.255.255.255</ipaddress> <forwardedip></forwardedip> <firstname>Naam</firstname> <lastname>Naam</lastname> <address1>Adres</address1> <address2></address2> <housenumber>10</housenumber> <zipcode>1000 AA</zipcode> <city>Stad</city> <state></state> <country>NL</country> <phone></phone> <email>mail@domain.com</email> </customer> <transaction> <id>36</id> <currency>EUR</currency> <amount>1999</amount> <description>Bestelling 36 bij Webshop. U kunt de status van uw bestelling bekijken als u inlogged op onze website.</description> <var1></var1> <var2></var2> <var3></var3> <items> <table style="border-collapse:collapse;width:100%;text-align:center"> <tr style="color:black;font-size:9pt;"> <td style="border-style:solid;border-width:1px 0 1px 1px;border-color:rgb(160,166,176)">Aantal</td> <td style="border-style:solid;border-width:1px 0;border-color:rgb(160,166,176)">Artikelcode</td> <td style="border-style:solid;border-width:1px 0;border-color:rgb(160,166,176)">Artikel</td> <td style="border-style:solid;border-width:1px 0;border-color:rgb(160,166,176)">Kleur</td> <td style="border-style:solid;border-width:1px 0;border-color:rgb(160,166,176)">Maat</td> <td style="border-style:solid;border-width:1px 0;border-color:rgb(160,166,176)">Prijs</td> </tr> <tr style="background-color:white;font-size:11pt;"> <td style="width:45px;">1</td> <td style="width:75px;">001</td> <td style="width:250px;">Mexx - Zomershirt</td> <td style="margin:5px;width:10px;background-color:#FF0011"></td> <td style="width:250px;">Small</td> <td>19,99</td> </tr> </table> <br /> <table style="width:100%;border:solid 1px rgb(160,166,176);text-align:left;"> <tr> <td style="color:black;font-size:11pt;">Prijs:</td> <td style="width:600px;text-align:right;font-size:14pt;color:black;">€ 19,99</td> </tr> </table> </items> <manual>false</manual> <gateway></gateway> <daysactive>2</daysactive> </transaction> <signature>d786a106edf874df4ed6e8cc612e9650</signature> </redirecttransaction> |
Hoeft ook niet. Ligt er maar net aan hoe Multisafepay met de data in die node om gaat. Ik kan me herinneren dat ik wel eens RSS feeds heb moeten maken, en de HTML die in de <description> node stond moest parsen als reeds vervangen HTML.quote:Op zondag 6 september 2009 23:18 schreef Swetsenegger het volgende:
[..]
Nou staan geen rare dingen in, gewoon een tabel met wat data.
[ code verwijderd ]
Ok.... wat doe ik daaraan? -edit- ow wacht html entities en specialchars natuurlijk. Dat is het proberen waardquote:Op zondag 6 september 2009 23:21 schreef Tuvai.net het volgende:
[..]
Hoeft ook niet. Ligt er maar net aan hoe Multisafepay met de data in die node om gaat. Ik kan me herinneren dat ik wel eens RSS feeds heb moeten maken, en de HTML die in de <description> node stond moest parsen als reeds vervangen HTML.Waarschijnlijk wordt je <table> tag nu bijvoorbeeld als een daadwerkelijke node van het XML bestand geïnterpreteerd.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |