Gegevens uit de ene tabel gebruiken om gegeves uit een andere optehalen

Status
Niet open voor verdere reacties.

The Lion93

Gebruiker
Lid geworden
12 jul 2007
Berichten
189
Hallo,
Ik ben bezig om mijn Joomla website en phpBB forum wat meer te integreren. Ik wou dit doen d.m.v. het weergeven van de positie in de TOTO stand van Joomla in het phpBB profiel. Hiervoor moeten er steeds gegevens uit de ene tabel worden opgehaald waarmee vervolgens weer andere gegevens uit een andere tabel worden opgehaald.

Voorbeeld: eerst wordt het id van de gebruiker opgehaald, dat id wordt gebruikt om te kijken in welke projecten dat id meespeelt enz....

verkrijg het juiste id van de gebruiker <-- verkrijg toto project id's <-- verkrijg prediction id's <-- verkrijg prediction naam

En alles staat in verschillende tabellen, moet ik dan telkens een nieuwe mysql_query draaien? Maar het is dus lastig doordat elke query gegevens uit de vorige query moet halen. Ik weet dus niet of ik dit kan combineren in één query.

Bedankt!
 
Laatst bewerkt:
Voor zover ik weet is het niet mogelijk om dit in één query te zetten... Maar mysql kan behoorlijk wat hebben hoor ;)
Ik werk aan sites die soms 5 querys achter elkaar moet uitvoeren om te controleren en op te halen. Toch is de laadtijd helemaal niet zo hoog! :)
 
Hoe kan ik die tussengegevens dan opslaan, of gebruiken? Ik snap niet zo veel van deze regels:

PHP:
$result = mysql_query($sql);
 
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    echo '
        <tr>
            <td>' . $row['title'] . '</td>
            <td>' . $row['created'] . '</td>
        </tr>
    ';
Dit zorgt er dus voor dat alle gegevens steeds in zo'n tabelvorm geprint worden, dat komt door de while functie toch? Maar als ik nu dus uit zo'n query meerdere items terug krijg. Bv, project id's: 4, 5 & 8. Hoe zorg er dan weer voor dat van al die project id's de prediction id's worden opgehaald en dat dit niet helemaal door elkaar gaat lopen. Moet die nieuwe query dan op regel 2?
 
De gegevens worden geprint door de while loop ja...

Ik snap eigenlijk niet wat je eigenlijk precies wil, maar ik kan je wel het volgende uitleggen:

Als bij een gebruikers-id bijvoorbeeld 3 projecten horen, dan kan je dat door middel van een while loop verwerken:

PHP:
<?php
$result = mysql_query($sql); 

while($row = mysql_fetch_asoc($result)) {
$sql = "SELECT * FROM tabelnaam WHERE projectid=".$row['projectid']; // Even aanpassen
// enz...
}

Je kunt ook querys uitvoeren binnen while loops, want de bovenstaande whileloop verwerkt de resultaten 1 voor 1. Verder zou ik wat meer informatie willen hebben over wat je precies wil, wat wil je met de data die je krijgt doen?
 
Mijn doel is om de naam van een prediction id te krijgen waarin de gebruiker meespeelt:

dit gebreurt via dit schema:
query tabel input output
query 1 iwg3_joomleague_tip_members user_id project_id
query 2 iwg3_joomleague_predictiongame_project project_id prediction_id
query 3 iwg3_joomleague_predictiongame id name

dus query 1 haalt zijn input(=user_id) uit de url (dit is de phpBB user_id die door middel van een andere query omgezet word naar de Joomla user_id, hier is niks mis mee, dit werkt gewoon, alleen dit is voor mij makkelijker te begrijpen omdat er maar 1 waarde is)
query 2 haalt zijn input uit query 1 enz....
 
Dat snap ik ja, maar horen er bij projecten ook meerdere prediction id's?
En bij prediction id's ook meerdere namen?
En wat wil je met de info? :P
 
Bij users kunnen meerdere projecten horen maar elk project_id hoort maar bij één predicition_id.

Ik wil ze in een profiel zetten dus;) Zodat je in één oogopslag kunt zien in welke TOTO's de gebruiker meespeelt.
 
Oke! Mooi, dat wordt een simpel stukje code!

