PDA

View Full Version : سوال: اتصال به چند دیتابیس بصورت همزمان



persianboy62
یک شنبه 12 تیر 1390, 03:05 صبح
سلام
من یه کلاس php برای اتصال به چند پایگاه داده mysql بصورت همزمان نوشتم. یه اشکالی توی کد هست که نمیدونم چطور باید رفعش کنم. کد کلاس رو اینجا مینویسم. اگر کسی بتونه راهنمایی کنه ممنون میشم. کلاس Connection بخوبی کار میکنه و میشه باهاش query اجرا کرد. مشکل کلاس Connection_multiple هست که وقتی تعداد کانکشن ها از یکی بیشتر بشه دیگه کار نمیکنه.




<?php
interface Connection_Interface
{
public function connect($database, $sqlserver, $sqluser, $sqlpassword, $persistency);
public function disconnect();
public function sql_query($sql);
public function sql_numrows($query_id);
public function sql_affectedrows();
public function sql_numfields($query_id);
public function sql_fieldname($offset, $query_id);
public function sql_fieldtype($offset, $query_id);
public function sql_fetchrow($query_id);
public function sql_fetchrowset($query_id);
public function sql_fetchfield($field, $rownum, $query_id);
public function sql_rowseek($rownum, $query_id);
public function sql_nextid();
public function sql_freeresult($query_id);
public function sql_error($query_id);
}





