搭建好php開發(fā)環(huán)境,這個(gè)就不多講了,能找單例模式的應(yīng)該有一定的php基礎(chǔ)
成都創(chuàng)新互聯(lián)公司主要從事做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)彌渡,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
2
新建一個(gè)database.php文件存放數(shù)據(jù)庫(kù)信息
?php
$db = array(
'host'='localhost',//地址
'user'='root',//數(shù)據(jù)庫(kù)用戶名
'password'='root',//數(shù)據(jù)庫(kù)密碼
'database'='ceshi',//數(shù)據(jù)庫(kù)名
)
?
3
新建Mysql.class.php編寫數(shù)據(jù)庫(kù)連接類操作類添加需要的屬性和構(gòu)造方法
構(gòu)造函數(shù)加載數(shù)據(jù)庫(kù)配置文件連接數(shù)據(jù)庫(kù)
?php
class db {
public $conn;
public static $sql;
public static $instance=null;
private function __construct(){
require_once('database.php');
$this-conn = mysqli_connect($db['host'],$db['user'],$db['password']);
if(!mysqli_select_db($this-conn,$db['database'])){
echo "失敗";
};
mysqli_query($this-conn,'set names utf8');
}
}
?這樣試試吧如果你對(duì)php這類有興趣的話,可以和我一樣在后盾人經(jīng)??纯唇滩?,自己多看幾遍,慢慢的以后就明白了,希望能幫到你,給個(gè)采納吧謝謝
當(dāng)然是重新連接了,你是跳轉(zhuǎn)不是包含。
跳轉(zhuǎn)兩者之間共享值要專門的傳值操作,cookie\
session\
POST/GET
\靜態(tài)輸出
本文實(shí)例講述了PHP基于單例模式實(shí)現(xiàn)的數(shù)據(jù)庫(kù)操作基類。分享給大家供大家參考,具體如下:
配置文件:
?php
$db
=
array(
'host'='localhost',
'user'='root',
'password'='',
'database'='test',
)
?
php
數(shù)據(jù)庫(kù)基類:
?php
class
db
{
public
$conn;
public
static
$sql;
public
static
$instance=null;
private
function
__construct(){
require_once('db.config.php');
$this-conn
=
mysql_connect($db['host'],$db['user'],$db['password']);
if(!mysql_select_db($db['database'],$this-conn)){
echo
"失敗";
};
mysql_query('set
names
utf8',$this-conn);
}
public
static
function
getInstance(){
if(is_null(self::$instance)){
self::$instance
=
new
db;
}
return
self::$instance;
}
/**
*
查詢數(shù)據(jù)庫(kù)
*/
public
function
select($table,$condition=array(),$field
=
array()){
$where='';
if(!empty($condition)){
foreach($condition
as
$k=$v){
$where.=$k."='".$v."'
and
";
}
$where='where
'.$where
.'1=1';
}
$fieldstr
=
'';
if(!empty($field)){
foreach($field
as
$k=$v){
$fieldstr.=
$v.',';
}
$fieldstr
=
rtrim($fieldstr,',');
}else{
$fieldstr
=
'*';
}
self::$sql
=
"select
{$fieldstr}
from
{$table}
{$where}";
$result=mysql_query(self::$sql,$this-conn);
$resuleRow
=
array();
$i
=
0;
while($row=mysql_fetch_assoc($result)){
foreach($row
as
$k=$v){
$resuleRow[$i][$k]
=
$v;
}
$i++;
}
return
$resuleRow;
}
/**
*
添加一條記錄
*/
public
function
insert($table,$data){
$values
=
'';
$datas
=
'';
foreach($data
as
$k=$v){
$values.=$k.',';
$datas.="'$v'".',';
}
$values
=
rtrim($values,',');
$datas
=
rtrim($datas,',');
self::$sql
=
"INSERT
INTO
{$table}
({$values})
VALUES
({$datas})";
if(mysql_query(self::$sql)){
return
mysql_insert_id();
}else{
return
false;
};
}
/**
*
修改一條記錄
*/
public
function
update($table,$data,$condition=array()){
$where='';
if(!empty($condition)){
foreach($condition
as
$k=$v){
$where.=$k."='".$v."'
and
";
}
$where='where
'.$where
.'1=1';
}
$updatastr
=
'';
if(!empty($data)){
foreach($data
as
$k=$v){
$updatastr.=
$k."='".$v."',";
}
$updatastr
=
'set
'.rtrim($updatastr,',');
}
self::$sql
=
"update
{$table}
{$updatastr}
{$where}";
return
mysql_query(self::$sql);
}
/**
*
刪除記錄
*/
public
function
delete($table,$condition){
$where='';
if(!empty($condition)){
foreach($condition
as
$k=$v){
$where.=$k."='".$v."'
and
";
}
$where='where
'.$where
.'1=1';
}
self::$sql
=
"delete
from
{$table}
{$where}";
return
mysql_query(self::$sql);
}
public
static
function
getLastSql(){
echo
self::$sql;
}
}
$db
=
db::getInstance();
//$list
=
$db-select('demo',array('name'='tom','password'='ds'),array('name','password'));
//echo
$db-insert('demo',array('name'='腳本之家','password'='123'));
//echo
$db-update('demo',array("name"='xxx',"password"='123'),array('id'=1));
echo
$db-delete('demo',array('id'='2'));
db::getLastSql();
echo
"pre";
?
更多關(guān)于PHP操作數(shù)據(jù)庫(kù)相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php+mysql數(shù)據(jù)庫(kù)操作入門教程》、《PHP基于pdo操作數(shù)據(jù)庫(kù)技巧總結(jié)》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
原生SQL查詢有 query() 和 execute() 兩個(gè)方法:
query():用于 SQL 查詢操作,并返回符合查詢條件的數(shù)據(jù)集
execute():更新和寫入數(shù)據(jù)的 SQL 操作,返回影響的記錄數(shù)
query()
query() 方法是用于 SQL 查詢操作,和select()方法一樣返回符合查詢條件的數(shù)據(jù)集。
例子:
public function read(){
// 實(shí)例化一個(gè)空模型,沒有對(duì)應(yīng)任何數(shù)據(jù)表
$Dao = M();
//或者使用 $Dao = new Model();
$list = $Dao-query("select * from user where uid5");
if($list){
$this-assign('list', $list );
$this-display();
} else {
$this-error($Dao-getError());
}
}
對(duì)于 query() 方法返回的數(shù)據(jù)集,跟 select() 一樣,可以在模板里直接循環(huán)輸出。
execute()
execute() 方法用于更新和寫入數(shù)據(jù)的 SQL 操作(注:非查詢操作,無返回?cái)?shù)據(jù)集),返回影響的記錄數(shù)。
例子:
public function read(){
header("Content-Type:text/html; charset=utf-8");
// 實(shí)例化一個(gè)空模型,沒有對(duì)應(yīng)任何數(shù)據(jù)表
$Dao = M();
//或者使用 $Dao = new Model();
$num = $Dao-execute("update user set email = '12345@xxx.com' where uid=3");
if($num){
echo '更新 ',$num,' 條記錄。';
}else{
echo '無記錄更新';
}
}
如果查詢比較復(fù)雜或一些特殊的數(shù)據(jù)操作不能通過 ThinkPHP 內(nèi)置的 ORM 和 ActiveRecord 模式實(shí)現(xiàn)時(shí),就可以通過直接使用原生 SQL 查詢來實(shí)現(xiàn)。
注意:以上都是 user 沒有表前綴的例子,在查詢語句中,查詢的表應(yīng)該寫實(shí)際的表名字(包括前綴)。
單例模式
:使得類的一個(gè)對(duì)象成為系統(tǒng)中的唯一實(shí)例.
PHP中使用單例模式最常見的就是數(shù)據(jù)庫(kù)操作了。避免在系統(tǒng)中有多個(gè)連接數(shù)據(jù)庫(kù)的操作,浪費(fèi)系統(tǒng)資源的現(xiàn)象,就可以使用單例模式。每次對(duì)數(shù)據(jù)庫(kù)操作都使用一個(gè)實(shí)例。
簡(jiǎn)單示例
class
AClass
{
//
用來存儲(chǔ)自己實(shí)例
public
static
$instance;
//
私有化構(gòu)造函數(shù),防止外界實(shí)例化對(duì)象
private
function
__construct()
{}
//
私有化克隆函數(shù),防止外界克隆對(duì)象
private
function
__clone()
{}
//
靜態(tài)方法,單例訪問統(tǒng)一入口
public
static
function
getInstance()
{
if
(!(self::$instance
instanceof
self)){
self::$instance
=
new
self();
}
return
self::$instance;
}
//
test
public
function
test()
{
return
"done";
}
//
私有化克隆函數(shù),防止外界克隆對(duì)象
private
function
__clone()
{}
}
class
BClass
extends
AClass{
}
//
獲取實(shí)例
$aclass
=
AClass::getInstance();
$bclass
=
BClass::getInstance();
//
調(diào)用方法
echo
$aclass-test();
對(duì)一些比較大型的應(yīng)用來說,可能連接多個(gè)數(shù)據(jù)庫(kù),那么不同的數(shù)據(jù)庫(kù)公用一個(gè)對(duì)象可能會(huì)產(chǎn)生問題,比如連接句柄的分配等,我們可以通過給$instance變成數(shù)組,通過不同的參數(shù)來控制
簡(jiǎn)單示例
class
DB
{
//
用來存儲(chǔ)自己實(shí)例
public
static
$instance
=
array();
public
$conn;
//
私有化構(gòu)造函數(shù),防止外界實(shí)例化對(duì)象
private
function
__construct($host,
$username,
$password,
$dbname,
$port)
{
$this-conn
=
new
mysqli($host,
$username,
$password,
$dbname,
$port);
}
//
靜態(tài)方法,單例訪問統(tǒng)一入口
public
static
function
getInstance($host,
$username,
$password,
$dbname,
$port)
{
$key
=
$host.":".$port;
if
(!(self::$instance[$key]
instanceof
self)){
self::$instance[$key]
=
new
self($host,
$username,
$password,
$dbname,
$port);#實(shí)例化
}
return
self::$instance[$key];
}
//query
public
function
query($ql)
{
return
$this-conn-query($sql);
}
//
私有化克隆函數(shù),防止外界克隆對(duì)象
private
function
__clone()
{}
//釋放資源
public
function
__destruct(){
$this-conn-close();
}
}
PHP單例模式,就是一個(gè)對(duì)象只被生成一次,但該對(duì)象可以被其它眾多對(duì)象使用。單例模式使用最多的場(chǎng)景,是數(shù)據(jù)庫(kù)連接操作。我們知道,生成一個(gè)對(duì)象的操作是用new函數(shù)來實(shí)現(xiàn),但是new對(duì)象都會(huì)消耗內(nèi)存,而且有時(shí)候?qū)ν粋€(gè)對(duì)象,在不同文件中可能會(huì)生成多次,這就造成了系統(tǒng)資源的浪費(fèi)。然而使用單例模式,則可以很好的避免這種情況。
以數(shù)據(jù)庫(kù)為例,假設(shè)我們有一個(gè)數(shù)據(jù)庫(kù)的類,要實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接。如果不使用單例模式,那么在很多PHP文件中,我們可能到要?jiǎng)?chuàng)建這樣的一個(gè)連接,這其實(shí)是對(duì)資源的很大浪費(fèi)。那么下面介紹單例模式實(shí)現(xiàn)方法:
class?Database
{
//定義一個(gè)屬性,該屬性是靜態(tài)的保護(hù)或私有屬性
protected?static?$db;
//這里構(gòu)造函數(shù)一定要是私有方法
private?function?__construct()
{??
}
//聲明一個(gè)獲取類實(shí)例的方法
static?function?getInstace()
{??
if(self::$db)?{
return?self::$db;
}else?{
//生成自己
self::$db?=?new?self();
return?self::$db;
}??
}
}
//錯(cuò)誤調(diào)用方法
//用new實(shí)例化private標(biāo)記構(gòu)造函數(shù)的類會(huì)報(bào)錯(cuò)
$db?=?new?Database();
//正確獲取實(shí)例方法
$db?=?Database::getInstace();
使用單例模式的好處是,當(dāng)你在其他地方也要使用到這個(gè)類,比如上面的數(shù)據(jù)庫(kù)類。那么你可以在其它地方直接調(diào)用?Database::getInstace(),而且該實(shí)例只會(huì)被生成一次,不會(huì)被重復(fù)生成,所以不會(huì)浪費(fèi)系統(tǒng)資源。
簡(jiǎn)單的說,單例模式生成的實(shí)例只被生成一次,而且只負(fù)責(zé)一個(gè)特定的任務(wù)。
使用單例模式有下面幾個(gè)要求:
1.構(gòu)造函數(shù)需要標(biāo)記為private(訪問控制:防止外部代碼使用new操作符創(chuàng)建對(duì)象),單例類不能在其他類中實(shí)例化,只能被其自身實(shí)例化;
2.擁有一個(gè)保存類的實(shí)例的靜態(tài)成員變量;
3.擁有一個(gè)訪問這個(gè)實(shí)例的公共的靜態(tài)方法(常用getInstance()方法進(jìn)行實(shí)例化單例類,通過instanceof操作符可以檢測(cè)到類是否已經(jīng)被實(shí)例化);
4.如果嚴(yán)謹(jǐn)?shù)脑挘€需要?jiǎng)?chuàng)建__clone()方法防止對(duì)象被復(fù)制(克?。?我上面沒創(chuàng)建)
使用單例模式好處,總結(jié):
1、php的應(yīng)用主要在于數(shù)據(jù)庫(kù)應(yīng)用, 所以一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。
2、如果系統(tǒng)中需要有一個(gè)類來全局控制某些配置信息, 那么使用單例模式可以很方便的實(shí)現(xiàn). 這個(gè)可以參看ZF的FrontController部分。
3、在一次頁面請(qǐng)求中, 便于進(jìn)行調(diào)試。
參考:
網(wǎng)站欄目:php原生單例數(shù)據(jù)庫(kù) php數(shù)據(jù)庫(kù)源碼
路徑分享:http://aaarwkj.com/article26/doodgjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、外貿(mào)建站、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司、電子商務(wù)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)