[PHP] String split in query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 18-09 10:54
Goedennacht,

Ik was weer bezig met PHP en het gaat weer aardig, een paar maanden niks mee gedaan, maar goed. Ik was bezig om mijn gegevens uit de database te vissen. Dit loopt allemaal als een tiet maar toen liep ik tegen het volgende probleem aan. Ik haal mijn gegevens uit de db met de volgen query:
PHP:
1
2
3
4
5
6
7
8
$select_software = "SELECT 
                            *
                    FROM 
                        software 
                    WHERE 
                        klassen='".$obj['groep']."'
                        
                    "; //Pak software wat bij de groep hoort

Dit werkt prima, maar (daar komt tie) in de tabel 'klassen' staat niet altijd een cijfer opzich. Ik zal het proberen uit te leggen. $obj['groep'] haalt hij van een andere query dit is de groepid, van deze groepid wil ik alle software weergeven. Maar meerdere groepen kunnen de software bekijken, in de kolom "klassen" staan dan ook meerdere klassen gescheiden met een ',' (komma). Nu had ik voor me zelf even weer de string split opgebouwd:
PHP:
1
2
3
4
5
6
7
8
<?php
$data = '1,2,3,4,5,6,7,8';
$splitdata = explode(',', $data);
for($i = 0; $i < count($splitdata); $i++) {
  $value = $splitdata[$i];
  echo "$value\n";
}
?>


Maar hoe implementeer ik dit dan in mijn query, naar JOIN ga ik liever niet want daar heb ik nog geen kaas van gegeten. :P

Edit nog even een overzichtje

----------------------
id | klassen |
----------------------
1 | 5,5a,7 |
2 | 7 |
3 | 7b,5,9 |
____________

[ Voor 7% gewijzigd door xzaz op 26-02-2008 01:14 ]

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
xzaz schreef op dinsdag 26 februari 2008 @ 01:12:
Maar hoe implementeer ik dit dan in mijn query, naar JOIN ga ik liever niet want daar heb ik nog geen kaas van gegeten. :P
Dat is natuurlijk (als devver) de verkeerde instelling ;) Wat je niet weet kun je leren en joins zijn nou niet bepaald rocket science. We hebben er zelfs een stukje over in de FAQ staan; zie Hoe werken joins?

Maar je probleem zit dieper; als jij Comma-separated waardes in een veld gaat frotten bij wijze van foreign key dan doe je iets verkeerd; in dat geval zul je je ook even moeten verdiepen in database normalisatie en in het bijzonder koppeltabellen; helaas hebben we hier (nog) geen specifiek stukje FAQ over (behalve dit) maar met een klein beetje googlen kom je een heel eind ;) Ook DB normalisatie is geen rocket science en gaat je in de toekomst héél veel ellende besparen.

[ Voor 11% gewijzigd door RobIII op 26-02-2008 01:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 18-09 10:54
RobIII schreef op dinsdag 26 februari 2008 @ 01:23:
[...]

Dat is natuurlijk (als devver) de verkeerde instelling ;) Wat je niet weet kun je leren en joins zijn nou niet bepaald rocket science. We hebben er zelfs een stukje over in de FAQ staan; zie Hoe werken joins?
Maar je probleem zit dieper; als jij Comma-separated waardes in een veld gaat frotten bij wijze van foreign key dan doe je iets verkeerd; in dat geval zul je je ook even moeten verdiepen in database normalisatie en in het bijzonder koppeltabellen. Ook dat is geen rocket science en gaat je in de toekomst héél veel ellende besparen.
Ok, heb net al heel stiekem gekeken naar die FAQ en dus naar JOIN, ga eerst slapen morgen weer een dag. Kan je me een hint geven hoe ik het wel zou moeten doen. Ik weet van joomla dat ze gebruik maken van params is dat hiervoor een juiste manier?

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
xzaz schreef op dinsdag 26 februari 2008 @ 01:27:
[...]

Ok, heb net al heel stiekem gekeken naar die FAQ en dus naar JOIN, ga eerst slapen morgen weer een dag. Kan je me een hint geven hoe ik het wel zou moeten doen. Ik weet van joomla dat ze gebruik maken van params is dat hiervoor een juiste manier?
Een Parametrized Query is heel iets anders dan een join; hoe je die link heb gelegd mag joost weten :P
Ik wil ja adviseren eerst eens een poging (of 2 of ... :P ) te wagen; ik kan wel gaan hinten maar je moet er zélf van leren. Er zijn voldoende voorbeelden te vinden in de documentatie danwel in onze faq of elders.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
xzaz schreef op dinsdag 26 februari 2008 @ 01:12:
Edit nog even een overzichtje

----------------------
id | klassen |
----------------------
1 | 5,5a,7 |
2 | 7 |
3 | 7b,5,9 |
____________
En hoppa, een nieuwe entry voor slechtste programmeervoorbeelden :D

https://niels.nu


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Hydra schreef op dinsdag 26 februari 2008 @ 10:40:
En hoppa, een nieuwe entry voor slechtste programmeervoorbeelden :D
Wat dacht je van deze? :+
xzaz schreef op dinsdag 26 februari 2008 @ 01:12:
PHP:
1
2
3
4
5
6
<?php
for($i = 0; $i < count($splitdata); $i++) {
  $value = $splitdata[$i];
  echo "$value\n";
}
?>
Daarvoor hebben ze in PHP foreach() uitgevonden :+ Dan wordt het zoiets:
PHP:
1
2
foreach($splitdata as $value)
  echo $value . PHP_EOL;



