Toon posts:

[PHP/MYSQL]mySQL class resources doorelkaar

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallow lui,

Ik ben bezig met een berg classes om het proggen alhier wat makkelijker en efficienter te maken.
Ik heb een database-class gemaakt, maar daar heb ik problemen mee.
De class heeft een methode db_connect($database = "", $user = "", $password = "", $host = "") om een connectie naar de MySQL server tot stand te brengen.
Tevens zit er een functie db_query in die een mysql_query uitvoerd en de class voorziet van een resource identifier. Hiermee kan je dmv mysql_fetch_object/array etc spannende dingetjes doen.
Het probleem ontstaat wanneer ik 2 instances van deze class creeer en ieder laat connecten verschillende databases.

$db1 = new db;
$db2 = new db;

$db1->db_connect("localhost", "db_user", "pw", "TCPP_Base");
$db2->db_connect("localhost", "db_user", "pw", "TCPP_MetaDB");

$db1->db_query("SELECT * from tblproperties");
$db2->db_query("SELECT * from tblsystems");

De laatste query geeft een error; de query wordt namelijk uitgevoerd op database TCPP_Base, terwijl dat TCPP_MetaDB had moeten zijn. Op een of andere manier lijkt het dat de link-identifier zich globaal aanpast zodra er een bepaalde database wordt aangesproken. Dit zou volgens mij niet moeten omdat het 2 heel verschillende objecten (en dus link-identifiers/resource-identifiers) zijn.
Het hele zwikkie draait op Redhat7.2/MySQL 3.23.39/Apache 1.3.26 en PHP 4.2.1
Heeft iemand hier ervaring mee? Kan er ergens een PHP-instelling niet goed zijn? Is dit gedrag "by design"?
Bedankt!

Ivo

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17

Skinny

DIRECT!

Zonder code van je class zelf ben ik bang dat er weinig hulp geboden kan worden.

SIZE does matter.
"You're go at throttle up!"


Verwijderd

Topicstarter
bij deze een mini-versie van de class; de fout treedt hier ook op.
class db{

var $link_id;
var $query_id;
var $database;

function db_connect($host, $user, $pw, $database)
{
$this->database = $database;
$link_id = mysql_pconnect($host, $user, $pw);
mysql_select_db($database, $link_id);
$this->link_id = $link_id;
}

function db_query($query)
{
DebugMsg("link_id ".$this->link_id);
$this->query_id = mysql_db_query($this->database, $query);
DebugMsg("query_id ".$this->query_id);
}

function db_fetch_row()
{
return mysql_fetch_array($this->query_id, MYSQL_ASSOC);
}

}

include("../include/include.inc.php");
$db1 = new db;
$db2 = new db;

$db1->db_connect("localhost", "db_user", "", "TCPP_Base");
$db2->db_connect("localhost", "michiel", "Cyberdyne", "TCPP_MetaDB");

$db1->db_query("SELECT * from tblproperties");
$db2->db_query("SELECT * from tblsystems");

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Haal die pconnect eens weg... en maak daar een normale connect van.

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
Been there, done that... Maakt niets uit.

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17

Skinny

DIRECT!

edit:
Zie volgende reply van mij


Wijzigingen :

* mysql_query i.p.v. mysql_db_query
* variabelen wat duidelijker gemaakt (IMO) ;)
* return waarden toegevoegd aan de eerste twee funkties

SIZE does matter.
"You're go at throttle up!"


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

IIG het is niet bij design.

Als ik dit hier test als volgt
PHP:
1
<?class a {    var $c;    function b($c)    {        $this->c=$c;    }    function d(){        echo $this->c;    }}$f1=new a;$f2=new a;$f1->b(10);$f2->b("aap");$f1->d();$f2->d();?>



Dan werkt het perfect.

Kan je eens een vardump plaatsen van ($db1 en $db2) na het connecten en voor de queries?

Programmer - an organism that turns coffee into software.


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17

Skinny

DIRECT!

Dus toch niet helemaal... zo wel :
PHP:
1
<?error_reporting(E_ALL);class db{        var $connection;        var $query_result;        var $database;        function db_connect($host, $user, $pw, $database)        {                $this->database = $database;                $this->connection =& mysql_pconnect($host, $user, $pw);                return $this->connection;        }        function db_query($query)        {                mysql_select_db($this->database, $this->connection);                $this->query_result =& mysql_query($query, $this->connection);                return $this->query_result;        }        function db_fetch_row()        {                return mysql_fetch_array($this->query_result);        }}?>

* De mysql_select_db naar de query funktie verplaatst. Het lijkt erop dat ie, ondanks de twee connecties, maar 1 aktieve database kan hebben ofzo.

SIZE does matter.
"You're go at throttle up!"


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op vrijdag 26 juli 2002 16:43 schreef Skinny het volgende:
Dus toch niet helemaal... zo wel :