class Connection implements Connection_Interface
{
public $db_connect_id;
public $query_result;
public $row = array();
public $rowset = array();
public $num_queries = 6;


public $persistency;
public $user;
public $password;
public $server;
public $dbname;


function __construct($database="", $sqlserver = "localhost", $sqluser = "root", $sqlpassword = "", $persistency = true) {
$this->connect($database, $sqlserver, $sqluser, $sqlpassword, $persistency); // connect using credentials
}

public function connect($database, $sqlserver, $sqluser, $sqlpassword, $persistency)
{

$this->persistency = $persistency;
$this->user = $sqluser;
$this->password = $sqlpassword;
$this->server = $sqlserver;
$this->dbname = $database;

if($this->persistency)
{
$this->db_connect_id = @mysql_pconnect($this->server, $this->user, $this->password);
}
else
{
$this->db_connect_id = @mysql_connect($this->server, $this->user, $this->password);
}
if($this->db_connect_id)
{
if($database != "")
{
$this->dbname = $database;
$dbselect = @mysql_select_db($this->dbname);
if(!$dbselect)
{
@mysql_close($this->db_connect_id);
$this->db_connect_id = $dbselect;
}
}
return $this->db_connect_id;
}
else
{
return false;
}

}


/*function __construct($database="", $sqlserver = "localhost", $sqluser = "root", $sqlpassword = "", $persistency = true)
{

$this->persistency = $persistency;
$this->user = $sqluser;
$this->password = $sqlpassword;
$this->server = $sqlserver;
$this->dbname = $database;

if($this->persistency)
{
$this->db_connect_id = @mysql_pconnect($this->server, $this->user, $this->password);
}
else
{
$this->db_connect_id = @mysql_connect($this->server, $this->user, $this->password);
}
if($this->db_connect_id)
{
if($database != "")
{
$this->dbname = $database;
$dbselect = @mysql_select_db($this->dbname);
if(!$dbselect)
{
@mysql_close($this->db_connect_id);
$this->db_connect_id = $dbselect;
}
}
return $this->db_connect_id;
}
else
{
return false;
}
}*/

//
// Other base methods
//
function disconnect()
{
if($this->db_connect_id)
{
if($this->query_result)
{
@mysql_free_result($this->query_result);
}
$result = @mysql_close($this->db_connect_id);
return $result;
}
else
{
return false;
}
}

//
// Base query method
//
function sql_query($query = "", $transaction = FALSE)
{
// Remove any pre-existing queries
unset($this->query_result);
if($query != "")
{
$this->query_result = @mysql_query($query, $this->db_connect_id);
}
if($this->query_result)
{
unset($this->row[$this->query_result]);
unset($this->rowset[$this->query_result]);
return $this->query_result;
}
else
{
return ( $transaction == END_TRANSACTION ) ? true : false;
}
}

//
// Other query methods
//
function sql_numrows($query_id = 0)
{
if(!$query_id)
{
$query_id = $this->query_result;
}
if($query_id)
{
$result = @mysql_num_rows($query_id);
return $result;
}
else
{
return false;
}
}
function sql_affectedrows()
{
if($this->db_connect_id)
{
$result = @mysql_affected_rows($this->db_connect_id);
return $result;
}
else
{
return false;
}
}
function sql_numfields($query_id = 0)
{
if(!$query_id)
{
$query_id = $this->query_result;
}
if($query_id)
{
$result = @mysql_num_fields($query_id);
return $result;
}
else
{
return false;
}
}
function sql_fieldname($offset, $query_id = 0)
{
if(!$query_id)
{
$query_id = $this->query_result;
}
if($query_id)
{
$result = @mysql_field_name($query_id, $offset);
return $result;
}
else
{
return false;
}
}
function sql_fieldtype($offset, $query_id = 0)
{
if(!$query_id)
{
$query_id = $this->query_result;
}
if($query_id)
{
$result = @mysql_field_type($query_id, $offset);
return $result;
}
else
{
return false;
}
}
function sql_fetchrow($query_id = 0)
{
if(!$query_id)
{
$query_id = $this->query_result;
}
if($query_id)
{
$this->row[$query_id] = @mysql_fetch_array($query_id);
return $this->row[$query_id];
}
else
{
return false;
}
}
function sql_fetchrowset($query_id = 0)
{
if(!$query_id)
{
$query_id = $this->query_result;
}
if($query_id)
{
unset($this->rowset[$query_id]);
unset($this->row[$query_id]);
while($this->rowset[$query_id] = @mysql_fetch_array($query_id))
{
$result[] = $this->rowset[$query_id];
}
return $result;
}
else
{
return false;
}
}
function sql_fetchfield($field, $rownum = -1, $query_id = 0)
{
if(!$query_id)
{
$query_id = $this->query_result;
}
if($query_id)
{
if($rownum > -1)
{
$result = @mysql_result($query_id, $rownum, $field);
}
else
{
if(empty($this->row[$query_id]) && empty($this->rowset[$query_id]))
{
if($this->sql_fetchrow())
{
$result = $this->row[$query_id][$field];
}
}
else
{
if($this->rowset[$query_id])
{
$result = $this->rowset[$query_id][$field];
}
else if($this->row[$query_id])
{
$result = $this->row[$query_id][$field];
}
}
}
return $result;
}
else
{
return false;
}
}
function sql_rowseek($rownum, $query_id = 0){
if(!$query_id)
{
$query_id = $this->query_result;
}
if($query_id)
{
$result = @mysql_data_seek($query_id, $rownum);
return $result;
}
else
{
return false;
}
}
function sql_nextid(){
if($this->db_connect_id)
{
$result = @mysql_insert_id($this->db_connect_id);
return $result;
}
else
{
return false;
}
}
function sql_freeresult($query_id = 0){
if(!$query_id)
{
$query_id = $this->query_result;
}

if ( $query_id )
{
unset($this->row[$query_id]);
unset($this->rowset[$query_id]);

@mysql_free_result($query_id);

return true;
}
else
{
return false;
}
}
function sql_error($query_id = 0)
{
$result["message"] = @mysql_error($this->db_connect_id);
$result["code"] = @mysql_errno($this->db_connect_id);

return $result;
}

} // class sql_db





