abonnement Unibet Coolblue Bitvavo
  vrijdag 29 november 2013 @ 22:35:58 #251
187069 slacker_nl
Sicko pur sang
pi_133759561
quote:
0s.gif Op vrijdag 29 november 2013 22:33 schreef Light het volgende:

[..]

Een database kan prima floats en doubles opslaan, maar de exacte waarde die je opslaat is niet de waarde die je terugkrijgt. Floats en doubles kunnen namelijk niet ieder getal exact weergeven. 1,99 wordt dan misschien 1,9899999999. En dat gaat vroeg of laat afrondingsproblemen geven die ook nog eens best lastig te vinden zijn. Bij financiele informatie is dat niet wenselijk, dus kun je beter met centen rekenen en pas bij weergave afronden.
Jij wilt zeggen dat een postgres of mysql or oracle 1,99 als 1,98999 of als 1,97 teruggeeft? Ik geloof daar geen drol van.
In theory there is no difference between theory and practice. In practice there is.
pi_133759840
quote:
0s.gif Op vrijdag 29 november 2013 22:35 schreef slacker_nl het volgende:

[..]

Jij wilt zeggen dat een postgres of mysql or oracle 1,99 als 1,98999 of als 1,97 teruggeeft? Ik geloof daar geen drol van.
Light overdrijft een beetje, maar heeft wel een puntje.

What Every Computer Scientist Should Know About Floating-Point Arithmetic
Tegenwoordig moet je Dr. Ir. zijn om een beetje correct Nederlands te kunnen neerpleuren.
Abusing semicolons since 1987.
pi_133759912
quote:
0s.gif Op vrijdag 29 november 2013 22:35 schreef slacker_nl het volgende:

[..]

Jij wilt zeggen dat een postgres of mysql or oracle 1,99 als 1,98999 of als 1,97 teruggeeft? Ik geloof daar geen drol van.
Zie bijvoorbeeld ook hier:
http://stackoverflow.com/(...)ion-problem-in-mysql
pi_133759922
quote:
0s.gif Op vrijdag 29 november 2013 22:35 schreef slacker_nl het volgende:

[..]

Jij wilt zeggen dat een postgres of mysql or oracle 1,99 als 1,98999 of als 1,97 teruggeeft? Ik geloof daar geen drol van.
Het is gewoon opletten met wat je doet, bijv round(1.4545,2) geeft 1.45 terug.
pi_133760169
quote:
19s.gif Op vrijdag 29 november 2013 22:43 schreef TwenteFC het volgende:

[..]

Het is gewoon opletten met wat je doet, bijv round(1.4545,2) geeft 1.45 terug.
Het probleem is niet round(), het probleem is die 1.4545 en de nauwkeurigheid daarvan. Als je alleen dat getal hebt, zal het wel goed gaan. Als je spannende berekeningen doet en verschillende getallen gebruikt, kun je een afwijking krijgen.
pi_133760705
Ik maak in ieder geval geen berekeningen, ik krijg een lijst aangeleverd met producten + prijzen, deze insert ik gewoon in een database, maar moet tijdens het showen de prijs + verzendkosten bij elkaar optellen.

Maar laat ook maar, ik zie net dat de prijzen worden aangeleverd in #.##, met punt dus en niet met komma, stom stom stom :)
  zaterdag 30 november 2013 @ 00:11:17 #257
187069 slacker_nl
Sicko pur sang
pi_133763634
quote:
0s.gif Op vrijdag 29 november 2013 21:48 schreef xaban06 het volgende:

[..]

setlocale lijkt geen verandering er in te brengen.
Vreemd, hier wel. Wat is de return value van setlocale? Zie de docs even, daar staan wat nuttige dingen in..
In theory there is no difference between theory and practice. In practice there is.
pi_133799071
Vraagje over mijn database design:

Ik heb een locatie die onderdeel is van een groep en de locatie bevat meerdere ruimtes.
Nu wil ik openingstijden toevoegen en wel op een manier dat de groep de standaard openingstijden bevat voor elke locatie binnen de groep. Een locatie kan afwijkende openingstijden hebben die specifiek aan de locatie gekoppeld moeten worden. En tot slot kan het zijn dat een ruimte nog eigen openingstijden heeft die dan voorgaan.

Ik heb dus de tabellen:
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
CREATE TABLE `group` (
  `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL,
  `name` TINYINT NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `location` (
  `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL,
  `group_id` TINYINT NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `room` (
  `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL,
  `location_id` TINYINT NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `opening_hours` (
  `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL,
  `open_time` TIME NULL DEFAULT NULL,
  `close_time` TIME NULL DEFAULT NULL,
  `weekday` TINYINT NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

Wat is nu de beste manier om de opening_hours aan de betreffende tabellen te koppelen. Ik zie zelf twee opties:
- twee velden toevoegen aan de opening hours, één voor het type tabel waar hij naar linkt (related_type) en één voor het bijbehorende id (related_id). Nadeel hiervan is dat je geen foreign keys kunt gebruiken omdat je niet weet naar welke tabel het related_id veld verwijst.
- Voor elk type een koppelingstabel maken. Dan kan je wel met foreign keys werken, maar krijg je misschien een wildgroei aan tabellen.

Welke van de twee opties is "beter" en waarom?
En zijn er nog andere opties?
pi_133801664
Derde optie: een opening_hours_id toevoegen aan group, location en room welke ook NULL kan zijn.
Schuimpje... mijn liefste. Verlaat mij nimmer weer...
pi_133802186
quote:
3s.gif Op zondag 1 december 2013 13:41 schreef papernote het volgende:
Derde optie: een opening_hours_id toevoegen aan group, location en room welke ook NULL kan zijn.
Opzich ook een mooie oplossing inderdaad, alleen heb ik hier een ander probleem, namelijk dat de openingstijden per dag verschillend kunnen zijn (het weekday veld in opening_hours) Dat betekent dat ieder eigenlijk 7 "openingstijden" heeft. Om nou aan elke tabel zeven velden toe te voegen lijkt me ook niet erg mooi.
pi_133802524
quote:
0s.gif Op zondag 1 december 2013 13:53 schreef Alfje het volgende:

[..]

Opzich ook een mooie oplossing inderdaad, alleen heb ik hier een ander probleem, namelijk dat de openingstijden per dag verschillend kunnen zijn (het weekday veld in opening_hours) Dat betekent dat ieder eigenlijk 7 "openingstijden" heeft. Om nou aan elke tabel zeven velden toe te voegen lijkt me ook niet erg mooi.
Dan kun je beter aan de tabel opening_hours een kolom location_id (of room_id) toevoegen, om aan te geven voor welke locatie die openingstijden gelden. Dan weet je ook zeker dat je voor iedere lokatie de tijden apart kunt aanpassen zonder dat je tijden van andere lokaties verandert.
pi_133882668
quote:
0s.gif Op zondag 1 december 2013 13:53 schreef Alfje het volgende:

[..]

Opzich ook een mooie oplossing inderdaad, alleen heb ik hier een ander probleem, namelijk dat de openingstijden per dag verschillend kunnen zijn (het weekday veld in opening_hours) Dat betekent dat ieder eigenlijk 7 "openingstijden" heeft. Om nou aan elke tabel zeven velden toe te voegen lijkt me ook niet erg mooi.
Als je het echt wilt normaliseren ontkomt je daar niet aan, anders gaat het botsen met je business rules. Wat je nog wel zou kunnen doen is een table "opening schema's" maken waarin je dus verschillende sets van openingstijden kunt definieren, eventueel zou je dat ook weer naar 2 tables kunnen normaliseren met weer een opsplitsing per dag.

Overigens zou ik in dit geval helemaal niet zo ver gaan met normaliseren, wanneer performance niet een groot probleem is, en er bijvoorbeeld geen belangrijke transacties plaatsvinden zou ik de openingstijden gewoon op extra columns zetten zoals dat met NoSQL databases ook gangbaar is.
🕰️₿🕰️₿🕰️₿🕰️₿🕰️₿🕰️ TikTok next Block
pi_133947081
Ik loop alweer tegen een probleem op.
1PHP Fatal error:  Cannot use object of type mysqli_result as array in file.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$productQuery     
"SELECT ean, name FROM products WHERE category = '$category'";
$productResult    $mysqli->query($productQuery);

while (
$productRow $productResult->fetch_assoc()) {
    
$productPriceQuery     "SELECT ean, price+shipmentCost AS totalPrice FROM prices WHERE ean = $productRow[ean] ORDER BY totalPrice ASC";
    
$productPriceResult    $mysqli->query($productPriceQuery);
    
    
$totalPrice            $productPriceResult->fetch_assoc();

    echo 
$productPriceResult["productURL"];
}
?>

Ik krijg de melding op regel 11.
pi_133947270
Beste oplossing (vziw ik uit de context kan halen): gebruik een (LEFT) JOIN.

Oplossing voor jouw snippet: sla de documentatie erop na ;)
quote:
Return Values

Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.


[ Bericht 3% gewijzigd door zoem op 05-12-2013 16:14:03 ]
pi_133947430
quote:
0s.gif Op donderdag 5 december 2013 16:00 schreef zoem het volgende:
Beste oplossing (vziw ik uit de context kan halen): gebruik een JOIN.

Oplossing voor jouw snippet: sla de documentatie erop na ;)