Wel even aanpassen aan jouw eisen, deze code is namelijk helemaal zonder opmaak!

Verder heb ik het script nog niet getest, heb het alleen snel in elkaar gedraait!

PHP:
<?php
$result = mysql_query("SELECT * FROM iwg3_joomleague_tip_members WHERE user_id='".$user_id."'"); // Variabelen nog even veranderen // Projecten van user ophalen

while($row = mysql_fetch_assoc($result)){ // Start while loop

	$prediction_id_sql = mysql_query("SELECT * FROM iwg3_joomleague_predictiongame_project WHERE project_id='".$row['project_id']."'"); // prediction_id ophalen

	if(mysql_num_rows($prediction_id_sql) == 1) { // Is het wel één prediction_id?

		$prediction_id = mysql_fetch_assoc($prediction_id_sql); // queryresultaten in array

		$name = mysql_query("SELECT * FROM iwg3_joomleague_predictiongame WHERE id='".$prediction_id['prediction_id']."'"); // Naam ophalen

		if(mysql_num_rows($name) == 1) { // Is het wel één naam?

			$name = mysql_fetch_assoc($name);
			echo $name['name']; // Naam van project weergeven

		} else {

			echo "Er ging iets fout (Geen of meerdere hits in tabel iwg3_joomleague_predictiongame); // Er is geen naam of er zijn meerdere namen

		}

	} else {

		echo "Er ging iets fout (Geen of meerdere hits in tabel iwg3_joomleague_predictiongame_project); // Er is geen prediction_id of er zijn meerdere prediction_id's

	}

}

?>
 
Laatst bewerkt:
Bedankt voor het script, ben het nog bezig de variabelen te veranderen en te testen.

Ik heb alleen een aantal vragen over verschillen in jouw manier van schrijven en die van mij
Wanneer ik een verbinding met de database maak gebruik ik dit:
SELECT tabel.row FROM tabel WHERE tabel.row = enz....
Jij doet het op een andere manier:

SELECT * FROM iwg3_joomleague_tip_members WHERE user_id= enz...

Jouw manier lijkt me handiger en korter. Maar wat betekend het *? Dat hij de hele tabel controleert?

Edit: In de laatste stap lijkt iets mis te gaan. Dit is exact het script dat ik uitvoer:
PHP:
<?php
//maak een verbinding met de database
$link = mysql_connect('localhost', 'root');
mysql_select_db('theyello_iwg3wjo', $link);

$result = mysql_query("SELECT * FROM iwg3_joomleague_tip_members WHERE user_id=63"); // Variabelen nog even veranderen // Projecten van user ophalen

while($row = mysql_fetch_assoc($result)){ // Start while loop
//Controle
echo 'project_id ';
echo $row['project_id'];
echo '<br>';
//Eind
    $prediction_id_sql = mysql_query("SELECT * FROM iwg3_joomleague_predictiongame_project WHERE project_id='".$row['project_id']."'"); // prediction_id ophalen
 
    if(mysql_num_rows($prediction_id_sql) == 1) { // Is het wel één prediction_id?
 
        $prediction_id = mysql_fetch_assoc($prediction_id_sql); // queryresultaten in array
		//Controle
		echo 'prediction_id ';
		echo $prediction_id['prediction_id'];
		echo '<br>';
		//Eind
        $name = mysql_query("SELECT * FROM iwg3_joomleague_predictiongame WHERE id='".$prediction_id['prediction_id']."'"); // Naam ophalen
 
        if(mysql_num_rows($name) == 1) { // Is het wel één naam?
 
            echo $name['name']; // Naam van project weergeven
 
        } else {
 
            echo "Er ging iets fout (Geen of meerdere hits in tabel iwg3_joomleague_predictiongame)"; // Er is geen naam of er zijn meerdere namen
 
        }
 
    } else {
 
        echo "Er ging iets fout (Geen of meerdere hits in tabel iwg3_joomleague_predictiongame_project)"; // Er is geen prediction_id of er zijn meerdere prediction_id's
 
    }
 
}
 
?>

En dit is de exacte output:
Code:
project_id 4
prediction_id 1
project_id 8
prediction_id 2

Geen namen dus..?
 
