五個常見 PHP 資料庫問題

2020-12-12 站長之家

揭露PHP應用程式中出現的五個常見

資料庫

問題——包括資料庫模式設計、資料庫訪問和使用資料庫的業務邏輯代碼——以及它們的解決方案。

如果只有一種方式使用資料庫是正確的……

您可以用很多的方式創建資料庫設計、資料庫訪問和基於資料庫的PHP業務邏輯代碼,但最終一般以錯誤告終。本文說明了資料庫設計和訪問資料庫的PHP代碼中出現的五個常見問題,以及在遇到這些問題時如何修復它們。

問題1:直接使用MySQL

一個常見問題是較老的PHP代碼直接使用mysql_函數來訪問資料庫。清單1展示了如何直接訪問資料庫。

清單1.Access/get.php

 

<?php

functionget_user_id($name)

{

 $db=mysql_connect('localhost','root','password');

 mysql_select_db('users');

 $res=mysql_query("SELECTidFROMusersWHERElogin='".$name."'");

 while($row=mysql_fetch_array($res)){$id=$row[0];}

 return$id;

}

var_dump(get_user_id('jack'));

?>

注意使用了mysql_connect函數來訪問資料庫。還要注意查詢,其中使用字符串連接來向查詢添加$name參數。

該技術有兩個很好的替代方案:PEARDB模塊和PHPDataObjects(PDO)類。兩者都從特定資料庫選擇提供抽象。因此,您的代碼無需太多調整就可以在IBM?DB2?、MySQL、PostgreSQL或者您想要連接到的任何其他資料庫上運行。

使用PEARDB模塊和PDO抽象層的另一個價值在於您可以在SQL語句中使用?操作符。這樣做可使SQL更加易於維護,且可使您的應用程式免受SQL注入攻擊。

使用PEARDB的替代代碼如下所示。

清單2.Access/get_good.php

 

<?php

require_once("DB.php");

functionget_user_id($name)

{

 $dsn='mysql://root:password@localhost/users';

 $db=&DB::Connect($dsn,array());

 if(PEAR::isError($db)){die($db->getMessage());}

 $res=$db->query('SELECTidFROMusersWHERElogin=?',array($name));

 $id=null;

 while($res->fetchInto($row)){$id=$row[0];}

 return$id;

}

var_dump(get_user_id('jack'));

?>

注意,所有直接用到MySQL的地方都消除了,只有$dsn中的資料庫連接字符串除外。此外,我們通過?操作符在SQL中使用$name變量。然後,查詢的數據通過query()方法末尾的array被發送進來。

問題2:不使用自動增量功能

與大多數現代資料庫一樣,MySQL能夠在每記錄的基礎上創建自動增量惟一標識符。除此之外,我們仍然會看到這樣的代碼,即首先運行一個SELECT語句來找到最大的id,然後將該id增1,並找到一個新記錄。清單3展示了一個示例壞模式。

清單3.Badid.sql

 

DROPTABLEIFEXISTSusers;

CREATETABLEusers(

idMEDIUMINT,

loginTEXT,

passwordTEXT

);

INSERTINTOusersVALUES(1,'jack','pass');

INSERTINTOusersVALUES(2,'joan','pass');

INSERTINTOusersVALUES(1,'jane','pass');

這裡的id欄位被簡單地指定為整數。所以,儘管它應該是惟一的,我們還是可以添加任何值,如CREATE語句後面的幾個INSERT語句中所示。清單4展示了將用戶添加到這種類型的模式的PHP代碼。

清單4.Add_user.php

 

<?php

require_once("DB.php");

functionadd_user($name,$pass)

{

 $rows=array();

 $dsn='mysql://root:password@localhost/bad_badid';

 $db=&DB::Connect($dsn,array());

 if(PEAR::isError($db)){die($db->getMessage());}

 $res=$db->query("SELECTmax(id)FROMusers");

 $id=null;

 while($res->fetchInto($row)){$id=$row[0];}

 $id+=1;

 $sth=$db->prepare("INSERTINTOusersVALUES(?,?,?)");

 $db->execute($sth,array($id,$name,$pass));

 return$id;

}

$id=add_user('jerry','pass');

var_dump($id);

?>

add_user.php中的代碼首先執行一個查詢以找到id的最大值。然後文件以id值加1運行一個INSERT語句。該代碼在負載很重的伺服器上會在競態條件中失敗。另外,它也效率低下。

那麼替代方案是什麼呢?使用MySQL中的自動增量特性來自動地為每個插入創建惟一的ID。更新後的模式如下所示。

