[php]Probleem met het selecteren van gegevens*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allemaal

Dit is de eerste keer dat ik hier een vraag over php stel, maar ik kom er deze keer dan ook echt niet meer zelf uit.

Ik heb de volgende code geschreven:



PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
foreach ($xml->movielist->movie as $movie) {                                                        //
    if ($_GET['letter'] != NULL) {
        if (eregi("^".$_GET['letter'], $movie->title)) {
            array_push($movielist,$movie->title."");
        }
    }
    if ($_GET['keyword'] != NULL) { 
        if (eregi($_GET["keyword"],$movie->title)) {
            array_push($movielist,$movie->title."");
        }
    }
    if ($_GET['year'] != NULL) {                                    //als variable year bestaat
        if (eregi($_GET['year'], $movie->releasedate->date)) {      //als het jaartal overeenkomt met die van de film
            array_push($movielist,$movie->title."");                //voeg film toe
        }
    }
}


De voorwaarde haalt hij dus uit de adresregel. Hier heb ik al een ander scriptje voor geschreven en dat werkt perfect.

Een url ziet er dan bijvoorbeeld zo uit:
index.php?keyword=American&letter=A&year=1999

Alleen dan wil ik dat hij aan die condities moet voldoen. Dus dat hij én American bevat, én begint met de letter A én uit 1999 komt.

De gegevens haalt hij keurig netjes uit de database. Alleen haalt hij alles apart uit de database. Dus ik krijg alle films die beginnen met een a + alle films die uit 1999 komen + die alle films die American in de titel bevatten. Gevolg, ik krijg meer te zien dan dat ik wil + wat ik wel wil zien krijg ik 3x te zien.

Als ik door mn code kijk snap ik dat wel. Alleen ik zou zo niet weten hoe ik kan zorgen dat de betreffende record aan álle voorwaarde moet voldoen.

Zou iemand me op de juiste weg kunnen sturen? Ik ben bang dat de oplossing zeer simpel is, maar ik zie door de bomen het bos gewoon ff niet meer.


EDIT: Ik zie zojuist dat ik mijn titel fout heb geschreven. De juist titel zou moeten zijn "[PHP]Probleem met sorteren van gegevens". Sorry voor het ongemak

[ Voor 4% gewijzigd door Verwijderd op 03-09-2007 11:05 . Reden: Foute titel ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je moet alle condities met elkaar AND-en in een if-statement. Dus alleen toevoegen als alle eregs tegelijk voldoen aan de drie criteria.

Acties:
  • 0 Henk 'm!

  • MindStorm
  • Registratie: Juli 2002
  • Laatst online: 16-01-2024
Waarom haal je alles in drie aparte queries uit de database? kun je dat niet in een query doen? Dan handelt je database namelijk het sorteren voor je af en die zal het wellicht sneller kunnen dan PHP.

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Waarom gebruik je geen xpath query om alleen de movies uit de xml te halen welke voldoen aan de zoekopdracht (e.g. //movies/movie[keyword = 'American' and year = '1999' and starts-with(title, 'A') = true()]

Een andere oplossing is om de array_push statement net onder de derde vergelijking te plaatsen. Zodra een zoekopdracht niet voldoet roep je 'continue' aan. Op die manier komen in de $movielist array alleen films te staan welke aan de zoekopdracht voldoen.

PHP:
1
2
if (!eregi("^".$_GET['letter'], $movie->title))
    continue;

Let op het extra uitroepteken (not) voor de vergelijking.
Op het moment dat er geen argumenten worden gegeven voor de zoekopdracht (alle get variableen zijn null) dan krijg je een lijst vn alle movies.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@playroll: Dat zou inderdaad kunnen werken als alle gegevens altijd ingevuld werden. Maar als je toevallig niet weet dat die film uit 1999 komt, dan zou het niet werken

@mindstorm: Alles in een query? Zou zo niet weten hoe. Het xml bestand word automatisch aangemaakt door een ander programma. Daar heb ik dus totaal geen controle over. Mijn gedachte gang was nu als volgt. Hij gaat elke film af, en kijkt naar de voorwaarde of die matchen. Hebben we een match? Dat stopt hij die filmtitel toe in de array.

@niemand_anders: Die xpath query zegt me nog niet zoveel. Dat moet ik dadelijk even googlen.

Die continue oplossing ziet er mooi uit, maar heb hem nog niet werkend gekregen. Dus dat ga ik dadelijk ook even meer informatie over googlen.

Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:39
Je hebt het in je openingspost over database maar praat nu over XML. Je kan toch controleren of een voorwaarde is ingevuld en indien nodig opnemen in de query? Scheelt je roundtrips naar de database, er van uitgaande dat je daarmee werkt, en zoals MindStorm zorgt besteedt je dan het werk van sorteren en combineren uit aan je DBMS.

Pas wel op voor SQL injection. Ik weet in ASP.NET dat Paramterized Queries daarvoor the way to go is. Hoe het in PHP zit weet ik echter niet.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Playroll's oplossing is anders wel een werkbare. Sowieso vind ik het wat vreemd dat je 2x een if gebruikt. Je kunt beide argumenten gewoon in 1 statement opnemen.
PHP:
1
2
3
4
5
if (conditie a) {
  if (conditie b) {
    //..
  }
}

Is hetzelfde als
PHP:
1
2
3
if ((conditie a) and (conditie b)) {
  //..
}


Door verder met haakjes te werken kun je keurig het probleem van een niet ingevuld keyword opvangen.

Tot slot. Dit heeft weinig tot niks met sorteren te maken en gezien het feit dat je een xml bestand inleest ben je ook helemaal niet met een database bezig. Ik vermoed dat je je het jezelf een stuk makkelijker kunt maken door een import te schrijven die de XML inleest in de database en vervolgens deze database gebruikt in de rest van je applicatie.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De database staat in een xml bestand. Inderdaad niet in een SQL of zoiets dergelijks.

Daarnaast is het gelukt met die continue waar niemand_anders het overhad. (Had hierover wel in mn boek gelezen, maar had het nooit echt begrepen. Nu snap ik het nut ook van die continues) Dus ik kan weer verder gaan met m'n site. Allemaal kei bedankt voor de hulp.
Pagina: 1