Ik ben aan het proberen om de nieuwsitems uit 2 verschillende databases te halen. De inloggegevens bij beide databases is verschillend maar de tabel naam is bij beide dezelfde, en dat is 'blog'.
Ik kan ook niet echt werken met een join omdat ik alle gegevens uit beide tabellen nodig heb en er geen voorwaarden zijn buiten dat het op datum moet gesorteerd zijn (desc) en gelimiteerd zijn tot 5 items. Dus kort gezegd komt dit neer op 'geef mij in de select alle resultaten uit beide databases in tabel 'blog' gesorteerd op datum en enkel de laatste 5'

Verder heb ik geen idee hoe ik hieraan moet beginnen.

Ik kan gegevens uit beide tabellen halen maar niet samen.
Heeft iemand een voorbeeld?
Uit mijn hoofd:

(
SELECT col1, col2, col3
FROM db1.blog
ORDER BY datetime DESC
LIMIT 5
)

UNION

(
SELECT col1, col2, col3
FROM db2.blog
ORDER BY datetime DESC
LIMIT 5
)
Dat heb ik al eens geprobeerd maar eerst maak ik een connectie met de databases en zou het kunnen dat het daar fout gaat? Idividueel werkt dat wel maar niet samen precies.

Connectie maak ik op deze manier:
filename: config-1.php

$host = "localhost";
$user = "xxx"; // gebruikersnaam van je phpMyAdmin.
$pass = "xxxx"; // wachtwoord van je phpMyAdmin.
$dbnm = "xxxxx";


filename: config-2.php

$host = "localhost";
$user = "xxx"; // gebruikersnaam van je phpMyAdmin.
$pass = "xxxx"; // wachtwoord van je phpMyAdmin.
$dbnm = "xxxxx";


Dan ga ik die met een require_once('config-1.php') en require_once('config-2.php') gaan inladen. En daarna:

require_once ('connections/config-1.php');
require_once ('connections/config-2.php');
          
         $conn9 = mysql_connect($host,$user,$pass) or die (mysql_error());
         mysql_select_db($dbnm) or die (mysql_error());
		 
		 $sql = "
		 (
SELECT titel
FROM euro_leadmap.blog
ORDER BY datum DESC
LIMIT 5
)

UNION

(
SELECT titel
FROM security_leadmap.blog
ORDER BY datum DESC
LIMIT 5
)
";
		 $res = mysql_query($sql) or die (mysql_error());



Maar dan gaat het precies fout en krijg ik een foutmelding.
Error: SELECT command denied to user 'security_leadmap'@'localhost' for table 'blog'

Ik weet dat het nog de oude connectie methode is maar pas die later wel aan naar een mysqli connectie of PDO.
>> De inloggegevens bij beide databases is verschillend

Volgens mij zul je het dan in PHP moeten oplossen.

stap 1: 5 laatste items ophalen uit db 1

stap 2: 5 laatste items ophalen uit db 2

(Je hebt nu twee arrays met records. Zorg dat de kolomnamen gelijk zijn en zeker de datum kolomnamen)

stap 3: voeg de twee arrays samen met array_merge().

stap 4: Sorteer de array met een eigen vergelijking-functie

stap 5: Verwijder de laatste 5 items van de array

<?php

function compareDates($a, $b)
{
// omzetten van tekst naar timestamp
$a = strtotime($a['created']);
$b = strtotime($b['created']);

if ($a == $b) {
return 0;
}
return ($a > $b) ? -1 : 1;
}

// hoeveel records wil je overhouden?
$limit = 5;

// dit is zogenaamd het resultaat van twee mysql queries
$rows1 = array(
array('created' => '2016-08-21', 'body' => 'Nieuws 1 van database 1'),
array('created' => '2016-08-19', 'body' => 'Nieuws 2 van database 1'),
array('created' => '2016-08-17', 'body' => 'Nieuws 3 van database 1'),
array('created' => '2016-08-15', 'body' => 'Nieuws 4 van database 1'),
array('created' => '2016-08-13', 'body' => 'Nieuws 5 van database 1'),
);