清單5.Goodid.php

 

DROPTABLEIFEXISTSusers;

CREATETABLEusers(

 idMEDIUMINTNOTNULLAUTO_INCREMENT,

 loginTEXTNOTNULL,

 passwordTEXTNOTNULL,

 PRIMARYKEY(id)

);

INSERTINTOusersVALUES(null,'jack','pass');

INSERTINTOusersVALUES(null,'joan','pass');

INSERTINTOusersVALUES(null,'jane','pass');

我們添加了NOTNULL標誌來指示欄位必須不能為空。我們還添加了AUTO_INCREMENT標誌來指示欄位是自動增量的,添加PRIMARYKEY標誌來指示那個欄位是一個id。這些更改加快了速度。清單6展示了更新後的PHP代碼,即將用戶插入表中。

清單6.Add_user_good.php

 

<?php

require_once("DB.php");

functionadd_user($name,$pass)

{

 $dsn='mysql://root:password@localhost/good_genid';

 $db=&DB::Connect($dsn,array());

 if(PEAR::isError($db)){die($db->getMessage());}

 $sth=$db->prepare("INSERTINTOusersVALUES(null,?,?)");

 $db->execute($sth,array($name,$pass));

 $res=$db->query("SELECTlast_insert_id()");

 $id=null;

 while($res->fetchInto($row)){$id=$row[0];}

 return$id;

}

$id=add_user('jerry','pass');

var_dump($id);

?>


現在我不是獲得最大的id值,而是直接使用INSERT語句來插入數據,然後使用SELECT語句來檢索最後插入的記錄的id。該代碼比最初的版本及其相關模式要簡單得多,且效率更高。

 

#p#分頁標題#e#

 

問題3:使用多個資料庫

偶爾,我們會看到一個應用程式中,每個表都在一個單獨的資料庫中。在非常大的資料庫中這樣做是合理的,但是對於一般的應用程式,則不需要這種級別的分割。此外,不能跨資料庫執行關係查詢,這會影響使用關係資料庫的整體思想,更不用說跨多個資料庫管理表會更困難了。那麼,多個資料庫應該是什麼樣的呢?首先,您需要一些數據。清單7展示了分成4個文件的這樣的數據。

清單7.資料庫文件

 

Files.sql:

CREATETABLEfiles(

 idMEDIUMINT,

 user_idMEDIUMINT,

 nameTEXT,

 pathTEXT

);

Load_files.sql:

INSERTINTOfilesVALUES(1,1,'test1.jpg','files/test1.jpg');

INSERTINTOfilesVALUES(2,1,'test2.jpg','files/test2.jpg');

Users.sql:

DROPTABLEIFEXISTSusers;

CREATETABLEusers(

 idMEDIUMINT,

 loginTEXT,

 passwordTEXT

);

Load_users.sql:

INSERTINTOusersVALUES(1,'jack','pass');

INSERTINTOusersVALUES(2,'jon','pass');

在這些文件的多資料庫版本中,您應該將SQL語句加載到一個資料庫中,然後將usersSQL語句加載到另一個資料庫中。用於在資料庫中查詢與某個特定用戶相關聯的文件的PHP代碼如下所示。

清單8.Getfiles.php

 

<?php

require_once("DB.php");

functionget_user($name)

{

 $dsn='mysql://root:password@localhost/bad_multi1';

 $db=&DB::Connect($dsn,array());

 if(PEAR::isError($db)){die($db->getMessage());}

 $res=$db->query("SELECTidFROMusersWHERElogin=?",array($name));

 $uid=null;

 while($res->fetchInto($row)){$uid=$row[0];}

 return$uid;

}

functionget_files($name)

{

 $uid=get_user($name);

 $rows=array();

 $dsn='mysql://root:password@localhost/bad_multi2';

 $db=&DB::Connect($dsn,array());

 if(PEAR::isError($db)){die($db->getMessage());}

 $res=$db->query("SELECT*FROMfilesWHEREuser_id=?",array($uid));

 while($res->fetchInto($row)){$rows[]=$row;}

 return$rows;

}

$files=get_files('jack');

var_dump($files);

?>

get_user函數連接到包含用戶表的資料庫並檢索給定用戶的ID。get_files函數連接到文件表並檢索與給定用戶相關聯的文件行。

做所有這些事情的一個更好辦法是將數據加載到一個資料庫中,然後執行查詢,比如下面的查詢。

清單9.Getfiles_good.php

 

<?php