Laatst bewerkt:
Jouw manier lijkt me handiger en korter. Maar wat betekend het *? Dat hij de hele tabel controleert?
"SELECT *" betekent dat hij elke kolom ophaalt (het is dus gelijk aan elke kolom, gescheiden door een komma, te noemen). Tijdens het testen is dat erg handig, daarna verdient het de aanbeveling om alleen de kolommen op te halen die je daadwerkelijk nodig hebt.

Geen namen dus..?

Je moet na regel 26 en voor regel 28 nog "mysql_fetch_assoc" gebruiken:
PHP:
$name = mysql_fetch_assoc($name);
 
* staat voor een soort wildcard, hij kiest alle mogelijke dingen dan. In dit geval dus alle kolomnamen ja :)
Het bespaart dataverkeer als je de wildcard vervangt door de kolomnamen die je wil gebruiken, maar mijn gewoontes zijn nou eenmaal het sterretje te gebruiken, omdat ik vaak met scripts werk waarbij ik alle kolomnamen nodig heb ;)
 
Dat is geen beste gewoonte. Als je alle kolomnamen apart benoemd is het altijd en overal duidelijk welke keys in je array beschikbaar zijn.
 
Ik heb de regels voor het checken of het maar één regel oplevert er even uitgehaald maar ik krijg nu een syntax error op regel 8. Ik kan het probleem alleen niet vinden!
PHP:
<table>

<?php
//maak een verbinding met de database
$link = mysql_connect('localhost', 'root');
mysql_select_db('theyello_iwg3wjo', $link);

