Voor twee websites gebruik ik twee databases

Nieuws (bevat nieuwsberichten)
Wedstrijden (bevat wedstrijd gegevens)


In de Wedstrijden database is ook een w.nieuwsbericht_id opgenomen over deze wedstrijd.
Het w.nieuwsbericht_id is dezelfde waarde als het n.nieuwsbericht_id die in de Nieuws database staat en dat het wedstrijdverslag mbt die wedstrijd bevat.

Ieder w.wedstrijd_id heeft NULL of maximaal één nieuwsbericht_id

In De Nieuws database staat geen n.wedstrijd _id.
Want niet ieder nieuwsbericht is ook een wedstrijdverslag.


Nu heb ik het voor elkaar dat ik via een:

 mysqli_query( $dbconnection_W, select.....

Uit de Wedstrijden database wordt gehaald.

Die gegevens uit de Wedstrijden database plaats ik op de pagina: MATCHPAGE van de Nieuws website.

Dat gaat allemaal goed.

MAAR..
Uit de wedstrijden database komt per wedstrijd dus ook een w.nieuwsbericht_id.
Via een function zou ik graag de n.permalink uit de Nieuws database willen selecteren. Daarmee kan ik dan bij elke wedstrijd een anchorlink naar het bijbehorende nieuwsbericht (lees wedstrijd verslag) maken.

Daarvoor heb ik deze function bedacht:

128 function show_permalink($id)
129 {
130 $sql_permalink = mysqli_query($dbconnection_N,
131 "SELECT 
132 n.permalink as permalink 
133 FROM newsitems n 
134 WHERE n.NewsItem_ID=".$id."
135 AND  n.NewsItem_Publist='Y'") 
136 or die (mysqli_error($dbconnection_N)); 
137 
138 while($record = mysqli_fetch_array($sql_permalink))
139 {
140 $permalink = $record['permalink'];
141 return $permalink;
 


Deze function roep ik aan in de "MATCHPAGE" van de Nieuws website:

 
If($record['w.nieuwsbericht_id']==0)
	{($MatchReport= $NO_MatchReport_Icon );}
	else
	{($MatchReport='<a href="/article/'.show_permalink($record['w.nieuwsbericht_id].) '">'.$MatchReport_Icon.'</a>');}




Wat er nu gebeurd is dat ik een foutmelding:
Undefined variable: dbconnection_N in functions op regel 134 en 138 van de function show_permalink 


Ik snap dat de dbconnection_W het gebruik van de dbconnection_N blokkeert.

hopelijk heb ik e.e.a. een beetje begrijpelijk genoteerd
Is het niet mogelijk om alles te migreren naar één database?
De database en de websites zijn juist (jaren geleden al) gesplitst. :-)
En met welke reden? met Mysqli heb je een handige linkidentifier, maar toch is het schakelen tussen meerdere databases wel een gedoe....
In show_permalink() wordt $dbconnection_N niet geïnitialiseerd, vandaar die foutmelding. Ongetwijfeld zal het een globale variabele zijn die elders gedefinieerd wordt; in dat geval zou het voldoende moeten zijn om
<?
global $dbconnection_N;
?>
aan het begin van show_permalink() op te nemen. Of je geeft $dbconnection_N mee als parameter aan show_permalink(); dat werkt ook als $dbconnection_N geen globale variabele is maar in de scope van een andere functie is gedefinieerd.

Ik neem aan dat je met "2 databases" bedoelt dat de databases zich op verschillende servers bevinden? Als je MySQL-server de federated engine ondersteunt, zou je ook nog kunnen werken met federated tables; op die manier kun je zelfs joins uitvoeren met tabellen die op een andere server staan. Maar let op, want er zitten wel wat haken en ogen aan qua query-optimalisatie.
Het zijn twee database die op één server draaien.

De databases heb ik gesplitst omdat de database met nieuwsberichten onder de "nieuws" website hangt en de wedstrijden database onder de "wedstrijden" website.

De enige link die er tussen beide databases is, is dat een nieuwsbericht mogelijk ook een wedstrijdverslag is dat bij en wedstrijd uit de wedstrijden database hoort.

In de index.php heb ik een
 include_once $inc_directory. "inc-i-n-connect.php"; 
staan.

Daarmee lukt het me om binnen de nieuws website overal $dbconnection_N; gebruiken. dan is deze toch
Global [/code}


Maar de function [code] show_permalink
wordt aangeroepen vanuit de pagina die primair $dbconnection_N gebruikt.

Moet ik misschien ergens eerst een
mysqli_close($conn); 
doen??
Infeite is het een kwestie van dit:


<?php
/* Connectie gegevens hier */

$mysqli = new mysqli($host, $user, $password);

// Controleer de verbinding
if ($mysqli->connect_error) {
    die("Verbinding mislukt: " . $mysqli->connect_error);
}

// Selecteer de eerste database
$db_nieuws = "nieuws";
$mysqli->select_db($db_nieuws);

// Voer een query uit in de eerste database
$query1 = "SELECT * FROM table1";
$result1 = $mysqli->query($query1);
if ($result1) {
    while ($row = $result1->fetch_assoc()) {
        print_r($row);
    }
}

// Wissel naar de tweede database
$db_wedstrijden = "wedstrijden";
$mysqli->select_db($db_wedstrijden );

// Voer een query uit in de tweede database
$query2 = "SELECT * FROM table2";
$result2 = $mysqli->query($query2);
if ($result2) {
    while ($row = $result2->fetch_assoc()) {
        print_r($row);
    }
}

// Sluit de verbinding
$mysqli->close();
?>
Dank voor de sneller reactie. ziet er overzichtelijk uit. ik ga er dit weekend even voor zitten.
Mar kla op 06/09/2024 22:22:04

Het zijn twee database die op één server draaien.
Mooi, dat houdt het simpel.


In de index.php heb ik een
 include_once $inc_directory. "inc-i-n-connect.php"; 
staan.

Daarmee lukt het me om binnen de nieuws website overal $dbconnection_N; gebruiken. dan is deze toch Global
Ja, maar waarschijnlijk gebruik je verder geen functies waarin je $dbconnection_N nodig hebt, anders had je dit probleem al eerder gehad. Een functie erft (in PHP) niet standaard de globale variabelen uit de overkoepelende scope; dat moet je expliciet aangeven. Voorbeeld:
<?php
$x = 1;
function echo_x ()
{
echo $x;
}
echo_x();
?>
Dit zal geen output opleveren, maar
<?php
$x = 1;
function echo_x ()
{
global $x;
echo $x;
}
echo_x();
?>
doet wel wat je verwacht.

Tijdens mijn studie (alweer 35 jaar geleden; ik geloof dat ik oud begin te worden) werd ons expliciet verboden om globale variabelen te gebruiken; je zou bijvoorbeeld in een andere functie per ongeluk een variabele met dezelfde naam kunnen gebruiken en daarmee ongewild de waarde van de globale variabele veranderen. Dat zijn fouten waar je maanden naar kunt zoeken. PHP probeert je daartegen te beschermen door te vereisen dat je expliciet aangeeft dat je een variabele uit de globale scope wilt gebruiken.


Maar de function
 show_permalink
wordt aangeroepen vanuit de pagina die primair $dbconnection_N gebruikt.

Moet ik misschien ergens eerst een
mysqli_close($conn); 
doen??

Nee, maar je moet wel aangeven op welke database/tabel je de query wilt uitvoeren. Dat kan op de manier die Ariën beschreef, met een select_db(), maar zelf vind ik het praktischer om dat in de query aan te geven. Dat wordt dan zoiets (voor de leesbaarheid laat ik even de foutafhandeling en zo weg):
<?php
$mysqli = new mysqli($host, $user, $password);

$query1 = "SELECT * FROM nieuwsdb.newsitems";
$result1 = $mysqli->query($query1);
// Haal data op en doe er iets mee

$query2 = "SELECT * FROM wedstrijddb.wedstrijden";
$result2 = $mysqli->query($query2);
// Haal data op en doe er iets mee
?>
Dit kan nog wel mis gaan (ook bij de code van Ariën) als je voor de databases 'nieuwsdb' en 'wedstrijddb' verschillende database-users hebt die alleen hun eigen database kunnen zien; in dat geval zul je nog de relevante grants moeten uitdelen.

En nu kunnen we zelfs nog een stapje verder gaan door de nieuwsitems meteen in de wedstrijdquery te joinen:
<?php
$query = "
SELECT w.*, n.permalink
FROM wedstrijddb.wedstrijden w
LEFT JOIN nieuwsdb.nieuwsitems n ON n.NewsItem_ID = w.nieuwsbericht_id AND n.NewsItem_Publist = 'Y'
";
?>
Scheelt weer een query op je database. ;-)
Gebruik toch gewoon een database die meerdere schema's ondersteunt, zoals PostgreSQL.
In plaats daarvan een beetje prutsen in MySQL, het is maar waar je zin in hebt?
Volgens mij zijn er (tot waarschijnlijk jouw grootste teleurstelling) weinig webhosters die PostgreSQL aanbieden in hun pakketten. Standaard zit het ook niet in DirectAdmin.

Maar ik wil zeker toegeven dat het beter en vooral logischer is dan MySQL en MariaDB. Jij bent niet de enige in ieder geval.

Reageren