thinkphp資料庫切換
//切換新資料庫
$model=M();
//(sql_type://username:password@address:3306/db_name)
//sql_type:資料庫類型mysql或者mysqli
$result=$model->db(1,"sql_type://username:password@address:3306/db_name");
//sql語句
$query_sql=XXXXXX;
//查詢數據並返回
$data=$result->db(1)->query($query_sql);
② thinkphp執行sql創建資料庫後,被切換到了剛剛創建的資料庫,怎麼換回原資料庫或讓其不切換。
你需要
M()->query('use 你要切換回來的庫');
這個意思就是執行sql語句
③ thinkphp如何從模型連接的資料庫切換回原來配置的資料庫連接
翻下TP手冊,其實不需要提問的,既然我回答了,就給我積分吧。
對於默認的資料庫連接,內部的資料庫編號是0,因此為了避免沖突,請不要再次定義資料庫編號為0的資料庫配置
$this->db(0);
④ thinkphp實現多語言切換時,資料庫數據如何也實現多語言
有兩種情況,分析如下:
1、需要中英文切換內容較少
假設我們現在正在操作的是文章表,需要根據用戶的語言環境輸出中文或英文的文章內容。
在文章表中多添加一個欄位用於存儲英文的內容,發布文章的頁面,同時上傳中英文內容即可,然後服務端通過thinkphp的多語言標識來決定讀取中文內容或者英文內容。也可以在前端模板中進行識別。
2、需要中英文切換內容較多
如果某個數據表的多個欄位或者多個數據表都需要做中英文切換,顯然在數據表裡添加多個欄位的方式就不太合適了,那將導致數據表欄位太多,不方便管理,可以採用多數據表的方式,將內容完整的分為兩份。就是把涉及到中英文切換的數據表多拷貝一份而已,裡面的數據是英文的
。管理員後台,可以同時存儲中英文內容,也可以分開存儲,你自己決定就好,讀取時同樣使用thinkphp的多語言標識判斷用戶的語言環境,來決定查詢中文表還是英文表。
另外,如果整站都需要中英文切換,也可以做分布式資料庫!
一切根據實際需求決定!
⑤ 怎麼樣配置thinkphp 與本地mysql和sql server同時連接倆個資料庫
thinkphp 同時連接兩個資料庫的配置方法如下:
1、在Db.class.php腳本文件裡面的類增加一個魔術方法__get(),寫法如下:
public function __get($propertyName)
{ return $this->$propertyName;
}
這個方法是用來訪問類中protected $config成員屬性用的。有的人可能會說,直接把protected改成public豈不是更好。這樣只解決了基類的問題,假如,子類也同樣進行了受保護,那要你更改更多的文件,這是我們做IT程序員非常不願意看到的事情。
2、在Model.class.php中的getTableName()方法更改如下:
$tablepre = $this->db->config['tablepre'];
if(empty($this->trueTableName)) {
$tableName??= empty($tablepre) ? $this->tablePrefix : $tablepre;
if(!empty($this->tableName)) {
$tableName .= $this->tableName;
}
else
{
$tableName .= parse_name($this->name);
}
$this->trueTableName? ? =? ?strtolower($tableName);
}
return (!empty($this->dbName)?$this->dbName.'.':'').$this->
trueTableName;這樣就完成了多庫自由切換時,導致的表前綴問題。
⑥ thinkphp 3.1 切換資料庫問題
$model=M("表名(無前綴)","數據表前綴_","mysql://用戶名:密碼@localhost:3306/資料庫名");
$arr=$model->select();
print_r($arr);
我這樣測試了 是可以的 你要檢查你的格式是否正確
⑦ thinkphp redis 怎麼選擇資料庫
1、redis 中的每一個資料庫,都由一個 redisDb 的結構存儲。其中,redisDb.id 存儲著 redis 資料庫以整數表示的號碼。redisDb.dict 存儲著該庫所有的鍵值對數據。redisDb.expires 保存著每一個鍵的過期時間。
2、當redis 伺服器初始化時,會預先分配 16 個資料庫(該數量可以通過配置文件配置),所有資料庫保存到結構 redisServer 的一個成員 redisServer.db 數組中。當我們選擇資料庫 select number 時,程序直接通過 redisServer.db[number] 來切換資料庫。有時候當程序需要知道自己是在哪個資料庫時,直接讀取 redisDb.id 即可。
3、既然我們知道一個資料庫的所有鍵值都存儲在redisDb.dict中,那麼我們要知道如果找到key的位置,就有必要了解一下dict 的結構了:
typedef struct dict {
// 特定於類型的處理函數
dictType *type;
// 類型處理函數的私有數據
void *privdata;
// 哈希表(2個)
dictht ht[2];
// 記錄 rehash 進度的標志,值為-1 表示 rehash 未進行
int rehashidx;
// 當前正在運作的安全迭代器數量
int iterators;
} dict;
由上述的結構可以看出,redis 的字典使用哈希表作為其底層實現。dict 類型使用的兩個指向哈希表的指針,其中 0 號哈希表(ht[0])主要用於存儲資料庫的所有鍵值,而1號哈希表主要用於程序對 0 號哈希表進行 rehash 時使用,rehash 一般是在添加新值時會觸發,這里不做過多的贅述。所以redis 中查找一個key,其實就是對進行該dict 結構中的 ht[0] 進行查找操作。
4、既然是哈希,那麼我們知道就會有哈希碰撞,那麼當多個鍵哈希之後為同一個值怎麼辦呢?redis採取鏈表的方式來存儲多個哈希碰撞的鍵。也就是說,當根據key的哈希值找到該列表後,如果列表的長度大於1,那麼我們需要遍歷該鏈表來找到我們所查找的key。當然,一般情況下鏈表長度都為是1,所以時間復雜度可看作o(1)。
二、當redis 拿到一個key 時,如果找到該key的位置。
了解了上述知識之後,我們就可以來分析redis如果在內存找到一個key了。
1、當拿到一個key後, redis 先判斷當前庫的0號哈希表是否為空,即:if (dict->ht[0].size == 0)。如果為true直接返回NULL。
2、判斷該0號哈希表是否需要rehash,因為如果在進行rehash,那麼兩個表中者有可能存儲該key。如果正在進行rehash,將調用一次_dictRehashStep方法,_dictRehashStep 用於對資料庫字典、以及哈希鍵的字典進行被動 rehash,這里不作贅述。
3、計算哈希表,根據當前字典與key進行哈希值的計算。
4、根據哈希值與當前字典計算哈希表的索引值。
5、根據索引值在哈希表中取出鏈表,遍歷該鏈表找到key的位置。一般情況,該鏈表長度為1。
6、當 ht[0] 查找完了之後,再進行了次rehash判斷,如果未在rehashing,則直接結束,否則對ht[1]重復345步驟。
到此我們就找到了key在內存中的位置了。
⑧ thinkphp 如何手動連接資料庫
//資料庫配置1
'DB_CONFIG1' = array(
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '1234',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'thinkphp'
),
//資料庫配置2
'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp';
這樣,設置2個資料庫。切換方法如下:
$this->db(1,"DB_CONFIG1")->query("查詢SQL");
$this->db(2,"DB_CONFIG2")->query("查詢SQL");
這樣來調用,就可以了。至於裡面的參數,你應該了解吧,DB2的配置也可以照第1個那樣寫,主要注意一下調用形式就可以了。希望幫到你
$this->db(1)->table("top_user")->find();
這個是指定表的查詢,M的使用方法:
M("User","think_","DB_CONFIG1")->query("查詢SQL");
think_是表前綴,2個庫肯定不一樣。
⑨ thinkphp對資料庫操作有哪些內置函數
8.4.4 Model類
getModelName() 獲取當前Model的名稱
getTableName() 獲取當前Model的數據表名稱
switchModel(type,vars=array()) 動態切換模型
table() 設置當前操作的數據表
field() 設置要查詢的數據欄位
where() 設置查詢或者操作條件
data(data) 設置數據對象
order(order) 設置排序
limit(limit) 查詢限制
page(page) 查詢分頁
join(join) 進行JOIN查詢
having(having) 進行having查詢
group(group) 進行group查詢
lock(lock) 查詢鎖定
distinct(distinct) 唯一性查詢
count(field) 記錄統計
sum(field) 總數查詢
min(field) 最小值查詢
max(field) 最大值查詢
avg(field) 平均值查詢
_initialize() 模型初始化方法
_facade(data) 對保存到資料庫的數據進行處理
_before_write(&data) 寫入數據前的回調方法 包括新增和更新
add(data='',options=array()) 新增數據
_before_insert(&data,options) 寫入數據前的回調方法
_after_insert(data,options) 寫入數據後的回調方法
selectAdd(fields='',table='',options=array()) 通過Select方式添加記錄
save(data='',options=array()) 更新數據到資料庫
_before_update(&data,options) 更新數據前的回調方法
_after_update(data,options) 更新成功後的回調方法
delete(options=array()) 刪除數據
_after_delete(data,options) 刪除成功後的回調方法
select(options=array()) 查詢數據集
_after_select(&resultSet,options) 查詢成功後的回調方法
findAll(options=array()) select方法的別名
_options_filter(&options) 表達式過濾回調方法
find(options=array()) 查詢數據
_after_find(&result,options) 查詢成功的回調方法
setField(field,value,condition='') 設置記錄的某個欄位值
setInc(field,condition='',step=1) 欄位值增長
setDec(field,condition='',step=1) 欄位值減少
getField(field,condition='',sepa=' ') 獲取某個欄位值
create(data='',type='') 創建數據對象
autoCheckToken(data) 表單令牌驗證
query(sql) 執行原生SQL查詢
execute(sql='') 執行原生SQL操作
startTrans() 啟動事務
commit() 提交事務
rollback() 事務回滾
getError() 獲取模型的錯誤信息
getDbError() 獲取資料庫的錯誤信息
getLastInsID() 獲取最後執行的SQL語句
getPk() 獲取主鍵名稱
getDbFields() 獲取數據表的欄位信息
regex(value,rule) 使用正則驗證數據
setProperty(name,value) 設置模型的屬性值
2.1版新增方法:
db(linkNum,config='') 切換當前資料庫連接
高級模型類AdvModel
topN(count,options=array()) 查詢滿足條件的前N個記錄
getN(position=0,options=array()) 查詢符合條件的第N條記錄
0 表示第一條記錄 -1 表示最後一條記錄
first(options=array()) 獲取滿足條件的第一條記錄
last(options=array()) 獲取滿足條件的最後一條記錄
returnResult(data,type='') 返回指定的數據類型
setLazyInc(field,condition='',step=1,lazyTime=0) 欄位值延遲增長
setLazyDec(field,condition='',step=1,lazyTime=0) 欄位值延遲減少
addConnect(config,linkNum=NULL) 增加資料庫連接
delConnect(linkNum) 刪除資料庫連接
closeConnect(linkNum) 關閉資料庫連接
switchConnect(linkNum,name='') 切換資料庫連接
patchQuery(sql=array()) 批處理執行SQL語句
getPartitionTableName(data=array()) 得到分表的的數據表名