$rows2 = array(
array('created' => '2016-08-20', 'body' => 'Nieuws 1 van database 2'),
array('created' => '2016-08-18', 'body' => 'Nieuws 2 van database 2'),
array('created' => '2016-08-16', 'body' => 'Nieuws 3 van database 2'),
array('created' => '2016-08-14', 'body' => 'Nieuws 4 van database 2'),
array('created' => '2016-08-12', 'body' => 'Nieuws 5 van database 2'),
);

// arrays samenvoegen
$rows = array_merge($rows1, $rows2);

// array sorteren op datum
usort($rows, 'compareDates');

// de laatste vijf items van de array weghalen
$rows = array_slice($rows, 0, $limit);

foreach ($rows as $row) {
echo $row['created'] . ': ' . $row['body'] . "<br>\n";
}
?>
@Frank: moet ik eens proberen. Een hele boterham... Wist niet dat het zo ingewikkeld was. Moesten de logingegevens van beide databases dezelfde zijn zou het dus eigenlijk veel eenvoudiger zijn? Maar in mijn geval is dat niet mogelijk omdat die van 2 verschillende klanten zijn.
Laat me je helpen Brecht. Laat eens zien hoe je de rijen ophaalt uit de database dan pas ik het voorbeeld aan op jouw situatie.
Kan je mij wel beetje helpen hoe ik dit voor elkaar krijg vanuit mijn select query?

// dit is zogenaamd het resultaat van twee mysql queries
$rows1 = array(
array('created' => '2016-08-21', 'body' => 'Nieuws 1 van database 1'),
array('created' => '2016-08-19', 'body' => 'Nieuws 2 van database 1'),
array('created' => '2016-08-17', 'body' => 'Nieuws 3 van database 1'),
array('created' => '2016-08-15', 'body' => 'Nieuws 4 van database 1'),
array('created' => '2016-08-13', 'body' => 'Nieuws 5 van database 1'),
);

$rows2 = array(
array('created' => '2016-08-20', 'body' => 'Nieuws 1 van database 2'),
array('created' => '2016-08-18', 'body' => 'Nieuws 2 van database 2'),
array('created' => '2016-08-16', 'body' => 'Nieuws 3 van database 2'),
array('created' => '2016-08-14', 'body' => 'Nieuws 4 van database 2'),
array('created' => '2016-08-12', 'body' => 'Nieuws 5 van database 2'),
);

Toevoeging op 27/08/2016 15:30:25:

Dit was tot nu toe mijn query om te proberen maar ik krijg een andere opgebouwde array:


<?php 
require_once ('connections/config-euroblok.php');

         $conn9 = mysql_connect($host,$user,$pass) or die (mysql_error());
         mysql_select_db($dbnm) or die (mysql_error());
		 
		 $sql = "SELECT * FROM blog WHERE actief = 'ja' ORDER BY datum desc LIMIT 4";
		 $res = mysql_query($sql) or die (mysql_error());
		 
		 
while ($row = mysql_fetch_array($res)) 
{
    $new_array[$row['datum']]['titel'] = $row['titel'];
    $new_array[$row['datum']]['datum'] = $row['datum'];
}

		 echo '<pre>';
		 print_r($new_array);
		 
		 mysql_close($conn9);
		 				 
?>


Toevoeging op 27/08/2016 15:32:18:

Dit is het resultaat van bovenstaande:

Array
(
    [2016-08-17] => Array
        (
            [titel] => Veiligheidsdeuren: De beste inbraakpreventie
            [datum] => 2016-08-17
        )

    [2016-07-05] => Array
        (
            [titel] => Met deze tools vertrek je veilig op reis
            [datum] => 2016-07-05
        )

    [2016-06-28] => Array
        (
            [titel] => Hoe beveilig ik mijn kantoor?
            [datum] => 2016-06-28
        )

    [2016-06-20] => Array
        (
            [titel] => Uw veiligheidsdeur opmeten: Hoe doen we dat?
            [datum] => 2016-06-20
        )

)
<?php