* De mysql_select_db naar de query funktie verplaatst. Het lijkt erop dat ie, ondanks de twee connecties, maar 1 aktieve database kan hebben ofzo.
Raar... want dit werkt bij mij...
PHP:
1
<?class db{        var $connection;        var $query_result;        var $database;        function db_connect($host, $user, $pw, $database)        {                $this->database = $database;                $this->connection = mysql_pconnect($host, $user, $pw)                    or die(mysql_error());                return $this->connection;        }        function db_query($query)        {             mysql_select_db($this->database, $this->connection);            $this->query_result = mysql_query($query, $this->connection);            return $this->query_result;                }                   function db_fetch_row()        {            return mysql_fetch_array($this->query_result);        }}$db1=new db;$db2=new db;$db1->db_connect("localhost","root","","new_site");$db2->db_connect("localhost","test","","test");$db1->db_query("select * from users");$db2->db_query("select * from fin_table");print_r($db1->db_fetch_row());echo "<HR>";print_r($db2->db_fetch_row());echo "<HR>";print_r($db1);echo "<HR>";print_r($db2);?>

Geeft als output: (Dit komt overeen met de queries)
code:
1
2
3
4
5
6
7
Array ( [0] => 1 [userid] => 1 [1] => * [userName] => * [2] => * [userPass] => * [3] => 2002-07-26 09:02:49 [lastLogin] => 2002-07-26 09:02:49 [4] => 127 [rights] => 127 [5] => Jerry Verhoef [userFullname] => Jerry Verhoef [6] => * [userEmail] => * [7] => 51 [no_logins] => 51 ) 
--------------------------------------------------------------------------------
Array ( [0] => 1 [tblid] => 1 [1] => 0 [nocols] => 0 [2] => 35-notesbalance.txt [name] => 35-notesbalance.txt [3] => 2001 [year] => 2001 [4] => 0 [type] => 0 [5] => 100% [width] => 100% ) 
--------------------------------------------------------------------------------
db Object ( [database] => new_site [connection] => Resource id #1 [query_result] => Resource id #3 ) 
--------------------------------------------------------------------------------
db Object ( [database] => test [connection] => Resource id #2 [query_result] => Resource id #4 )

Programmer - an organism that turns coffee into software.


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Wat me wel is opgevallen, is dat als je dezelfde host,username, en password gebruikt dat hij dan geen nieuwe connecties maakt. (pconnect of connect maakt niet uit.) Dit kan je wel oplossen met & te gebruiken.

Skinny heb jij wel lopen testen met twee verschillende accounts?

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
Skinny-> de snippet die ik heb gepost was een test-case, die wel werkt (op deze bug na).. Redelijk slordig geschreven dus. De werkelijke class is veel uitgebreider. Jouw oplossing is inderdaad een fix, maar ik ben het er gewoon niet mee eens (met jou wel, maar met PHP niet:)). Ik wil namelijk nadat ik een connect() heb gedaan de link-id misschien wel voor andere dingen gebruiken (meta data van de tabellen bijvoorbeeld). Dat zou inhouden dat mysql_select_db in zowel connect() als in query() voor zal komen. Lijkt me onnodig en duur (met ASP als achtergrond ben je wel huiverig voor overhead in je code, hoewel het niet zo gek veel uit maakt voor PHP...heerlijk:))

LuCarD-> vardump lukt (nu) niet... ben weer thuis. Ik heb echter wel gedebugged en er bleek dat de result-id van de eerste query na het uitvoeren van de query bestond, maar zodra de andere instance een query uitvoerde verdween de resource-id van de eerste (en jawel; het zijn nogsteeds 2 losse objecten). Ik zal iig nog wel ff gaan tetsen of het uit maakt dat host/user/pw hetzelfde zijn.

Wat me nog het meest dwars zit, ondanks dat het probleem verholpen is met een quickfix, is dat objecten in PHP dus toch niet geheel onafhankelijk van elkaar kunnen bestaan. Of dit aan mysql/php of de config ligt weet ik niet, maar ik hoop niet dat dit in een later stadium bij andere classes op gaat spelen.
Iedereen bedankt! :+

Ivo

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09:31

Crazy D

I think we should take a look.

Op vrijdag 26 juli 2002 17:59 schreef ivootje25 het volgende:
Ik zal iig nog wel ff gaan tetsen of het uit maakt dat host/user/pw hetzelfde zijn.
Uit de help:
mysql_pconnect() acts very much like mysql_connect() with two major differences.

First, when connecting, the function would first try to find a (persistent) link that's already open with the same host, username and password. If one is found, an identifier for it will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (mysql_close() will not close links established by mysql_pconnect()).
Dat lijkt me dus wel uitmaken.

Exact expert nodig?

Pagina: 1