[PHP en MySQL] Problemen bij Limiteren in query

Pagina: 1
Acties:
  • 824 views

Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Een tijdje terug heb ik onderstaand scriptje geschreven:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function gHour(){
include "./includes/connect.php";
    $day = date('d-m-Y');
    $time = date('H');
    $next = $time + 1;
    $sql = mysql_query("SELECT * FROM `programma` WHERE `p_dag` = '".$day."' ORDER BY `p_tijd` ASC");

echo "<li><div class=\"prog-list-detail\">
<h2>Nu op TV</h2>";
while($get=mysql_fetch_array($sql)){
 $now = explode(":", $get['p_tijd']);
        if($now[0] == $time){
        $zender = mysql_fetch_array(mysql_query("SELECT * FROM `zender` WHERE `z_id`='".$get['z_id']."'"));
    echo '<div class="prog-list"><a href="#">'.$get['p_tijd'].' &bull; <b>'.$zender['z_naam'].'</b> <br/>'.$get['p_naam'].'</a></div>';
        }
    }
echo "</div></li>";
mysql_close();
}


Op regel 6 van de snippet staat een query die de data ophaald van de database. Ik wil de output daarvan limiteren tot 10 rows. Dus ik maak er dit van:

PHP:
1
$sql = mysql_query("SELECT * FROM `programma` WHERE `p_dag` = '".$day."' ORDER BY `p_tijd` ASC LIMIT 0, 10");


Wanneer ik dan de functie uitvoer dan wordt er helemaal niks geprint, teruggegeven oid. Wanneer ik de limit weghaal werkt ineens de functie wel. :?

Ik heb al geprobeerd de query anders op te bouwen maar kom telkens terug op de bovenstaande samenstelling, hierdoor kan ik dus geen limit aan de query meegeven... Wat doe ik fout?

Heeft er iemand een oplossing of een duwtje in de goede richting :X ? Alvast bedankt _/-\o_

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Geeft MySQL een foutmelding als je de query met de hand probeert te doen?

Wat is trouwens het type van de kolom p_dag? Want wellicht kun je daar gewoon een NOW() voor gebruiken.

Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 20:15
Kijk eens wat mysql_error() teruggeeft. Je query lijkt gewoon goed
De query op regel 13 kan je makkelijk weghalen door een join te gebruiken, is nog beter voor je performance ook.

Acties:
  • 0 Henk 'm!

  • marco_balk
  • Registratie: April 2001
  • Laatst online: 20-06 21:52
Wellicht heel raar, maar wat gebeurt er als je '0' weghaalt uit je LIMIT?
Dus:
SQL:
1
... LIMIT 10

Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
@HuHu ik krijg geen error, nog beter ik krijg helemaal niets terug :X

@hostname Ik ben nog bezig met optimizing maar die ene query op regel 6 :?

@marco_balk De limit voert dan ook niks uit. Ik krijg in dit geval ook niets terug. Wat raar is als ik de gehele limit weghaal dat ie het wel gewoon doet.

Ligt dit misschien aan het type data veld, dat is namelijk VARCHAR, normaal werkte dit allemaal wel?

Edit: Na nog wat debug werk kom ik erachter dat de query wel uitgevoerd wordt alleen krijg ik niets terug, het lijkt er dus op dat de fetch op een of andere manier niet werkt. :?

[ Voor 18% gewijzigd door JefSnare op 05-01-2010 16:11 ]

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Sowieso moet je iets met een datum erin gewooon opslaan met een datumveld (bijv. DATETIME).

HuHu bedoelde dat je misschien (is niet zo maar had gekund) een foutmelding van mysql krijgt maar daar check je niet op.

PHP:
1
$result = mysql_query('SELECT.....') or die(mysql_error());


om het simpelste voorbeeld even te geven. Zo kun je snel spotten of iets in je code of in je query verkeerd zit.

Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
@Cartman!
Ook na het invoegen van de error mogelijkheden krijg ik niets terug waar ik aan kan zien dat het fout gaat. Ik kan er niet bij waar en hoe het fout gaat aangezien de syntax gewoon juist is... :?

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21:35

MueR

Admin Tweakers Discord

is niet lief

Cartman! schreef op dinsdag 05 januari 2010 @ 16:16:
Sowieso moet je iets met een datum erin gewooon opslaan met een datumveld (bijv. DATETIME).
QFT. Sorteren op datum gaat je nu heel erg veel hoofdpijn opleveren. Een datum hoort in de correcte vorm in de database te staan, niet als stuk tekst.

Print je query nou eens naar het scherm en gooi hem in phpMyAdmin. Doet ie het dan wel?

[ Voor 11% gewijzigd door MueR op 05-01-2010 16:24 ]

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


Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
het is geen datum die gesorteerd moet worden, ik wil sorteren op tijd. Dus ik wil de resultaten sorteren op chronologische volgorde: 00:12, 01:00, 12:00, 12:05, 16:00 etc..

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21:35

