Dubbele query met taal keuze [OPGELOST]

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

11/08/2014 15:09:32
Quote Anchor link
Ik heb een nieuws-module waarbij de gebruiker kan invullen tussen welke periode het artikel getoond moet worden.
Indien ze dit niet willen gaat wordt er een standaard tijds aanduiding gegeven, 0000-00-00 00:00:00

Nu werkt dit op zich goed. Alleen als ik een bepaalde taal maar wil tonen gaat het mis.
Ik werk met Codeigniter en active record queries. Desalniettemin kan ik gewoon normale queries gebruiken of een combo hiervan.

Onderstaand de query en het resultaat hiervan in objecten.
Ik kom er niet meer uit.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
SELECT `news_id`, `news_publishdate`, `news_startdate`, `news_enddate`, `news_order_id`, `news_status`, `news_posterid`, `news_tags`, `news_translation_id`, `news_translation_intro_title`, `news_translation_intro_text`, `news_translation_intro_image`, `news_translation_detail_title`, `news_translation_detail_text`, `news_translation_detail_image`, `news_translation_newsid`, `news_translation_localeid`, `locale_id`, `locale_code`, `locale_name`, `locale_active`
FROM (`module_news`)
JOIN `module_news_translations` ON `module_news_translations`.`news_translation_newsid`  = `module_news`.`news_id`
JOIN `locales` ON `locales`.`locale_id`  = `module_news_translations`.`news_translation_localeid`
WHERE `news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00'
OR `news_startdate` = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00'
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` =  '1'
ORDER BY `news_order_id` ASC
LIMIT 10
Array
(
    [0] => stdClass Object
        (
            [news_id] => 4
            [news_publishdate] => 2014-05-21 00:00:00
            [news_startdate] => 0000-00-00 00:00:00
            [news_enddate] => 0000-00-00 00:00:00
            [news_order_id] => 2
            [news_status] => 1
            [news_posterid] => 1
            [news_tags] =>
            [news_translation_id] => 5
            [news_translation_intro_title] => item 1
            [news_translation_intro_text] => Item 1
            [news_translation_intro_image] =>
            [news_translation_detail_title] => Item 1
            [news_translation_detail_text] => Item 1
            [news_translation_detail_image] =>
            [news_translation_newsid] => 4
            [news_translation_localeid] => 1
            [locale_id] => 1
            [locale_code] => nl_NL
            [locale_name] => Dutch
            [locale_active] => 1
        )

    [1] => stdClass Object
        (
            [news_id] => 4
            [news_publishdate] => 2014-05-21 00:00:00
            [news_startdate] => 0000-00-00 00:00:00
            [news_enddate] => 0000-00-00 00:00:00
            [news_order_id] => 2
            [news_status] => 1
            [news_posterid] => 1
            [news_tags] =>
            [news_translation_id] => 6
            [news_translation_intro_title] => Item 1
            [news_translation_intro_text] => Item 1
            [news_translation_intro_image] =>
            [news_translation_detail_title] => News item 1
            [news_translation_detail_text] => ''          
            [news_translation_detail_image] =>
            [news_translation_newsid] => 4
            [news_translation_localeid] => 2
            [locale_id] => 2
            [locale_code] => en_GB
            [locale_name] => English
            [locale_active] => 1
        )

)
Gewijzigd op 11/08/2014 15:57:56 door
 
PHP hulp

PHP hulp

16/11/2024 22:47:07
 
Erwin H

Erwin H

11/08/2014 15:17:47
Quote Anchor link
Zodra je in de WHERE clause gebruik maakt van AND en OR zonder via haakjes aan te geven hoe die moeten worden uitgevoerd dan vraag je om problemen. Ik durf bijna te wedden dat mysql tot een heel andere volgorde komt dan dat jij wilt.
 

11/08/2014 15:32:00
Quote Anchor link
Ja klopt.
Wat ik wil is alleen de artikelen van een bepaalde taal worden getoond.
Maar dan mag de starttijd niet hoger zijn dan nu en de eindtijd wel of gelijk aan.
OF
Er is helemaal geen datum ingevuld (oftewel 0000-00-00 00:00:00)

Kan je me erbij helpen of een voorbeeld geven? Ik weet niet hoe ik haakjes in de query moet verwerken.

Alvast bedankt.
 
Ivo P

Ivo P

11/08/2014 15:33:18
Quote Anchor link
0000-00-00

dat formaat levert alleen maar problemen op: 0000-00-00 is kleiner dan 2014-08-11 en dus zou er niet getoond moeten worden. Je moet dus allemaal aanpassingen doen om de uitzondering te verwerken.
daarbij is het ook geen geldige datum natuurlijk.