function compareDates($a, $b)
{
// omzetten van tekst naar timestamp
$a = strtotime($a['datum']);
$b = strtotime($b['datum']);

if ($a == $b) {
return 0;
}
return ($a > $b) ? -1 : 1;
}

// hoeveel records wil je overhouden?
$limit = 5;

require_once ('connections/config-1.php');
$conn1 = mysql_connect($host ,$user, $pass) or die (mysql_error());
mysql_select_db($dbnm, $conn1) or die (mysql_error());
$result = mysql_query('SELECT datum, titel FROM euro_leadmap.blog ORDER BY datum DESC LIMIT ' . $limit, $conn1) or die (mysql_error());
while($row = mysql_fetch_assoc($result)) {
$rows1[] = $row
}

require_once ('connections/config-2.php');
$conn2 = mysql_connect($host ,$user, $pass) or die (mysql_error());
mysql_select_db($dbnm, $conn2) or die (mysql_error());
$result = mysql_query('SELECT datum, titel FROM security_leadmap.blog ORDER BY datum DESC LIMIT ' . $limit, $conn2) or die (mysql_error());
while($row = mysql_fetch_assoc($result)) {
$rows2[] = $row;
}

// arrays samenvoegen
$rows = array_merge($rows1, $rows2);

// array sorteren op datum
usort($rows, 'compareDates');

// de laatste vijf records van de array weghalen
$rows = array_slice($rows, 0, $limit);

foreach ($rows as $row) {
echo $row['datum'] . ': ' . $row['titel'] . "<br>\n";
}
?>
Ik krijg een lege pagina. Er zit ergens een fout in... Kan ze niet direct vinden. De $rows1 en $rows2 kan ik wel apart oproepen (de array's dan), dus daar zit het niet.

Toevoeging op 27/08/2016 16:33:24:

Waarom doe jij in deze query $result = mysql_query('SELECT datum, titel FROM euro_leadmap.blog ORDER BY datum DESC LIMIT ' . $limit, $conn1) $limit, $conn1?
>> Waarom doe jij in deze query $result = mysql_query('SELECT datum, titel FROM euro_leadmap.blog ORDER BY datum DESC LIMIT ' . $limit, $conn1) $limit, $conn1?

  • [li]Het eerste voorbeeld is getest en werkt[/li]
    [li]Het laatste voorbeeld kon ik niet testen[/li]
    [li]Ik heb de query overgenomen van jouw post alleen heb ik ook de DATUM laten selecteren omdat we die nodig hebben om later binnen PHP wederom de rijen op datum te kunnen sorteren[/li]
    [li]Ik geef ook de tweede parameter mee aan de mysql_seelct_db() en de mysql_query() functie omdat je met twee verschillende database connecties werkt.[/li]
    [li]Hou je er rekening mee dat als je twee configuratie bestanden included en er staan dezelfde variabelen in dat de tweede include de variabelen van de eerste include overschrijft?[/li]
    [li]Hou je er rekening mee dat mysql_* functies niet meer werken in PHP7?[/li]


Toevoeging op 27/08/2016 17:31:20:

Ah ik merk nu nog een typo. Ik zal het even aanpassen
Ik heb het laatste voorbeeld gewijzigd (regel 23 en 31). Probeer het nog maar eens
Ja inderdaad dat had ik daarnet ook gezien. Was inderdaad de fout. Ondertussen je code al een beetje uitgebreid en werkt perfect.
Nog een vraagje. Is het mogelijk om in de eerste query en in de tweede query iets mee te geven dat ik weet van welke bron het komt? Bvb de eerste query komt van firma A en de tweede query komt van firma B maar die gegevens zitten niet in een van de velden in mijn tabel. Dus zou die ergens fictief moeten kunnen zetten.

Toevoeging op 27/08/2016 21:13:28:

En ja, ik weet dat de query niet meer zal werken in een PHP7 omgeving, daarom moet ik nu nog alles omzetten naar mysqli of PDO class. Maar probeer eerst even met het 'oude vertrouwde'...

Reageren