MueR

Admin Tweakers Discord

is niet lief

En je punt is? Met een DATETIME veld kan ik sorteren op datum/tijd, of op elke donderdag, elke 4e van de maand of alles tussen 12 en 13 uur. Dit is redelijk basis database ontwerp. Using the right tool for the job.

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


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Er gaat een moment komen dat je wel wil sorteren op dag (bijv. je wilt de programma's voor de komende 3 dagen bekijken van zender X) en dan sla je jezelf voor je kop dat je in het beginstadium niet naar ons geluisterd hebt :)

edit: je hoeft dan datum en tijd niet los op te slaan, dat past allemaal netjes in 1 veld, DATETIME.

[ Voor 18% gewijzigd door Cartman! op 05-01-2010 16:29 ]


Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Ik ga rond kijken naar DATETIME en vanavond nog een goed kijken naar DB ontwerp. Ik zie dat ik met datetime meerdere dingen kan vervangen. Bedankt tot zo ver;)

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • !null
  • Registratie: Maart 2008
  • Laatst online: 11-09 14:00
Je hebt nog steeds niet de error met de eerder aangegeven mysql_error() functie eruit getrokken. Geef daar eens de output van.
Gewoon na de query doe je "echo mysql_error();"

En of het nou een datum of een tijd is, dat maakt niet uit, in beide gevallen een TIMESTAMP waar goed op te sorteren valt. Wellicht niet direct nodig, is het veel beter om ook echt een TIMESTAMP te gebruiken, hierin kun je zowel de tijd als datum gooien en dan filteren op alleen datum of andere handige tijdsgerelateerde functies op loslaten.

Ampera-e (60kWh) -> (66kWh)


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
JefSnare schreef op dinsdag 05 januari 2010 @ 16:24:
het is geen datum die gesorteerd moet worden, ik wil sorteren op tijd. Dus ik wil de resultaten sorteren op chronologische volgorde: 00:12, 01:00, 12:00, 12:05, 16:00 etc..
Je moet je datum-kolom (p_dag) het type DATE geven en je tijd-kolom (p_tijd) het type TIME. Zie http://dev.mysql.com/doc/.../date-and-time-types.html

Dan kun je veel beter sorteren en gaat het altijd goed. Al staat dat waarschijnlijk los van je huidige probleem, het is beter om dat toch te doen.

Verder kun je de twee queries die je hebt (waarvan de tweede in een loop wordt uitgevoerd) combineren tot eentje door te JOINen op de kolom z_id. Dat scheelt je heel veel queries en je resultaat is in één keer compleet.

Als je dan ook nog de * in je queries vervangt door de kolommen die je wilt hebben, dan ben je nog beter op weg :).

Maargoed, dat heeft verder niet met je probleem te maken :P.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Goedzo :) Daarna kun je kijken naar de werking van JOINs waar hostname je al op wees, dat is iets wat je echt nodig gaat hebben ook.

Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

HuHu schreef op dinsdag 05 januari 2010 @ 16:30:
[...]

Je moet je datum-kolom (p_dag) het type DATE geven en je tijd-kolom (p_tijd) het type TIME. Zie http://dev.mysql.com/doc/.../date-and-time-types.html

Dan kun je veel beter sorteren en gaat het altijd goed. Al staat dat waarschijnlijk los van je huidige probleem, het is beter om dat toch te doen.
Een DATETIME veld kun je net zo goed sorteren, en 'altijd goed gaan' geld toch alleen als je het goed gebruikt. En daarin is het niet lastiger met een DATETIME dan met losse velden.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
kokx schreef op dinsdag 05 januari 2010 @ 23:39:
[...]

Een DATETIME veld kun je net zo goed sorteren
Niet op tijdstip, althans, niet geïndexeerd.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Simpele gedacht voor de TS misschien, heb je niet gewoon 10 tijdstippen die eerder zijn dan nu?

Want dan kom je gewoon niet voorbij regel 12.

Als je dbase ze bevat dan worden ze zonder limit niet getoond door regel 12, met limit worden ze nog steeds niet getoond maar zolang er bij de 1e 10 dbase resultaten geen een van dit uur zit gaat er voor de rest ook niets komen ( met een datetime principe kan je dit ook redelijk makkelijk als conditie in je query inbouwen, geen idee van de performance )

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Gomez12 schreef op dinsdag 05 januari 2010 @ 23:53:
Simpele gedacht voor de TS misschien, heb je niet gewoon 10 tijdstippen die eerder zijn dan nu?

Want dan kom je gewoon niet voorbij regel 12.

Als je dbase ze bevat dan worden ze zonder limit niet getoond door regel 12, met limit worden ze nog steeds niet getoond maar zolang er bij de 1e 10 dbase resultaten geen een van dit uur zit gaat er voor de rest ook niets komen ( met een datetime principe kan je dit ook redelijk makkelijk als conditie in je query inbouwen, geen idee van de performance )
Waaruit blijkt dat JefSnare naast joins ook mag kijken hoe where werkt. :)

Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Gomez12 schreef op dinsdag 05 januari 2010 @ 23:53:
Simpele gedacht voor de TS misschien, heb je niet gewoon 10 tijdstippen die eerder zijn dan nu?