[..]

Ik weet dat het efficienter kan dmv een 1 langere query, maar voor nu wil ik het doen zoals ik het heb, moet ook gewoon kunnen toch?
pi_133947545
quote:
0s.gif Op donderdag 5 december 2013 16:05 schreef xaban06 het volgende:

[..]

Ik weet dat het efficienter kan dmv een 1 langere query, maar voor nu wil ik het doen zoals ik het heb, moet ook gewoon kunnen toch?
Natuurlijk, dat gaat ook werken. Alleen kan het aantal queries dan gigantisch oplopen als je een hele reeks aan producten hebt, waardoor de pagina traag wordt en/of de server het (onnodig) druk kan krijgen bij veel bezoekers.
pi_133947586
quote:
0s.gif Op donderdag 5 december 2013 16:08 schreef zoem het volgende:

[..]

Natuurlijk, dat gaat ook werken. Alleen kan het aantal queries dan gigantisch oplopen als je een hele reeks aan producten hebt, waardoor de pagina traag wordt en/of de server het (onnodig) druk kan krijgen bij veel bezoekers.
Klopt, maar dat is het geval niet :) En ik wil het liever nu werkend hebben dan dat ik me weer moet inlezen, proberen, repareren, proberen, etc etc. Kost erg veel tijd voor nu :)

Wat is er precies fout in mijn script?
  FOK!mycroftheld donderdag 5 december 2013 @ 16:10:23 #268
128465 Wrapster
pi_133947613
quote:
0s.gif Op donderdag 5 december 2013 16:08 schreef zoem het volgende:

[..]

Natuurlijk, dat gaat ook werken. Alleen kan het aantal queries dan gigantisch oplopen als je een hele reeks aan producten hebt, waardoor de pagina traag wordt en/of de server het (onnodig) druk kan krijgen bij veel bezoekers.
En daarbij nog de overhead welke wordt veroorzaakt door het verkeer tussen het script en de MySQL server... Ik zou zelf niet zo snel query's in een loop gaan zetten als dat niet nodig is.
pi_133947639
quote:
0s.gif Op donderdag 5 december 2013 16:09 schreef xaban06 het volgende:

[..]

Klopt, maar dat is het geval niet :) En ik wil het liever nu werkend hebben dan dat ik me weer moet inlezen, proberen, repareren, proberen, etc etc. Kost erg veel tijd voor nu :)

Wat is er precies fout in mijn script?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$productQuery     
"SELECT ean, name FROM products WHERE category = '$category'";
$productResult    $mysqli->query($productQuery);