$project_id_sql = mysql_query(SELECT * FROM iwg3_joomleague_tip_members WHERE user_id=63); // Projecten van user ophalen
while($project_id = mysql_fetch_assoc($project_id_sql)){ // Start while loop

    $prediction_id_sql = mysql_query(SELECT * FROM iwg3_joomleague_predictiongame_project WHERE project_id=' . $project_id['project_id'] . '); // prediction_id ophalen
    $prediction_id = mysql_fetch_assoc($prediction_id_sql); // queryresultaten in array

    $name_sql = mysql_query(SELECT * FROM iwg3_joomleague_predictiongame WHERE id=' . $prediction_id['prediction_id'] . '); // Naam ophalen
    $name = mysql_fetch_assoc($name_sql);
	
	if($num_rows != 0) {
		echo '
		<tr>
				<td width=100% class="row1" colspan="2" align="center">' . $name['name'] . '</td>
		</tr>
		';
	} else {
		echo '
			<tr>
				<td width=100% class="row1" colspan="2" align="center">Deze gebruiker speelt in geen TOTOs</td>
			</tr>
	';
}

//sluit de database
mysql_close($link);
?>

</table>
 
Laatst bewerkt:
Dat lost idd een deel van het probleem op. Huidige code:
PHP:
<table>

<?php
//maak een verbinding met de database
$link = mysql_connect('localhost', 'root');
mysql_select_db('theyello_iwg3wjo', $link);

$project_id_sql = mysql_query("SELECT * FROM iwg3_joomleague_tip_members WHERE user_id='63'"); // Projecten van user ophalen
while($project_id = mysql_fetch_assoc($project_id_sql)){ // Start while loop

    $prediction_id_sql = mysql_query("SELECT * FROM iwg3_joomleague_predictiongame_project WHERE project_id='".$project_id['project_id']."'"); // prediction_id ophalen
    $prediction_id = mysql_fetch_assoc($prediction_id_sql); // queryresultaten in array

    $name_sql = mysql_query("SELECT * FROM iwg3_joomleague_predictiongame WHERE id='".$prediction_id['prediction_id']."'"); // Naam ophalen
    $name = mysql_fetch_assoc($name_sql);
	
	if($num_rows != 0) {
		echo '
		<tr>
				<td width=100% class="row1" colspan="2" align="center">'.$name['name'].'</td>
		</tr>
		';
	} else {
		echo '
			<tr>
				<td width=100% class="row1" colspan="2" align="center">Deze gebruiker speelt in geen TOTOs</td>
			</tr>
	';
	}
}

//sluit de database
mysql_close($link);
?>

</table>

Alleen als een gebruiker nu niet meespeelt krijg ik 2x "Deze gebruiker speelt in geen TOTOs" omdat de "if($num_rows != 0)" in de while loop zit natuurlijk! Hoe kan ik dit oplossen?

Maar er is nog iets dat ik niet begrijp, waarom moet ik in dit geval in een query die 2e " zetten? Dus:
PHP:
WHERE project_id='".$project_id['project_id']."'
en waarom werkt dit niet:
PHP:
WHERE project_id='.$project_id['project_id'].'
In een ander script is dat niet nodig:
PHP:
$jfusion_sql = mysql_query('SELECT id, userid FROM iwg3_jfusion_users_plugin WHERE userid = ' . $u . '');
Daar werkt het wel gewoon zonder die haakjes.

Edit: Ik krijg geen output wanneer de gebruiker wel meespeelt:(
 
Laatst bewerkt:
Verderis het stuk met deze gebruiker speelt geen toto een foute plaatsing, als het aantal namen wat bij een prediction id hoort 0 is, dan is er iets goed fout in de database, en ligt het niet bij de user. Dus op die plek moet eerder een foutmelding.

Je krijgt 2 keer de melding omdat de variabele $num_rows niet bestaat: het moet "mysql_num_rows($name_sql)" zijn denk ik.

Verder het antwoord op je vraag:
Het kan denk ik op beide manieren, maar ik gebruik mijn eigen omdat dat veiliger is tegen bepaalde injecties, ook al is hier geen injectie mogelijk (als alles via de database moet). Maar ook om een andere reden. Ik begin met dubbele haakjes, dus als ik het stukje tekst wil afwisselen met een variabele, moet ik met dubbele haakjes gaan werken. Maar als je dan wel enkele haakjes gebruikt, dan krijg je dit als query:

PHP:
<?php
$variabele = "lol";
$lol = mysql_query('SELECT * FROM blabla WHERE variabele='.$variabele);
// Is gelijk aan:
$lol = mysql_query('SELECT * FROM blabla WHERE variabele=lol);
?>

In dit geval worden dus geen haakjes om 'lol' heen gezet in de query, en ik ben van het ordelijke gedoe ^^
 
Verderis het stuk met deze gebruiker speelt geen toto een foute plaatsing, als het aantal namen wat bij een prediction id hoort 0 is, dan is er iets goed fout in de database, en ligt het niet bij de user. Dus op die plek moet eerder een foutmelding.
Ow ja klopt, ik moet natuurlijk die check eerder doen, kijken of bij een user wel een projecten horen?

Oke, ik zal eens verder gaan kijken.
 
Exact! Ik zal wel even voor je aanpassen :)

PHP:
<table>
 
<?php
//maak een verbinding met de database
$link = mysql_connect('localhost', 'root');
mysql_select_db('theyello_iwg3wjo', $link);
 
$project_id_sql = mysql_query("SELECT * FROM iwg3_joomleague_tip_members WHERE user_id='63'"); // Projecten van user ophalen

if(mysql_num_rows($project_id_sql) != 0) {

while($project_id = mysql_fetch_assoc($project_id_sql)){ // Start while loop
 
    $prediction_id_sql = mysql_query("SELECT * FROM iwg3_joomleague_predictiongame_project WHERE project_id='".$project_id['project_id']."'"); // prediction_id ophalen
    $prediction_id = mysql_fetch_assoc($prediction_id_sql); // queryresultaten in array
 
    $name_sql = mysql_query("SELECT * FROM iwg3_joomleague_predictiongame WHERE id='".$prediction_id['prediction_id']."'"); // Naam ophalen
    $name = mysql_fetch_assoc($name_sql);
    
    if($num_rows != 0) {
        echo '
        <tr>
                <td width=100% class="row1" colspan="2" align="center">'.$name['name'].'</td>
        </tr>
        ';
    } else {
        echo '
            <tr>
                <td width=100% class="row1" colspan="2" align="center">Deze gebruiker speelt in geen TOTOs</td>
            </tr>
    ';
    }
}

} else {
echo 'Deze speler speel niet in TOTOs!';
}
 
//sluit de database
mysql_close($link);
?>
 
</table>
 
Haha net iets te laat met je code aanpassingen;) Ik had het zelf al aangepast.

Alles werkt zoals het hoort, bedankt voor alle hulp en aanwijzingen! Weet je toevallig een liefst Nederlandstalige PHP cursus/tutorial site?:d
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan