punt in naam

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan Volker

Jan Volker

09/04/2009 11:20:00
Quote Anchor link
Beste PHPHulp,

Ik ben bezig met een script, en aan de hand van dat script moet ik gegevens uit de database halen.
De database beschikt over meerdere tabellen, en ik moet in sommige scripts gegevens uit verschillende tabellen halen
In de SQL doe ik dat alsvolgt;
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT tabel1.kolomnaam, tabel2.kolomnaam FROM tabel1, tabel2

Dit werkt gewoon, nu moet ik dit omzetten naar PHP, en daar heb ik de volgende code voor gebruikt;
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
<?php
include "connect.php"; //verbinding maken
$query = "SELECT tabel1.kolomnaam, tabel2.kolomnaam FROM `tabel1, tabel2`";
//query is aangemaakt
$sql = mysql_query($query);
//query is uitgevoerd
echo"<table border=\"1\">
<tr><td>tabel1.kolomnaam</td><td>tabel1.kolomnaam</td></tr>"
;
while($record = mysql_fetch_assoc($sql))
{

echo"<tr><td>".$record->tabel1.kolomnaam."</td><td>".$record->tabel2.kolomnaam."</td></tr>";
}

echo "</table>";
?>

Wanneer ik het bovenstaande doe krijg ik een foutmelding met "Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in (..)".
Ik weet dat het komt, omdat ik een punt heb staan bij de record (.$record->tabel1.kolomnaam.). Maar dit is ook volgens mij de enige manier die ik ken om aan te geven om welk kolom het gaat.

Weten jullie hier een oplossing voor. Hoe kan ik de tabel + kolomnaam opgeven zonder gebruik te maken van een punt, of de script zodanig kan aanpassen zodat ik die punt alsnog kan gebruiken.

Met vriendelijke groet,
Jan Volker
 
PHP hulp

PHP hulp

19/04/2024 10:52:11
 
- SanThe -

- SanThe -

09/04/2009 11:28:00
Quote Anchor link
Haal de backtics uit de query en bouw een fatsoenlijke foutafhandeling in.
 
Frank -

Frank -

09/04/2009 11:37:00
Quote Anchor link
Offtopic, het ontopic gedeelte is reeds beantwoord: De query slaat nergens op. Je haalt nu lukraak data uit 2 tabellen (althans, dat probeer je), maar er zit geen enkel verband tussen deze 2 tabellen. De resultaten die je vervolgens retour krijgt, zijn dan ook klinkklare onzin en kunnen zo richting prullenbak.

Wanneer jij 2 tabellen hebt die samen 1 resultset moeten opleveren, heb je een UNION nodig (zou wel duiden op een fout/raar datamodel) of een JOIN:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
  tabel1.kolomnaam,
  tabel2.kolomnaam
FROM
  tabel1
    INNER JOIN tabel2 ON tabel1.id_tabel1 = tabel2.id_tabel1

Hierbij staan dan in beide tabellen in de kolom "id_tabel1" de waardes die aangeven welke records bij welke records horen.

Zonder JOIN slaan de resultaten als een koe op een varken en kun je er niks mee.

Ps. Er zijn nog andere soorten JOINs mogelijk, een INNER JOIN is slechts één van de mogelijkheden.
 
Kitty N

kitty N

09/04/2009 13:06:00
Quote Anchor link
Quote:
Ps. Er zijn nog andere soorten JOINs mogelijk, een INNER JOIN is slechts één van de mogelijkheden.


Om even een aanvulling te geven op JOIN:

http://www.w3schools.com/Sql/sql_join.asp
 
Dennis Mertens

Dennis Mertens

09/04/2009 13:09:00
Quote Anchor link
Je gebruikt natuurlijk dan wel de MySQL site (als je MySQL gebruikt).

Ik vind die site veel fijner, want die is ook uitgebreider :)

Maar ieder zen ding.
 
Kitty N

kitty N

09/04/2009 13:15:00
Quote Anchor link
Voor mysql hebben we eventueel deze:

http://dev.mysql.com/doc/refman/5.0/en/join.html

ligt er dan ook weer aan welke versie je gebruikt..
Gewijzigd op 01/01/1970 01:00:00 door kitty N
 
Robert Deiman

Robert Deiman

09/04/2009 13:18:00
Quote Anchor link
En gebruik mysql aliassen wanneer je uit 2 tabellen een kolom met eenzelfde naam ophaalt.

SELECT tabel1.kolomnaam AS t1_kolom, tabel2.kolomnaam AS t2_kolom

en om de waarde in PHP te tonen gebruik je alleen de kolomnaam, niet de tabelnaam erbij.

$row['kolomnaam'] of $row['t1_kolom'] als je aliasses gebruikt.
 
Dennis Mertens

Dennis Mertens

09/04/2009 13:25:00
Quote Anchor link
@Robert: Zo zou ik het nog niet doen, alleen als je dezelfde (veld)namen hebt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
    p.name, p.age, m.time
FROM
    person AS p
    INNER JOIN message AS m
    USING (per_mes)


In mijn voorbeeld gebruik ik USING en geen ON. Dit omdat ik er van uit ga, dat per_mes een veld naam is in person EN in message. Als de veldnamen niet gelijk zijn (wat eigenlijk niet zou kloppen, aangezien het gerelationeerde velden zijn, en deze dus dezelfde naam zouden moeten hebben, ze bevatten immers dezelfde gegevens), dan kan je ON gebruiken.
 
Frank -

Frank -

09/04/2009 14:02:00
Quote Anchor link
Quote:
Dit omdat ik er van uit ga, dat per_mes een veld naam is in person EN in message. Als de veldnamen niet gelijk zijn (wat eigenlijk niet zou kloppen, aangezien het gerelationeerde velden zijn, en deze dus dezelfde naam zouden moeten hebben, ze bevatten immers dezelfde gegevens)

Hier doe je toch wat aannames die echt niet kloppen.

In een tabel staat een id. In een andere tabel staat ook een id. Deze id's hebben niets met elkaar te maken en zijn door hun namespace (de tabelnaam) uniek. Probeer nu eens uit te leggen waarom dit fout zou zijn.

Dat er vervolgens een kolom is in tabel B met de naam id_tabel_a, dat heeft 100x niks te maken met een foute naam, fout datamodel of wat dan ook. Het zegt precies wat het is en doet (mits een foreign key aanwezig is) ook precies wat het moet doen.

Het doen van aannames, is de grootste fout die je kunt maken, dat gaat altijd fout. In simpele queries zul je daar niet snel problemen mee krijgen, maar een foutje in een simpele query is ook zo opgelost. Dat is dus geen probleem, het probleem groeit explosief in complexe queries! En daar wil je nu juist geen problemen in hebben...

Behalve tabel- en kolomnamen, zijn er ook nog schemanamen, wat dus nog meer namespaces oplevert. En dus ook nog meer problemen wanneer je lukraak aannames gaat doen. Er is niks mis met een ON, dat is zeer duidelijk en voorkomt problemen.
 
Dennis Mertens

Dennis Mertens

09/04/2009 14:04:00
Quote Anchor link
Nou, ik heb NOOIT een veld genaamd id. Dan heet dat veld id_user ofzo.

Ik vind een veld genaamd id niks zeggends.
 
Frank -

Frank -

09/04/2009 14:08:00
Quote Anchor link
Dennis Mertens schreef op 09.04.2009 14:04:
Ik vind een veld genaamd id niks zeggends.
Dat klopt ook, een id zegt ook niks en hoort ook niks te zeggen.

Het id in tabel users, maakt wel duidelijk dat het een id in de tabel users betreft. Het staat tenslotte niet in de tabel hobbies. namespace is het toverwoord.

Er is niks mis met jouw naamgevingen, maar ga niet beweren dat een andere methode fout is zonder bruikbare argumenten te dragen. Er zijn gewoon meerdere mogelijkheden. Maar wat je ook doet, doe NOOIT aannames.
 



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.