Beste mensen,

Korte vraag:

Ik zit met een vrij diep systeem qua categorisering. Het probleem is nu dat ik bij het QUERY-en in PHP conflicten krijg met het aanroepen van de specifieke AUTO_INCREMENT -ID- van een van de TABLES die in de QUERY worden aangeroepen.

Neem dit voorbeeld:

$query = mysql_query('SELECT * FROM item_db, item_sorts, item_types, item_bonusses, item_bonus_sort, item_bonus_type, player_inventories WHERE char_id = 1');


WHERE char_id is niet een conflict aangezien deze maar 1 keer voorkomt (namelijk zijn/haar inventory).

Maar als ik nu bijv. een specifieke ID van een table wil hebben, hoe roep ik die dan aan? Ik gebruik liever geen anderen ID referentie in elke tabel dan ID. Eerder gebruikte ik bij elke table bijv. inventory_id, user_id, character_id, maar vind het gewoon te storend met al die andere waarden in alle tables..
gebruik kolomnamen ipv van de asterix(*)

dus: SELECT kolom_a, kolom_b, kolom_c FROM tabel....

Als je specifieke id's wil ophalen waarbij de namen dubbel voorkomen kun je een alias gebruiken.


dus: SELECT kolom_a, kolom_b, kolom_c AS iets FROM tabel....
Hoe ziet je datamodel eruit? Bovenstaande query (waarbij $query géén query is, maar een resultset) levert een berg data op, maar daar zit geen enkel verband in. Het is dan ook niet meer dan een hoopje ellende, er is geen enkele JOIN te bekennen.
Het een game systeem. Dit gedeelte is voor de ITEMS in de speler's CHARACTER's INVENTORY.

Wat ik wil bereiken met een query:

SELECTEER alle ITEMS van CHARACTER_ID z'n INVENTORY en haal de ORGINELE ITEM_ID uit de ITEM_DB en de bonuses relevant aan die ITEM('s) ook.

Het resultaat: Een lijst met alle ITEMS in de INVENTORY van de USER's CHARACTER


Is dit duidelijk? : ( ...


Ik zou dan zoiets moeten doen als dit:


<?php
    $query = mysql_query('SELECT * FROM item_db, item_sorts, item_types, item_bonusplayer_inventories WHERE char_id.player_inventories = 1');
?>


..maar dan met nog meer checks zodat precies de nodige data terug moet komen die bij de items horen in de inventory.


Als mijn item_db table later duizenden items zou bevatten is het neem ik aan niet handig om bij elke SELECT *(ALL) te gebruiken? Is dit heel erg belastend voor de server? Ik bedoel, veel meer belastend dan een specifieke (circa) 10rows table met bijv. 5000 entries?
Okee, maar hoe ziet je datamodel er uit? Daar hangt alles vanaf namelijk.
Tijd voor een tutorial!

Ga eens netjes met JOIN's werken, dan zal het een stuk beter gaan.
Ik heb deze tabels die direct relevant zijn:

system_users Hier komen alle users in
system_characters Hier komen de characters van de user (user_id) in
item_db Hier staan alle items in
item_sort Hier staan de soorten items in
item_types Hier staan de types items in (wordt in elke item in item_db vermeld om te linken, als de item_type bekend is haal ik met script de relevante item_sort op)
item_bonus_sorts Hier staan de bonus soorten van item in (bonuses die items kunnen krijgen)
item_bonus_type Hier staan de specifieke bonuses in

Ik weet niet precies hoe ik het datamodel moet overbrengen.

Hopelijk heldert dit iets op..


EDIT_NOTE: Ik gebruik tot nu toe bijna altijd elke row in de tabellen. Is het dan erg om toch wel de SELECT * te gebruiken? Of moet ik persee voor de specifieke selects kiezen bij de tables voor lagere server belasting?
* gebruik je alleen wanneer je bugs in je systeem wilt hebben, anders niet.
Met andere woorden; query's van 20-40 regels code?
Erwin schreef op 26.05.2008 21:46
Met andere woorden; query's van 20-40 regels code?
Dat is dan nog een korte query, dat past nog makkelijk op 1 A4-tje.

Edit: Tip: maak een VIEW aan in je database, die kun je wel veilig met een * gebruiken, een VIEW kan niet zomaar wijzigen.
Een probeersel, maar het werkt helaas nog niet:


<?php
	$query = mysql_query('
		SELECT
			idb.name,
			idb.description,
			idb.image,
			idb.basevalue,
			idb.weight,
			idb.durability,
			idb.quantity_max,
			idb.hands,
			idb.damage_min,
			idb.damage_max
			pin.item_quantity,
			pin.durability_current
		FROM
			item_db idb,
			item_sorts iso,
			item_types ity,
			player_inventories pin,
			system_characters sch
		WHERE
			sch.id = pin.char_id AND
			idb.id = pin.itemdb_id
	');
	
	while($row = mysql_fetch_array($query)) {
		echo '<tr><td>Item name: '.$row['name'].'</td><td></td></tr>';
	}
?>


Error:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /Applications/MAMP/htdocs/project/sql_testing.php on line 102

*Line 102 is: while($row = mysql_fetch_array($query)) {


Hoe roep je sowieso al de $row['array_variable'] name aan van een specifieke table? Moet je dan altijd AS gebruiken? Maar goed, in dit geval werkt de fetch niet eens.. :(

Hopelijk kan iemand helpen :)

Reageren