Het is veel handiger om indien niet geset de "waarde" NULL te noteren.
 

11/08/2014 15:34:08
Quote Anchor link
Oke ik ga dat dan even proberen. Ik kom er nog op terug! Ga gelijk aan de gang.

Toevoeging op 11/08/2014 15:36:12:

Rick de Graaff op 11/08/2014 15:34:08:
Oke ik ga dat dan even proberen. Ik kom er nog op terug! Ga gelijk aan de gang.


Daar heb je het eerste probleem al. Ik gebruik een date-time. Hier kan ik geen NULL opgeven, alleen maar een datum of de 0000-00-00 00:00:00 notatie
 
Erwin H

Erwin H

11/08/2014 15:45:25
Quote Anchor link
Dat laatste is onzin Rick, je kan gewoon NULL invoeren, ook voor een datetime. Alleen als je er een 'NOT NULL' op hebt staan kan dat niet, maar dat is dan jouw keuze.

De haakjes gebruik je om aan te geven welke operator als eerste uitgevoerd moet worden. AND wordt door mysql eerst uitgevoerd, daarna pas een OR. Wat je nu hebt wordt dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
WHERE `news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00'
OR `news_startdate` = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00'
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` =  '1'

is gelijk aan:

WHERE (`news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00')
  OR
  `news_startdate` = '0000-00-00 00:00:00'
  OR
  (news_enddate = '0000-00-00 00:00:00' AND `news_translation_localeid` = '1' AND `locale_id` = '1' AND `news_status` =  '1')

Ik denk dat je wil:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
WHERE (`news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00' OR  `news_startdate` = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00')
  AND `news_translation_localeid` = '1'
  AND `locale_id` = '1'
  AND `news_status` =  '1'

En dan heb je meteen je haakjes.
 

11/08/2014 15:56:23
Quote Anchor link
@erwin -
Ik kan echt geen NULL waarde opgeven. Ik gebruik Navicat om mijn database te beheren maar het lukt echt niet. Toch heb ik je advies opgevolgd en gekeken of ik iets kon bereiken met de voorbeelden die je gaf.

Uiteindelijke heeft dit het gedaan! :D

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT `news_id`, `news_publishdate`, `news_startdate`, `news_enddate`, `news_order_id`, `news_status`, `news_posterid`, `news_tags`, `news_translation_id`, `news_translation_intro_title`, `news_translation_intro_text`, `news_translation_intro_image`, `news_translation_detail_title`, `news_translation_detail_text`, `news_translation_detail_image`, `news_translation_newsid`, `news_translation_localeid`, `locale_id`, `locale_code`, `locale_name`, `locale_active`, `cmsu_id`, `cmsu_username`, `cmsu_emailaddress`, `cmsu_firstname`, `cmsu_lastname`
FROM (`module_news`)
JOIN `module_news_translations` ON `module_news_translations`.`news_translation_newsid`  = `module_news`.`news_id`
JOIN `locales` ON `locales`.`locale_id`  = `module_news_translations`.`news_translation_localeid`
JOIN `cms_users` ON `cms_users`.`cmsu_id`  = `module_news`.`news_posterid`
WHERE (news_startdate <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00' OR news_startdate = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00')
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` =  '1'
ORDER BY `news_order_id` ASC
LIMIT 10
 
Ivo P

Ivo P

11/08/2014 15:58:20
Quote Anchor link
probeer je NULL op te slaan, of 'NULL' (een string van 4 letters)?
 
Erwin H

Erwin H

11/08/2014 16:11:59
Quote Anchor link
Rick de Graaff op 11/08/2014 15:56:23:
@erwin -
Ik kan echt geen NULL waarde opgeven. Ik gebruik Navicat om mijn database te beheren maar het lukt echt niet.

Spijt me, maar het blijft onzin. Een datetime type in mysql heeft geen NULL restrictie erop zitten, dus je kan wel degelijk de waarde NULL invoeren. Dat je bepaalde tools hebt die dat blijkbaar niet kunnen, of je een verkeerd script gebruikt doet daar niets aan af. Lijkt me meer dat er via een bepaald tool een NOT NULL definitie op de kolom wordt gezet, maar dat nogmaals, is iets dat je dan zelf doet.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/08/2014 18:51:33
Quote Anchor link
Ivo P op 11/08/2014 15:33:18:
0000-00-00

dat formaat levert alleen maar problemen op: 0000-00-00 is kleiner dan 2014-08-11 en dus zou er niet getoond moeten worden. Je moet dus allemaal aanpassingen doen om de uitzondering te verwerken.
daarbij is het ook geen geldige datum natuurlijk.

Het is veel handiger om indien niet geset de "waarde" NULL te noteren.

Dat 0000-00-00 geen geldig datum is heb je gelijk in, maar:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT NULL < '2014-08-30'
-> NULL
SELECT '0000-00-00' < '2014-08-30'
-> 1

Dus of het nu veel handiger is om een nullable kolom te hebben valt te bezien.
 
Bart V B

Bart V B

11/08/2014 19:58:52
Quote Anchor link
Weet dat er opgelost achter dit topic staat, maar toch...
Quote:
@erwin -
Ik kan echt geen NULL waarde opgeven. Ik gebruik Navicat om mijn database te beheren maar het lukt echt niet. Toch heb ik je advies opgevolgd en gekeken of ik iets kon bereiken met de voorbeelden die je gaf.

Zit dat probleem in Navicat of in je mysql server configuratie?
Als ik zo even in de handleiding zit te lezen kan je die optie afdwingen dat een datum 0000-00-00 een mooie error geeft. Ik dacht eerst dat de benaming strict modes was.
Effin, hier heb je de link om zelf eens te kijken of je mysql een fine tune kunt geven. ;)
http://dev.mysql.com/doc/refman/5.0/en/sql-mode.html

Edit, hier zit het allemaal wat beknopter verweven mocht je geen zin hebben om alles door te nemen in de manual. http://www.pfz.nl/wiki/werken-met-mysql/#configuratie-sql-modes
Gewijzigd op 11/08/2014 20:01:50 door Bart V B
 

11/08/2014 20:20:05
Quote Anchor link
Bedankt allemaal voor de hulp.

Ik denk dat het een "fout" is in Navicat. Wat ik invoer is gewoon NULL, ik denk dat dit wordt gezien al string en niet als NULL waarde maar als 'NULL'.

Daarnaast ga ik de MySQL ref. even bekijken en doorlezen, hier steek ik natuurlijk nog weer wat van op.
Toch vindt ik Erwin zijn reactie erg bot, het is niet dat ik het niet probeerde het was dus meer een onkunde van mijn beheer-tool. PHPmyAdmin heb ik ook maar had dat niet geprobeerd omdat ik andere dingen aan het doen was op dat bepaalde moment.

Al met al is het gelukt.

Ik zeg, topic dicht.
 
Bart V B

Bart V B

11/08/2014 20:29:45
Quote Anchor link
Ik denk dat Erwin het zeer zeker niet bot heeft bedoeld hoor.
Het is ook niet dat ik hier nu op reageer om je te bekeren tot wat wij zeggen "zo moet het".
Las het topic door, en had ooit in een talk gehoord over die vreemde datums en nog wat ongein wat mysql allemaal kan. Dus dacht in eerste instantie aan strict modes, dus denk zal even voor je meedenken hoe dat ook alweer zat.

Overigens in phpmyadmin heb je dit "probleem" ook. Als je je mysql server al die dingen,laten we zeggen minder exotisch instelt, dan kom je later niet voor vreemde verrassingen te staan. Nogmaals geen bashing richting mysql, ook niet een overtuiging verhaal dat het allemaal beter moet, maar meer een tip dat het beter kan. ;)
 

11/08/2014 20:33:19
Quote Anchor link
Ik ben ook zeker niet boos o.i.d hoor. Alleen de manier van praten vond ik wat apart.
Ik ben zo blij als een vogel met een werkende module.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/08/2014 20:43:42
Quote Anchor link
Ik hou het een klein beetje open:
Wat er gebeurd bij een NULL invoer op een kolom die niet nullable is:
- als er een default waarde is hou die aan
- genereer een fout als geen default waarde is ingesteld

Ook als je bij een nullable column een default waarde hebt toegevoegd wordt die ingevoerd als NULL wordt ingevoerd.

Erwin zijn reactie is (zelfs) niet (een beetje) bot, maar gewoon recht dooruit:
Ik kan me niet voorstellen dat Navicat afdwingt dat kolommen not nullable zijn danwel een verplichte default hebben
 
Erwin H

Erwin H

11/08/2014 23:35:57
Quote Anchor link
Excuses als het bot overkomt, dat was niet de intentie. Hoewel ik toegeef dat het bij mij nog wel eens irritatie opwekt als mensen met verstand van zaken te horen krijgen dat wat ze zeggen 'niet kan', waardoor het kan zijn dat soms een reactie wat harder overkomt dan strikt noodzakelijk.
Gewijzigd op 11/08/2014 23:36:54 door Erwin H
 

11/08/2014 23:39:48
Quote Anchor link
Geen probleem Erwin. Het kon misschien wel maar ik kreeg het niet voor mekaar.
Eind goed al goed.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.