require_once("DB.php");

functionget_files($name)

{

 $rows=array();

 $dsn='mysql://root:password@localhost/good_multi';

 $db=&DB::Connect($dsn,array());

 if(PEAR::isError($db)){die($db->getMessage());}

 $res=$db->query("SELECTfiles.*FROMusers,filesWHERE

users.login=?ANDusers.id=files.user_id",

array($name));

 while($res->fetchInto($row)){$rows[]=$row;}

 return$rows;

}

$files=get_files('jack');

var_dump($files);

?>


該代碼不僅更短,而且也更容易理解和高效。我們不是執行兩個查詢,而是執行一個查詢。

儘管該問題聽起來有些牽強,但是在實踐中我們通常總結出所有的表應該在同一個資料庫中,除非有非常迫不得已的理由。

 

#p#分頁標題#e#

 

問題4:不使用關係

關係資料庫不同於程式語言,它們不具有數組類型。相反,它們使用表之間的關係來創建對象之間的一到多結構,這與數組具有相同的效果。我在應用程式中看到的一個問題是,工程師試圖將資料庫當作程式語言來使用,即通過使用具有逗號分隔的標識符的文本字符串來創建數組。請看下面的模式。

清單10.Bad.sql

 

DROPTABLEIFEXISTSfiles;

CREATETABLEfiles(

 idMEDIUMINT,

 nameTEXT,

 pathTEXT

);

DROPTABLEIFEXISTSusers;

CREATETABLEusers(

 idMEDIUMINT,

 loginTEXT,

 passwordTEXT,

 filesTEXT

);

INSERTINTOfilesVALUES(1,'test1.jpg','media/test1.jpg');

INSERTINTOfilesVALUES(2,'test1.jpg','media/test1.jpg');

INSERTINTOusersVALUES(1,'jack','pass','1,2');

系統中的一個用戶可以具有多個文件。在程式語言中,應該使用數組來表示與一個用戶相關聯的文件。在本例中,程式設計師選擇創建一個files欄位,其中包含一個由逗號分隔的文件id列表。要得到一個特定用戶的所有文件的列表,程式設計師必須首先從用戶表中讀取行,然後解析文件的文本,並為每個文件運行一個單獨的SELECT語句。該代碼如下所示。

清單11.Get.php

 

<?php

require_once("DB.php");

functionget_files($name)

{

 $dsn='mysql://root:password@localhost/bad_norel';

 $db=&DB::Connect($dsn,array());

 if(PEAR::isError($db)){die($db->getMessage());}

 $res=$db->query("SELECTfilesFROMusersWHERElogin=?",array($name));

 $files=null;

 while($res->fetchInto($row)){$files=$row[0];}

 $rows=array();

 foreach(split(',',$files)as$file)

 {

$res=$db->query("SELECT*FROMfilesWHEREid=?",

array($file));

while($res->fetchInto($row)){$rows[]=$row;}

 }

 return$rows;

}

$files=get_files('jack');

var_dump($files);

?>

該技術很慢,難以維護,且沒有很好地利用資料庫。惟一的解決方案是重新架構模式,以將其轉換回到傳統的關係形式,如下所示。

清單12.Good.sql

 

DROPTABLEIFEXISTSfiles;

CREATETABLEfiles(

 idMEDIUMINT,

 user_idMEDIUMINT,

 nameTEXT,

 pathTEXT

);

DROPTABLEIFEXISTSusers;

CREATETABLEusers(

 idMEDIUMINT,

 loginTEXT,

 passwordTEXT

);

INSERTINTOusersVALUES(1,'jack','pass');

INSERTINTOfilesVALUES(1,1,'test1.jpg','media/test1.jpg');

INSERTINTOfilesVALUES(2,1,'test1.jpg','media/test1.jpg');

這裡,每個文件都通過user_id函數與文件表中的用戶相關。這可能與任何將多個文件看成數組的人的思想相反。當然,數組不引用其包含的對象——事實上,反之亦然。但是在關係資料庫中,工作原理就是這樣的,並且查詢也因此要快速且簡單得多。清單13展示了相應的PHP代碼。

清單13.Get_good.php

 

<?php

require_once("DB.php");

functionget_files($name)