class Connection_Multiple implements Connection_Interface
{
protected $_connections = array();
public $connection_index = "";

public function __construct() {
}

public function add(Connection $connection)
{
$this->connection_index = sizeof($this->_connections);
$this->_connections[$this->connection_index] = $connection;
return $this->connection_index;
}

public function sql_query($sql)
{
$connection = $this->_connections[$this->connection_index];
var_dump($this->_connections[$this->connection_index]);
return $connection->sql_query($sql);
}

public function connect($database, $sqlserver, $sqluser, $sqlpassword, $persistency)
{

$this->persistency = $persistency;
$this->user = $sqluser;
$this->password = $sqlpassword;
$this->server = $sqlserver;
$this->dbname = $database;

if($this->persistency)
{
$this->db_connect_id = @mysql_pconnect($this->server, $this->user, $this->password);
}
else
{
$this->db_connect_id = @mysql_connect($this->server, $this->user, $this->password);
}
if($this->db_connect_id)
{
if($database != "")
{
$this->dbname = $database;
$dbselect = @mysql_select_db($this->dbname);
if(!$dbselect)
{
@mysql_close($this->db_connect_id);
$this->db_connect_id = $dbselect;
}
}
return $this->db_connect_id;
}
else
{
return false;
}

}


//
// Other base methods
//
function disconnect()
{
$connection = $this->_connections[$this->connection_index];
$connection->sql_disconnect();
}


//
// Other query methods
//
function sql_numrows($query_id = 0)
{
$connection = $this->_connections[$this->connection_index];
return $connection->sql_numrows();
}
function sql_affectedrows()
{
$connection = $this->_connections[$this->connection_index];
return $connection->sql_affectedrows();
}
function sql_numfields($query_id = 0)
{
$connection = $this->_connections[$this->connection_index];
$connection->sql_numfields();
}
function sql_fieldname($offset, $query_id = 0)
{
$connection = $this->_connections[$this->connection_index];
$connection->sql_fieldname($offset);
}
function sql_fieldtype($offset, $query_id = 0)
{
$connection = $this->_connections[$this->connection_index];
$connection->sql_fieldtype($offset);
}
function sql_fetchrow($query_id = 0)
{
$connection = $this->_connections[$this->connection_index];
return $connection->sql_fetchrow($query_id);
}

function sql_fetchrowset($query_id = 0)
{
$connection = $this->_connections[$this->connection_index];
$connection->sql_fetchrowset();
}
function sql_fetchfield($field, $rownum = -1, $query_id = 0)
{
$connection = $this->_connections[$this->connection_index];
$connection->sql_fetchfield($field, $rownum);
}
function sql_rowseek($rownum, $query_id = 0){
$connection = $this->_connections[$this->connection_index];
$connection->sql_rowseek($rownum);
}
function sql_nextid(){
$connection = $this->_connections[$this->connection_index];
$connection->sql_nextid();
}
function sql_freeresult($query_id = 0){
$connection = $this->_connections[$this->connection_index];
$connection->sql_freeresult();
}
function sql_error($query_id = 0)
{
$connection = $this->_connections[$this->connection_index];
$connection->sql_error();
}

امیـرحسین
یک شنبه 12 تیر 1390, 20:50 عصر
همه‌ی توابع *_mysql یک پارامتر اختیاری به عنوان اتصال دارند که وقتی مشخص نشه، از اتصال موجود استفاده میکنه و این دقیقا مشکل شماست. شما باید this->db_connect_id رو به همه‌ی توابع mysql اضافه کنید.
در ضمن این کلاسها به هیچ‌وجه بهینه نیستند!

persianboy62
دوشنبه 13 تیر 1390, 01:20 صبح
همه‌ی توابع *_mysql یک پارامتر اختیاری به عنوان اتصال دارند که وقتی مشخص نشه، از اتصال موجود استفاده میکنه و این دقیقا مشکل شماست. شما باید this->db_connect_id رو به همه‌ی توابع mysql اضافه کنید.

ممنون از راهنماییتون. اما من دقیقا متوجه نشدم که پارامتر this->db_connect_id رو به کدوم توابع باید اضافه کنم؟ توابع کلاس Connection که همگی از این پارامتر استفاده میکنند. اگر امکان داره یه قسمت از کد رو برام اصلاح کنید.

امیـرحسین
سه شنبه 14 تیر 1390, 22:45 عصر
مثلا شما که تابع mysql_fetch_array که استفاده کردید، کلاس بیچاره از کجا باید بفهمه که با کدوم کانکشن کار کنه؟ پارامترهای دیگه‌ی این تابع رو چک بفرمایید میبینید که کانکشن رو هم قبول میکنه. شما لینک کانکشن رو در db_connect_id ذخیره میکنید. اون رو به عنوان لینک به توابع mysql بدید.