while (
$productRow $productResult->fetch_assoc()) {
    
$productPriceQuery     "SELECT ean, price+shipmentCost AS totalPrice FROM prices WHERE ean = $productRow[ean] ORDER BY totalPrice ASC";
    
$productPriceResult    $mysqli->query($productPriceQuery);
    
    
$totalPrice            $productPriceResult->fetch_assoc();

    echo 
$productPriceResult["productURL"]; // productPriceResult is dus een mysqli object, geen array
    
echo $totalPrice["productURL"]; // totalPrice moet je hebben, want die had je al omgezet naar een assoc array
    
}
?>
pi_133947807
quote:
0s.gif Op donderdag 5 december 2013 16:11 schreef zoem het volgende:

[..]
[ code verwijderd ]

Ik zie geen verschil tussen jouw en mijn code, of wel? :@
  FOK!mycroftheld donderdag 5 december 2013 @ 16:15:28 #271
128465 Wrapster
pi_133947813
quote:
0s.gif Op donderdag 5 december 2013 16:09 schreef xaban06 het volgende:

[..]

Klopt, maar dat is het geval niet :) En ik wil het liever nu werkend hebben dan dat ik me weer moet inlezen, proberen, repareren, proberen, etc etc. Kost erg veel tijd voor nu :)

Wat is er precies fout in mijn script?
Je kunt je query simpelweg aanpassen naar:

1
2
3
4
$productQuery     = "SELECT products.ean, products.name, prices.price+prices.shipmentCost AS totalPrice, products.productURL
                     FROM products
                     JOIN prices ON products.ean = prices.ean
                     WHERE category = '$category'";
pi_133947891
quote:
0s.gif Op donderdag 5 december 2013 16:15 schreef bondage het volgende:

[..]

Je kunt je query simpelweg aanpassen naar:
[ code verwijderd ]

Hartstikke bedankt voor de query, wordt gewaardeerd, maar mijn query wordt straks nog langer en dan weet ik dat ik er niet meer uit zal komen, vandaar hield ik het simpel :)

Zal het straks eens uitproberen.
pi_133947903
quote:
0s.gif Op donderdag 5 december 2013 16:15 schreef xaban06 het volgende:

[..]

Ik zie geen verschil tussen jouw en mijn code, of wel? :@
De laatste regel in de loop is de verbetering, de voorlaatste regel is foutief.
quote:
0s.gif Op donderdag 5 december 2013 16:15 schreef bondage het volgende:

[..]

Je kunt je query simpelweg aanpassen naar:
[ code verwijderd ]

De vraag is of er meerdere prijzen zijn per artikel, want dan moet de code iets aangepast worden. Anders was dit een prima drop-in replacement geweest :)
pi_133947942
quote:
0s.gif Op donderdag 5 december 2013 16:17 schreef zoem het volgende:

[..]

De laatste regel in de loop is de verbetering, de voorlaatste regel is foutief.

[..]

De vraag is of er meerdere prijzen zijn per artikel, want dan moet de php code iets aangepast worden.
Per product zijn er meerdere prijzen, ik haal de goedkoopste eruit per product.
  FOK!mycroftheld donderdag 5 december 2013 @ 16:30:33 #275
128465 Wrapster
pi_133948400
quote:
0s.gif Op donderdag 5 december 2013 16:18 schreef xaban06 het volgende:

[..]

Per product zijn er meerdere prijzen, ik haal de goedkoopste eruit per product.
Deze query zou die data moeten teruggeven. Kan echter niet testen en weet niet zeker of het zo klopt... Misschien dat zoem hier eventueel een aanvulling op kan geven.

1
2
3
4
5
6
7
8
SELECT * FROM (
    SELECT products.ean, products.name, prices.price+prices.shipmentCost AS totalPrice, products.productURL
    FROM products
    JOIN prices ON products.ean = prices.ean
    WHERE category = '$category'
) AS t
GROUP BY t.ean
HAVING t.totalPrice = MIN(t.totalPrice)


[ Bericht 0% gewijzigd door Wrapster op 05-12-2013 17:48:45 ("; weggehaald na de variable) ]
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')