{

 $dsn='mysql://root:password@localhost/good_rel';

 $db=&DB::Connect($dsn,array());

 if(PEAR::isError($db)){die($db->getMessage());}

 $rows=array();

 $res=$db->query("SELECTfiles.*FROMusers,filesWHEREusers.login=?

ANDusers.id=files.user_id",array($name));

 while($res->fetchInto($row)){$rows[]=$row;}

 return$rows;

}

$files=get_files('jack');

var_dump($files);

?>


這裡,我們對資料庫進行一次查詢,以獲得所有的行。代碼不複雜,並且它將資料庫作為其原有的用途使用。

 

#p#分頁標題#e#

 

問題5:n+1模式

我真不知有多少次看到過這樣的大型應用程式,其中的代碼首先檢索一些實體(比如說客戶),然後來回地一個一個地檢索它們,以得到每個實體的詳細信息。我們將其稱為n+1模式,因為查詢要執行這麼多次——一次查詢檢索所有實體的列表,然後對於n個實體中的每一個執行一次查詢。當n=10時這還不成其為問題,但是當n=100或n=1000時呢?然後肯定會出現低效率問題。清單14展示了這種模式的一個例子。

清單14.Schema.sql

 

DROPTABLEIFEXISTSauthors;

CREATETABLEauthors(

 idMEDIUMINTNOTNULLAUTO_INCREMENT,

 nameTEXTNOTNULL,

 PRIMARYKEY(id)

);

DROPTABLEIFEXISTSbooks;

CREATETABLEbooks(

 idMEDIUMINTNOTNULLAUTO_INCREMENT,

 author_idMEDIUMINTNOTNULL,

 nameTEXTNOTNULL,

 PRIMARYKEY(id)

);

INSERTINTOauthorsVALUES(null,'JackHerrington');

INSERTINTOauthorsVALUES(null,'DaveThomas');

INSERTINTObooksVALUES(null,1,'CodeGenerationinAction');

INSERTINTObooksVALUES(null,1,'PodcastingHacks');

INSERTINTObooksVALUES(null,1,'PHPHacks');

INSERTINTObooksVALUES(null,2,'PragmaticProgrammer');

INSERTINTObooksVALUES(null,2,'Rubyalign=centerbgColor=#e7e9e9border=1>

 

<?php

require_once('DB.php');

$dsn='mysql://root:password@localhost/good_books';

$db=&DB::Connect($dsn,array());

if(PEAR::isError($db)){die($db->getMessage());}

functionget_author_id($name)

{

 global$db;

 $res=$db->query("SELECTidFROMauthorsWHEREname=?",array($name));

 $id=null;

 while($res->fetchInto($row)){$id=$row[0];}

 return$id;

}

functionget_books($id)

{

 global$db;

 $res=$db->query("SELECTidFROMbooksWHEREauthor_id=?",array($id));

 $ids=array();

 while($res->fetchInto($row)){$ids[]=$row[0];}

 return$ids;

}

functionget_book($id)

{

 global$db;

 $res=$db->query("SELECT*FROMbooksWHEREid=?",array($id));

 while($res->fetchInto($row)){return$row;}

 returnnull;

}

$author_id=get_author_id('JackHerrington');

$books=get_books($author_id);

foreach($booksas$book_id){

 $book=get_book($book_id);

 var_dump($book);

}

?>

如果您看看下面的代碼,您可能會想,「嘿,這才是真正的清楚明了。」首先,得到作者id,然後得到書籍列表,然後得到有關每本書的信息。的確,它很清楚明了,但是其高效嗎?回答是否定的。看看只是檢索JackHerrington的書籍時要執行多少次查詢。一次獲得id,另一次獲得書籍列表,然後每本書執行一次查詢。三本書要執行五次查詢!

解決方案是用一個函數來執行大量的查詢,如下所示。

清單16.Get_good.php

 

<?php

require_once('DB.php');

$dsn='mysql://root:password@localhost/good_books';

$db=&DB::Connect($dsn,array());

if(PEAR::isError($db)){die($db->getMessage());}

functionget_books($name)

{

 global$db;

 $res=$db->query("SELECTbooks.*FROMauthors,booksWHEREbooks.author_id=authors.idANDauthors.name=?",

 array($name));

 $rows=array();

 while($res->fetchInto($row)){$rows[]=$row;}

return$rows;

 }

 $books=get_books('JackHerrington');

 var_dump($books);

?>

現在檢索列表需要一個快速、單個的查詢。這意味著我將很可能必須具有幾個這些類型的具有不同參數的方法,但是實在是沒有選擇。如果您想要具有一個擴展的PHP應用程式,那麼必須有效地使用資料庫,這意味著更智能的查詢。

本例的問題是它有點太清晰了。通常來說,這些類型的n+1或n*n問題要微妙得多。並且它們只有在資料庫管理員在系統具有性能問題時在系統上運行查詢剖析器時才會出現。

結束語

資料庫是強大的工具,就跟所有強大的工具一樣,如果您不知道如何正確地使用就會濫用它們。識別和解決這些問題的訣竅是更好地理解底層技術。長期以來,我老聽到業務邏輯編寫人員抱怨,他們不想要必須理解資料庫或SQL代碼。他們把資料庫當成對象使用,並疑惑性能為什麼如此之差。

他們沒有認識到,理解SQL對於將資料庫從一個困難的必需品轉換成強大的聯盟是多麼重要。如果您每天使用資料庫,但是不熟悉SQL,那麼請閱讀TheArtofSQL,這本書寫得很好,實踐性也很強,可以指導您基本了解資料庫。

相關焦點

  • Linux編程之:五個常見PHP資料庫問題
    首頁 > 語言 > 關鍵詞 > php最新資訊 > 正文 Linux編程之:五個常見PHP資料庫問題
  • Php常見問題總結
    (站長書庫)精彩30問,網羅常見PHP問題,希望大家細心查看。1:為什麼我得不到變量我在一網頁向另一網頁POST數據name,為什麼輸出$name時卻得不到任何值?解決方法:(1)在c盤建立文件夾tmp(2)打開php.ini,找到session.save_path,修改為session.save_path= "c:/tmp"#p#Php部分常見問題總結(二)#e#4:為什麼我向另一網頁傳送變量時,只得到前半部分,以空格開頭的則全部丟失
  • php怎樣創建資料庫?
    資料庫是編程的核心內容,在使用php做網站的過程中,固然要與資料庫打交道,那麼在php中,怎樣來創建一個資料庫呢?下面我們就一起來了解一下吧。1、創建一個函數我在這裡是作為演示實例,所以沒有用框架,用的是原生的,打開編輯器,新建一個文件,然後再文件裡面,先新建一個函數,這裡命名是create_data,接下來我們將在這個函數裡面來寫php怎樣創建一個資料庫?
  • 從Web查詢資料庫之PHP與MySQL篇
    PHP+MySQL的組合是構建網站的一個常見搭配,不過如何使用PHP通過Web訪問MySQL資料庫呢?下面從Web資料庫架構的工作原理講起。
  • php知識大通關——常見函數功能
    接上節內容,仍然以習題的方式講解php常見函數及功能!php常見函數1、在php中,下面哪個方法使用 PHP 連接 MySQL 資料庫? mysql_connect() mysql_query() mysql_close() 以上都不對解析:PHP 提供 mysql_connect() 函數來打開資料庫連接,不過,新版本建議使用 MySQLi 或 PDO 來連接。2、在php中,下面哪個函數用於在 PHP 中獲取環境變量?
  • php5.3以上版本連接sqlserver資料庫方法 sqlsrv擴展安裝
    id=50420根據需要下載對應版本,如果安裝出現問題,要給Documents and Settings\<當前登錄用戶名>\Local Settings\Temp」文件夾的絕對控制權。添加everyone 安裝後取消。
  • PHP中的數組分頁實現(非資料庫)
    PHP中的數組分頁實現(非資料庫)在日常開發的業務環境中,我們一般都會使用 MySQL 語句來實現分頁的功能。但是,往往也有些數據並不多,或者只是獲取 PHP 中定義的一些數組數據時需要分頁的功能。這時,我們其實不需要每次都去查詢資料庫,可以在一次查詢中把所有的數據取出來,然後在 PHP 的代碼層面進行分頁功能的實現。
  • 10個常見的資料庫安全問題
    而這種情況也引發了企業對網絡安全軟體和web應用程式測試的需求,通過採用這些措施,黑客將被拒絕訪問在線資料庫中的可用記錄和文檔。另外,嚴格遵守GDPR有助於加強用戶數據保護。那麼資料庫驅動系統中常見的漏洞有哪些呢?我們總結了常見的十大漏洞以及消除這些漏洞的技巧。
  • CTF中常見的PHP漏洞小結
    str2第二個字符串。如果 str1 小於 str2 返回 < 0;如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0。當這個函數接受到了不符合的類型,這個函數將發生錯誤,但是在5.3之前的php中,顯示了報錯的警告信息後,將return 0 !!!! 也就是雖然報了錯,但卻判定其相等了。
  • php語言是什麼?學好php需要掌握什麼?
    php的語法有C、Java和Perl的特點也有自創的特點,經過了24年的發展php從最初的1.0發展7.0版本,php的功能已經發展非常強大,php是適合編程零基礎入手的一門程式語言,下面為大家介紹一下學習php需要經過哪些過程?
  • PHP浮點數的一個常見問題的解答
    關於PHP的浮點數, 我之前寫過一篇文章: 關於PHP浮點數你應該知道的(All 『bogus』 about the float in PHP)不過, 我當時遺漏了一點, 也就是對於如下的這個常見問題的回答
  • 全網最詳細的常見PHP漏洞全方面解析
    所以本人打算將公開課資源分成8個小部分給大家學習,目前總大小250G 左右,都是優質資源,夠你白嫖了吧領取方法:後臺回復關鍵詞「大佬您好」即可獲得!幾個重要的 php.ini 選項Register Globalsphp>=4.2.0,php.ini 的 register_globals 選項的默認值預設為 Off,當 register_globals 的設定為 On 時,程序可以接收來自伺服器的各種環境變量,包括表單提交的變量,而且由於 PHP不必事先初始化變量的值,從而導致很大的安全隱患
  • PHP網站常見安全漏洞及防禦方法
    網站漏洞一:常見PHP網站漏洞安全。假如在lsm.php中包含這樣一段代碼:include($b.」/aaa.php」.),這對黑客來說,可以通過變量$b來實現遠程攻擊,可以是黑客自已的代碼,用來實現對網站的攻擊。可以向伺服器提交a.php include=http://127.0.0. 1/b.php,然後執行b.php的指令。
  • 新手必須要懂的PHP學習路線以及10個PHP優化技巧
    )(7天)bbs或企業網站,(模板、分頁、權限)phpchina的高手PHP高手帶路--問題匯總解答以及PHP手冊(1個月)學習discuz學習外國的開源程序(zencert Joomla drupal).學習phpchina上的精華知識。
  • 科普:常見的資料庫管理系統有哪些?MySQL有哪些特點?
    資料庫技術進過多年的發展,已經發展到資料庫系統系統階段,數據會存儲到資料庫(DateBase,DB)中,資料庫相當於存儲數據倉庫。為了並與用戶組織和管理數據,專門提供了資料庫管理系統,他可以有效管理資料庫中的數據,資料庫和資料庫管理系統是兩個概念不要混淆。
  • PHP中對資料庫操作的封裝
    classdbInterface{var$dbID=1;//用於確定當前操作的資料庫,當dbID為1代表MySql,當為2代表SQLServer,為3時為ODBC或其它。var$dbHost;//資料庫所在主機域名var$dbUsername;//資料庫用戶名var$dbPassword;//用戶密碼//設置主機、用戶名及密碼函數functionsetParameter($host,$username,$password){$this-$#@62;dbUsername=$username;$this-$#@62
  • php中文亂碼問題的終極解決方案匯總
    一般來說,亂碼的出現有2種原因,一種是由於編碼(charset) 設置錯誤,導致瀏覽器以錯誤的編碼來解析,從而出現了滿屏亂七八糟的「天書」,第二種就是文件被以錯誤的編碼打開,然後保存,比如一個文本文件原先是GB2312編碼的,卻以UTF-8編碼打開再保存,就會出現亂碼的問題。本篇文章,就帶大家了解一下,怎麼解決php中亂碼的問題。
  • ​PHP處理Oracle資料庫方法與技巧(六)
    begin updatelog('INSERT attempted'); end;");//使用存儲過程的方法        oci_execute($s, OCI_NO_AUTO_COMMIT); // don't commit        oci_rollback($c);                //注意:在PHP操作oracle資料庫的過程中
  • 實例解析:PHP程序開發中的中文編碼問題
    資料庫中的字符集編碼問題 流行的關係資料庫系統都支持資料庫字符集編碼,也就是說在創建資料庫時可以指定它自己的字符集設置,資料庫的數據以指定的編碼形式存儲。當應用程式訪問數據時,在入口和出口處都會有字符集編碼的轉換。對於中文數據,資料庫字符編碼的設置應當保證數據的完整性。
  • windows 檢查php版本專題及常見問題 - CSDN
    目的:解決用戶在windows環境下運行ngoos2.0的問題。安裝apcu.dll動態庫文件,打開php_apcu-5.1.8-7.0-nts-vc14-x86.zip壓縮包 拷貝裡面php_apcu.dll文件放到安裝目錄E:\Tools\phpstudy\PHPTutorial\php\php-7.0.12-nts\ext下面。 在php.ini文件中加載動態庫。