PHP Yii framework ทำไงให้สามารถ เลือก select dynamic Database ได้หลายตัวอะครับ
แจ้ง v. ที่ใช้งานด้วยครับ
ถ้าเป็น v.2 จะอยู่ที่
config/web.php
กำหนด
Code (PHP)
'db' => require(__DIR__ . '/db.php'),
'db2' => require(__DIR__ . '/db2.php'),
เรียกใช้ก็
Code (PHP)
Yii::$app->db;
Yii::$app->db2;
Date :
2015-07-24 14:40:19
By :
CasanovaKung
ผมใช้ Yii v1 ครับ ตอนนี้ผมเรียกใช้ใน config/main ครับ อยู่ใน array components
อันนี้คือการ connect 2 db แบบ fix ผมเลยจะแก้ให้เป็นแบบ dynamic เลือกเอาอะครับ
Code (PHP)
'db' => array(
'connectionString' => 'sqlsrv:Server=127.0.0.1;Database=test;',
'username' => 'sa',
'password' => 'test',
'charset' => 'utf8',
),
'db2' => array(
'connectionString' => 'sqlsrv:Server=127.0.0.1;Database=test2;',
'username' => 'sa',
'password' => 'test',
'charset' => 'utf8',
'class' => 'CDbConnection'
),
Date :
2015-07-24 14:50:37
By :
mhbank
ใช้ query แบบไหนครับ
Code (PHP)
$query = $connection->createCommand("SELECT * FROM xxxx");
$result = $query->queryAll();
// หรือ?
$result = $model->find();
Date :
2015-07-24 15:14:11
By :
CasanovaKung
ผมใช้แบบนี้ครับ
Code (PHP)
$query = Yii::app()->db->createCommand(select * from xxx);
หรือ
$query = Yii::app()->db2->createCommand(select * from xxx);
$result = $query->queryAll();
ประวัติการแก้ไข 2015-07-24 15:26:02
Date :
2015-07-24 15:22:24
By :
mhbank
แล้ว dynamic ที่ต้องการนี่
หมายถึง
Code (PHP)
<select id="database">
<option value="1">Database 1</option>
<option value="2">Database 2</option>
</select>
Date :
2015-07-24 15:47:38
By :
CasanovaKung
ใช้ครับเพราะแบบผมมัน fix กรณีที่ user มีข้อมูล backup ไว้ชื่อมันสามารถดิ้นได้ครับว่าจะชื่ออะไร เช่น db test20150724
ผมเลยหาวิธีที่จะไม่ต้องมาสร้าง db3 db4 db5 ครับ
เลยจะให้มัน select db เอง แล้วลูกค้าเลือกว่าจะเอา db ตัวไหนไหนใน dropdownlist นั้นละครับ แล้วก็เอาค่าไปส่งให้มันใน
config db ครับ
Code (PHP)
$query = Yii::app()->db->createCommand(select name from master..sysdatabases where name like 'test%');
$re = $query -> queryAll();
$str = "<select id="database">";
$i=1;
foreach($re as $reall){
$str += "<option value=$i>$reall['name']</option>"
$i++;
}
$str += "</select>";
echo $str;
ให้เค้าเลือกประมาณนี้อะครับ
แล้วถ้า user เลือกค่า อะไรก็เก็บไว้ในตัวแปรหนึ่ง แล้วเอาไปใส่เป็นชื่อ DB แต่ผมไม่รู้วิธีส่งค่ากลับไปใช้อะครับ
Date :
2015-07-24 16:19:32
By :
mhbank
ลองใช้หลักการแบบนี้ดู
Code (PHP)
class Mainbase
{
public $db = [
'host' => 'localhost',
'user' => 'ckung',
'pass' => '123!@#',
// 'base' => 'pd_001',
];
public $connect;
public function __construct()
{
$host = $this->db['host'];
$user = $this->db['user'];
$pass = $this->db['pass'];
// $db = $this->db['base'];
try {
// $this->connect = new PDO("mysql:host={$host};dbname={$db}", $user, $pass);
$this->connect = new PDO("mysql:host={$host};", $user, $pass);
}
catch (Exception $e) {
$this->connect = die("Unable to connect: " . $e->getMessage());
}
}
public function query($sql)
{
$output = [];
if(is_array($sql)){
try {
$dbh = $this->connect;
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
foreach($sql as $sql){
$dbh->exec($sql);
}
$dbh->commit();
$output[0] = true;
}
catch (Exception $e){
$dbh->rollback();
$output[0] = false;
$output[1] = $e->getMessage();
}
}
return $output;
}
public function select($sql)
{
$output = [];
if(is_array($sql)){
try {
$dbh = $this->connect;
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$output[1] = [];
foreach($sql as $sql){
$command = $dbh->query($sql);
$result = $command->fetchAll();
$output[1][] = $result;
}
$output[0] = true;
}
catch (Exception $e){
$output[0] = false;
$output[1] = $e->getMessage();
}
}
return $output;
}
}
$baseapp = new Mainbase;
$baseapp->query(["use pd_006;"]);
$data = $baseapp->select([
"SELECT * FROM province",
]);
print_r($data[1]);
ลองวิเคราะห์ดูครับ
Date :
2015-07-24 16:52:33
By :
CasanovaKung
ขอบคุณครับเดี๋ยวจะลองเอาไปประยุกใช้ดูครับ
ประวัติการแก้ไข 2015-07-24 17:08:37
Date :
2015-07-24 17:07:53
By :
mhbank
Load balance : Server 02