Met je huidige databaseontwerp gok ik dat de enige optie is om iets als WHERE `klassen` LIKE '% groupId %' te doen. Er is wel een CSV datatype in MySQL maar zo te zien heb je daar nog niet eens gebruik van gemaakt, dan houdt het vrij snel op. Maar zoals gezegd, op dit punt is het beter alles te schrappen, uit te huilen en opnieuw te beginnen nadat je meer gelezen hebt over databasenormalisatie :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 18-09 10:54
Hydra schreef op dinsdag 26 februari 2008 @ 10:40:
[...]


En hoppa, een nieuwe entry voor slechtste programmeervoorbeelden :D
Kom niet aanzeuren van het slechtste dit, kom dan ook met een schop in de gedoe richting hoe het wel moet, hier heb ik natuurlijk niks aan. Of was het alleen maar om het afkraken bedoeld?

Waarom heb ik altijd het idee dat ik pro moet zijn om hier vragen te stellen. Of licht dat aan mij?
FragFrog schreef op dinsdag 26 februari 2008 @ 10:59:
[...]

Wat dacht je van deze? :+


[...]

Daarvoor hebben ze in PHP foreach() uitgevonden :+ Dan wordt het zoiets:
PHP:
1
2
foreach($splitdata as $value)
  echo $value . PHP_EOL;



Met je huidige databaseontwerp gok ik dat de enige optie is om iets als WHERE `klassen` LIKE '% groupId %' te doen. Er is wel een CSV datatype in MySQL maar zo te zien heb je daar nog niet eens gebruik van gemaakt, dan houdt het vrij snel op. Maar zoals gezegd, op dit punt is het beter alles te schrappen, uit te huilen en opnieuw te beginnen nadat je meer gelezen hebt over databasenormalisatie :)
Had ik inderdaad nog niet ontdekt, zal er vanmiddag eens naar kijken. Bedankt. Weet er iemand trouwens een goed programma waar je database schema's kan maken? Naast Visio dan.

[ Voor 60% gewijzigd door xzaz op 26-02-2008 16:08 ]

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

for() of foreach() is meer een kwestie van voorkeur, maar haal count() uit je for(). Die wordt namelijk elke iteratie aangeroepen.

[ Voor 13% gewijzigd door AtleX op 26-02-2008 15:36 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
AtleX schreef op dinsdag 26 februari 2008 @ 15:36:
for() of foreach() is meer een kwestie van voorkeur,
Ben ik niet met je eens. Als je for gebruikt op de manier van de TS krijg je errors / maf gedrag zodra de arrayindici niet perfect oplopen / bij 1 beginnen. In het voorbeeld van de TS betekend dat concreet dat je lege velden zou zien en de velden op het einde niet weergegeven zullen worden.

Als je geen foreach wilt kun je als alternatief nog een while gebruiken maar dat is effectief hetzelfde en in mijn opinie minder duidelijk:
PHP:
1
2
3
$data = array(1, 2, 4, 6, 8);
while($item = each($data))
  echo $item['value'] . PHP_EOL;


ArrayAccess heeft een perfect werkende interne iterator, ga niet het wiel opnieuw proberen uit te vinden :)

[ Voor 7% gewijzigd door FragFrog op 26-02-2008 15:54 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 18-09 10:54
Ok ik heb na veel proberen uitzoeken nog steeds geen goede query's enz. Toen heel mijn database weggemieterd en weer over nieuw begonnen. Dit is wat ik nu heb:
Afbeeldingslocatie: http://www.xzaz.nl/db.jpg

Wanneer ik 1 software record wil laten zien aan meerdere klassen zou ik toch echt in 1 kolom van 1 record (bv Software.groep) meerdere klassen moeten invoeren. Of zie ik dit fout?

Edit: Bij ' leerlingen' heb ik leerkracht_id nog staan. later besefte ik dat je hem ook gewoon kan opvragen via 'Groepen'.

[ Voor 14% gewijzigd door xzaz op 29-02-2008 19:45 ]

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Gebruik een koppeltabel?

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 18-09 10:54
Ah kijk, interessante materie, maar ik kan mij dit systeem nog niet helemaal voor de geest halen. Ik moet dus een extra tabel maken met daarin 'groep' en 'software'.. right? Daarin staan alle groepen met daarbij de software, hoe genereer ik deze tabel dan? Want de klassen/software veranderen qua naam, worden verwijderd enz.
Dan wordt het:
PHP:
1
Select software,groepen From koppeltabel Where groep = $varvangroep AND software = ???


Hoe moet ik dat dan zien qua SQL?

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

De koppeltabel zal in dit geval 2 velden hebben met 2 foreign keys, groep_id & software_id. Om dan alle groepen met de bijbehorende software op te halen zal je met JOIN's moeten werken. Bij het verwijderen kan je iets van cascade on delete gebruiken (kent MySQL dat?) of gewoon alles met het id dat je wilt verwijderen uit alle tabellen gooien. :)

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Bij het verwijderen kan je iets van cascade on delete gebruiken (kent MySQL dat?) of gewoon alles met het id dat je wilt verwijderen uit alle tabellen gooien. :)
Ja ... dat wordt inderdaad het laatste ... eventueel voorzien van een transaction-procedure om te voorkomen dat er "orphans" in je database blijven staan.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Of foreign keys gebruiken, maar dat legt weer restricties op aan je MySQL versie en tabeltype :)

[ Site ] [ twitch ] [ jijbuis ]

Pagina: 1