[PHP] link_identifier wordt genegeerd bij mysql_query?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • HielkeJ
  • Registratie: Juli 2001
  • Niet online
Ik ben op dit moment bezig met een simpel CMS, waarbij ik gebruik maak van twee databases. In één database komen de rechten te staan voor het CMS, in de andere komen de gegevens voor een website.

Hierbij dacht ik een MySQL class te maken en hier gewoon twee keer een instance van te maken. Helaas gaat dit fout op het moment dat ik aankom bij de functie mysql_query.

Ik heb een simpele versie gemaakt van het probleem wat ik heb:

class.mysql.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
class HielkeJ_mysql {
    
    private $connection = null;
    private $tmp;
    public $database;
    
    public function __construct($db) {
        
        $this->connect($db['host'], $db['user'], $db['pass'], $db['database']);
    }
    
    public function connect($host, $user, $pass, $database) {

        $this->connection = mysql_connect($host, $user, $pass);
        mysql_select_db($database, $this->connection);
        
        $this->database = $database;
        
        return ($this->connection) ? true : false;
    }
    
    public function query($sql) {
        
        var_dump($this->database);
        $query = mysql_query($sql, $this->connection);
        if ($query === false) {
            var_dump('Error in query: '.$sql.' => Foutmelding: '.mysql_error());
        }
        
        return $query;
    }
}
?>


index.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
include('class.MySQL.php');

$db = array(
    'host'      =>  'localhost',
    'user'      =>  'root',
    'pass'      =>  'password',
    'database'  =>  'master',
);
$masterDB = new HielkeJ_mysql($db);

$db = array(
    'host'      =>  'localhost',
    'user'      =>  'root',
    'pass'      =>  'password',
    'database'  =>  'slave',
);
$slaveDB = new HielkeJ_mysql($db);

$sql = "
SELECT
    *
FROM
    test";
    
$query = $masterDB->query($sql);
var_dump($masterDB->database, $slaveDB->database);
?>


SQL master
code:
1
2
3
4
5
6
7
CREATE DATABASE `master` ;

CREATE TABLE IF NOT EXISTS `test` (
  `test` varchar(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `test` (`test`) VALUES ('test');


SQL slave
code:
1
CREATE DATABASE `slave` ;


Als ik de bovenstaande code uitvoer, krijg ik het volgende als reactie:
code:
1
2
3
4
string(6) "master" 
string(86) "Error in query: SELECT * FROM test => Foutmelding: Table 'slave.test' doesn't exist"
string(6) "master" 
string(5) "slave"


Door de eerste string (master), weet ik dat hij wel de goede HielkeJ_mysql variable pakt ($masterDB), maar bij de query gaat het toch weer fout.

Door de laatste twee strings, weet ik dat de HielkeJ_mysql instances echt verschillend zijn.

Het lijkt erop dat er dus iets fout gaat bij de link_identifier optie van mysql_query.

Heeft iemand van jullie misschien een idee wat ik fout doe of waarom dit niet goed gaat?

alvast bedankt.

Acties:
  • 0 Henk 'm!

  • Mr. Bondt
  • Registratie: Februari 2005
  • Laatst online: 27-08 14:50
Je kan, iig in PHP, geen twee connecties naar dezelfde database hebben. Je zal iets moeten construeren met behulp van mysql_select_db() :)

[ Voor 14% gewijzigd door Mr. Bondt op 07-09-2008 02:13 . Reden: Linkje ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Ik denk dat het komt omdat je twee keer connect met een user die op allebei de databases toegang heeft. Probeer het eens door 1 van de twee verbindingen ook echt andere credentials te geven.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Je moet bij mysql_connect een extra var meegeven:

PHP:
1
resource mysql_connect ([ string $server [, string $username [, string $password [, bool $new_link [, int $client_flags ]]]]] )

Namelijk: $new_link = true! Ik ben hier ook een keer een dag naar aan het zoeken geweest. En dan met de nieuwe link je 2e DB selecteren.

[ Voor 6% gewijzigd door mocean op 07-09-2008 02:29 ]

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • HielkeJ
  • Registratie: Juli 2001
  • Niet online
Bedankt, dat was inderdaad de oplossing.

Soms is de oplossing zo simpel, dat je er gewoon niet opkomt :).

Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
HielkeJ schreef op zondag 07 september 2008 @ 02:43:
Bedankt, dat was inderdaad de oplossing.

Soms is de oplossing zo simpel, dat je er gewoon niet opkomt :).
Ja, het is eigenlijk gewoon een BUG imho. Je gebruikt een ander password, en PHP blijft gewoon dezelfde link gebruiken, van php.net:
If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.
De arguments waren niet gelijk, maar toch wordt dezelfde link herbruikt, de functie kijkt alleen naar de server om te bepalen om een link te herbruiken of niet

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Maar er staat toch nergens expliciet dat ts met 2 verschillende user/pass combi's werkt? Dus misschien is het geen bug. :z

Overigens wel handige les: check altijd de documentatie, want hele slootladingen functies hebben handige, maar weinig bekende, optionele params. :) Of dergelijke params zijn sinds een latere PHP versie geintroduceerd etc. etc.

{signature}


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Voutloos schreef op zondag 07 september 2008 @ 15:45:
Maar er staat toch nergens expliciet dat ts met 2 verschillende user/pass combi's werkt? Dus misschien is het geen bug. :z

Overigens wel handige les: check altijd de documentatie, want hele slootladingen functies hebben handige, maar weinig bekende, optionele params. :) Of dergelijke params zijn sinds een latere PHP versie geintroduceerd etc. etc.
Hij had een ander password voor de 2e verbinding hoor! Ik heb hetzelfde gehad zelfs met een ander user/password op 1 server.

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Goed, dan zal ik dat eens gaan testen. Maar ik lees nog steeds nergens dat het om een andere user/pass ging, dus quote gerust het stukje waar dat expliciet staat. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Voutloos schreef op maandag 08 september 2008 @ 08:04:
Goed, dan zal ik dat eens gaan testen. Maar ik lees nog steeds nergens dat het om een andere user/pass ging, dus quote gerust het stukje waar dat expliciet staat. ;)
Het staat er juist in dat ze hetzelfde zijn 8)7
HielkeJ schreef op zondag 07 september 2008 @ 01:56:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$db = array(
    'host'      =>  'localhost',
    'user'      =>  'root',
    'pass'      =>  'password',
    'database'  =>  'master',
);
$db = array(
    'host'      =>  'localhost',
    'user'      =>  'root',
    'pass'      =>  'password',
    'database'  =>  'slave',
);

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ja, daarom. Tenzij mocean weet dat ts de credentials toevallig op dezelfde manier vervangen heeft voor de topicstart, is het te makkelijk om het maar meteen een PHP bug te noemen.

Overigens vind ik dat de HielkeJ_mysql constructor hier gewoon duidelijke parameters kan hebben ipv een array waarin alles geplempt wordt. Stel je voor dat je iets hebt aan de method signature in je IDE.

[ Voor 36% gewijzigd door Voutloos op 08-09-2008 08:37 ]

{signature}

Pagina: 1