Want dan kom je gewoon niet voorbij regel 12.

Als je dbase ze bevat dan worden ze zonder limit niet getoond door regel 12, met limit worden ze nog steeds niet getoond maar zolang er bij de 1e 10 dbase resultaten geen een van dit uur zit gaat er voor de rest ook niets komen ( met een datetime principe kan je dit ook redelijk makkelijk als conditie in je query inbouwen, geen idee van de performance )
Hiermee kan ik wel uit de voeten, gewoon stom dat ik daaraan niet dacht. Dat wil ik graag de reden van MouseGlow horen waarom ik naar where moet kijken. Ik selecteer toch de velden die ik wil hebben en dan limit ik ze toch.

Nu gebeurt er dus dat hij de eerste 10 resultaten pakt die niet volgens de where worden opgehaald en daarom ik niks kan zien. Kan iemand mij laten zien hoe het wel moet?

offtopic:
Ehm....
Regel x.x
Tweakers.net is geen afhaalbalie voor scripts....

Zonder een compleet werkend voorbeeld, maar kan iemand dan een pseudo/simpel voorbeeld geven zodat ik toch een duwtje in de richting heb?

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Je moet naar je where kijken, omdat je de volgende vergelijking in je where moet zetten en niet in PHP:

PHP:
1
if($now[0] == $time){


Dat is in feite een conditie die je in je query wilt hebben, want het heeft invloed op welke resultaten je wel/niet gaat gebruiken. Daar is de where voor bedoelt.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als je enkel iets doet als aan bepaalde conditie voldaan wordt, kan het toch overduidelijk in je WHERE erbij? :z

{signature}


Acties:
  • 0 Henk 'm!

  • !null
  • Registratie: Maart 2008
  • Laatst online: 11-09 14:00
Voor de zoveelste keer, wat zegt mysql_error() nou, na de query? Of prop hem in PhpMyAdmin..

Ampera-e (60kWh) -> (66kWh)


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
!null schreef op woensdag 06 januari 2010 @ 11:59:
Voor de zoveelste keer, wat zegt mysql_error() nou, na de query? Of prop hem in PhpMyAdmin..
Dat antwoord is al gegeven hoor. Er is geen foutmelding, de query is goed, alleen door de LIMIT in combinatie met de if in PHP is er geen uitvoer naar het scherm.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
!null schreef op woensdag 06 januari 2010 @ 11:59:
Voor de zoveelste keer, wat zegt mysql_error() nou, na de query? Of prop hem in PhpMyAdmin..
Ik gok dat het daar gewoon allemaal perfect werkt.

Hij filtert gewoon verkeerd.

Acties:
  • 0 Henk 'm!

  • !null
  • Registratie: Maart 2008
  • Laatst online: 11-09 14:00
Oh, sorry, ik dacht dat mensen nog doorgingen over de onzorgvuldigheden in het script.

Ampera-e (60kWh) -> (66kWh)


Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
De onzorgvuldigheden hoef ik niet allemaal te horen, mijn vraag was hoe ik die limit kan oplossen. Nu is het antwoord al gegeven dat LIMIT naar de eerste resultaten kijkt. en niet naar je row orde...

Dus mijn probleem is hoe een limit toe te passen op een where en werkelijk met where deze resultaten te filteren?

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Maak van regel 12 eens : if(1 == 1){ ipv. if($now[0] == $time){

Zie je dan wel iets? Volgens mij begrijp je de gegeven antwoorden niet helemaal namelijk :?

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

JefSnare schreef op woensdag 06 januari 2010 @ 16:33:
De onzorgvuldigheden hoef ik niet allemaal te horen, mijn vraag was hoe ik die limit kan oplossen. Nu is het antwoord al gegeven dat LIMIT naar de eerste resultaten kijkt. en niet naar je row orde...

Dus mijn probleem is hoe een limit toe te passen op een where en werkelijk met where deze resultaten te filteren?
En daarmee is het dan ook eigenlijk wel een beetje klaar... Men probeert je hier te helpen, je luistert niet wat er gezegd wordt en je toont ook niet dat je wat met die informatie doet...

Ga je eens verdiepen in de materie, lees informatie die niks met PHP te maken heeft (want je hebt universele problemen) en probeer die oplossingen eens toe te passen met PHP. Als je dan een script hebt wat niet werkt, dan kan je verder geholpen worden, mits je toont wat je zelf hebt geprobeerd, waar je tijdens debuggen tegenaanloopt, waar jij denkt dat het probleem zit, etc. etc. :)

Dit topic gaat dicht.

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.

Pagina: 1

Dit topic is gesloten.