亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網(wǎng)絡(luò),我們將竭誠(chéng)為您提供優(yōu)質(zhì)的服務(wù)! 誠(chéng)征網(wǎng)絡(luò)推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購(gòu)買流程 | 付款方式 | 聯(lián)系我們 [ 會(huì)員登錄/注冊(cè) ]
促銷推廣
客服中心
業(yè)務(wù)咨詢
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352289
點(diǎn)擊這里給我發(fā)消息  81721488
有事點(diǎn)擊這里…  376585780
有事點(diǎn)擊這里…  872642803
有事點(diǎn)擊這里…  459248018
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  380791050
技術(shù)支持
有事點(diǎn)擊這里…  714236853
有事點(diǎn)擊這里…  719304487
有事點(diǎn)擊這里…  1208894568
有事點(diǎn)擊這里…  61352289
在線客服
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  983054746
有事點(diǎn)擊這里…  893984210
當(dāng)前位置:首頁(yè) >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

五個(gè)常見 PHP 數(shù)據(jù)庫(kù)問題

添加時(shí)間:2014-7-28 1:30:44  添加: 思海網(wǎng)絡(luò) 

揭露 PHP 應(yīng)用程序中出現(xiàn)的五個(gè)常見數(shù)據(jù)庫(kù)問題 —— 包括數(shù)據(jù)庫(kù)模式設(shè)計(jì)、數(shù)據(jù)庫(kù)訪問和使用數(shù)據(jù)庫(kù)的業(yè)務(wù)邏輯代碼 —— 以及它們的解決方案。
如果只有一種 方式使用數(shù)據(jù)庫(kù)是正確的……

    您可以用很多的方式創(chuàng)建數(shù)據(jù)庫(kù)設(shè)計(jì)、數(shù)據(jù)庫(kù)訪問和基于數(shù)據(jù)庫(kù)的 PHP 業(yè)務(wù)邏輯代碼,但最終一般以錯(cuò)誤告終。本文說明了數(shù)據(jù)庫(kù)設(shè)計(jì)和訪問數(shù)據(jù)庫(kù)的 PHP 代碼中出現(xiàn)的五個(gè)常見問題,以及在遇到這些問題時(shí)如何修復(fù)它們。

問題 1:直接使用 MySQL

一個(gè)常見問題是較老的 PHP 代碼直接使用 mysql_ 函數(shù)來訪問數(shù)據(jù)庫(kù)。清單 1 展示了如何直接訪問數(shù)據(jù)庫(kù)。


清單 1. Access/get.php
<?php
function get_user_id( $name )
{
  $db = mysql_connect( 'localhost', 'root', 'password' );
  mysql_select_db( 'users' );

  $res = mysql_query( "SELECT id FROM users WHERE login='".$name."'" );
  while( $row = mysql_fetch_array( $res ) ) { $id = $row[0]; }

  return $id;
}

var_dump( get_user_id( 'jack' ) );
?>


    注意使用了 mysql_connect 函數(shù)來訪問數(shù)據(jù)庫(kù)。還要注意查詢,其中使用字符串連接來向查詢添加 $name 參數(shù)。

    該技術(shù)有兩個(gè)很好的替代方案:PEAR DB 模塊和 PHP Data Objects (PDO) 類。兩者都從特定數(shù)據(jù)庫(kù)選擇提供抽象。因此,您的代碼無(wú)需太多調(diào)整就可以在 IBM® DB2®、MySQL、PostgreSQL 或者您想要連接到的任何其他數(shù)據(jù)庫(kù)上運(yùn)行。

    使用 PEAR DB 模塊和 PDO 抽象層的另一個(gè)價(jià)值在于您可以在 SQL 語(yǔ)句中使用 ? 操作符。這樣做可使 SQL 更加易于維護(hù),且可使您的應(yīng)用程序免受 SQL 注入攻擊。

使用 PEAR DB 的替代代碼如下所示。


清單 2. Access/get_good.php
<?php
require_once("DB.php");

function get_user_id( $name )
{
  $dsn = 'mysql://root:password@localhost/users';
  $db =& DB::Connect( $dsn, array() );
  if (PEAR::isError($db)) { die($db->getMessage()); }

  $res = $db->query( 'SELECT id FROM users WHERE login=?',
  array( $name ) );
  $id = null;
  while( $res->fetchInto( $row ) ) { $id = $row[0]; }

  return $id;
}

var_dump( get_user_id( 'jack' ) );
?>


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

問題 2:不使用自動(dòng)增量功能

    與大多數(shù)現(xiàn)代數(shù)據(jù)庫(kù)一樣,MySQL 能夠在每記錄的基礎(chǔ)上創(chuàng)建自動(dòng)增量惟一標(biāo)識(shí)符。除此之外,我們?nèi)匀粫?huì)看到這樣的代碼,即首先運(yùn)行一個(gè) SELECT 語(yǔ)句來找到最大的 id,然后將該 id 增 1,并找到一個(gè)新記錄。清單 3 展示了一個(gè)示例壞模式。


清單 3. Badid.sql
DROP TABLE IF EXISTS users;
CREATE TABLE users (
  id MEDIUMINT,
  login TEXT,
  password TEXT
);

INSERT INTO users VALUES ( 1, 'jack', 'pass' );
INSERT INTO users VALUES ( 2, 'joan', 'pass' );
INSERT INTO users VALUES ( 1, 'jane', 'pass' );

    這里的 id 字段被簡(jiǎn)單地指定為整數(shù)。所以,盡管它應(yīng)該是惟一的,我們還是可以添加任何值,如 CREATE 語(yǔ)句后面的幾個(gè) INSERT 語(yǔ)句中所示。清單 4 展示了將用戶添加到這種類型的模式的 PHP 代碼。


清單 4. Add_user.php
<?php
require_once("DB.php");

function add_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( "SELECT max(id) FROM users" );
  $id = null;
  while( $res->fetchInto( $row ) ) { $id = $row[0]; }

  $id += 1;

  $sth = $db->prepare( "INSERT INTO users VALUES(?,?,?)" );
  $db->execute( $sth, array( $id, $name, $pass ) );

  return $id;
}

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

var_dump( $id );
?>

   add_user.php 中的代碼首先執(zhí)行一個(gè)查詢以找到 id 的最大值。然后文件以 id 值加 1 運(yùn)行一個(gè) INSERT 語(yǔ)句。該代碼在負(fù)載很重的服務(wù)器上會(huì)在競(jìng)態(tài)條件中失敗。另外,它也效率低下。

    那么替代方案是什么呢?使用 MySQL 中的自動(dòng)增量特性來自動(dòng)地為每個(gè)插入創(chuàng)建惟一的 ID。更新后的模式如下所示。


清單 5. Goodid.php
DROP TABLE IF EXISTS users;
CREATE TABLE users (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  login TEXT NOT NULL,
  password TEXT NOT NULL,
  PRIMARY KEY( id )
);

INSERT INTO users VALUES ( null, 'jack', 'pass' );
INSERT INTO users VALUES ( null, 'joan', 'pass' );
INSERT INTO users VALUES ( null, 'jane', 'pass' );

    我們添加了 NOT NULL 標(biāo)志來指示字段必須不能為空。我們還添加了 AUTO_INCREMENT 標(biāo)志來指示字段是自動(dòng)增量的,添加 PRIMARY KEY 標(biāo)志來指示那個(gè)字段是一個(gè) id。這些更改加快了速度。清單 6 展示了更新后的 PHP 代碼,即將用戶插入表中。


清單 6. Add_user_good.php
<?php
require_once("DB.php");

function add_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( "INSERT INTO users VALUES(null,?,?)" );
  $db->execute( $sth, array( $name, $pass ) );

  $res = $db->query( "SELECT last_insert_id()" );
  $id = null;
  while( $res->fetchInto( $row ) ) { $id = $row[0]; }

  return $id;
}

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

var_dump( $id );
?>

    現(xiàn)在我不是獲得最大的 id 值,而是直接使用 INSERT 語(yǔ)句來插入數(shù)據(jù),然后使用 SELECT 語(yǔ)句來檢索最后插入的記錄的 id。該代碼比最初的版本及其相關(guān)模式要簡(jiǎn)單得多,且效率更高。

問題 3:使用多個(gè)數(shù)據(jù)庫(kù)

    偶爾,我們會(huì)看到一個(gè)應(yīng)用程序中,每個(gè)表都在一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)中。在非常大的數(shù)據(jù)庫(kù)中這樣做是合理的,但是對(duì)于一般的應(yīng)用程序,則不需要這種級(jí)別的分割。此外,不能跨數(shù)據(jù)庫(kù)執(zhí)行關(guān)系查詢,這會(huì)影響使用關(guān)系數(shù)據(jù)庫(kù)的整體思想,更不用說跨多個(gè)數(shù)據(jù)庫(kù)管理表會(huì)更困難了。

那么,多個(gè)數(shù)據(jù)庫(kù)應(yīng)該是什么樣的呢?首先,您需要一些數(shù)據(jù)。清單 7 展示了分成 4 個(gè)文件的這樣的數(shù)據(jù)。


清單 7. 數(shù)據(jù)庫(kù)文件
Files.sql:
CREATE TABLE files (
  id MEDIUMINT,
  user_id MEDIUMINT,
  name TEXT,
  path TEXT
);

Load_files.sql:
INSERT INTO files VALUES ( 1, 1, 'test1.jpg', 'files/test1.jpg' );
INSERT INTO files VALUES ( 2, 1, 'test2.jpg', 'files/test2.jpg' );

Users.sql:
DROP TABLE IF EXISTS users;
CREATE TABLE users (
  id MEDIUMINT,
  login TEXT,
  password TEXT
);

Load_users.sql:
INSERT INTO users VALUES ( 1, 'jack', 'pass' );
INSERT INTO users VALUES ( 2, 'jon', 'pass' );

    在這些文件的多數(shù)據(jù)庫(kù)版本中,您應(yīng)該將 SQL 語(yǔ)句加載到一個(gè)數(shù)據(jù)庫(kù)中,然后將 users SQL 語(yǔ)句加載到另一個(gè)數(shù)據(jù)庫(kù)中。用于在數(shù)據(jù)庫(kù)中查詢與某個(gè)特定用戶相關(guān)聯(lián)的文件的 PHP 代碼如下所示。


清單 8. Getfiles.php
<?php
require_once("DB.php");

function get_user( $name )
{
  $dsn = 'mysql://root:password@localhost/bad_multi1';
  $db =& DB::Connect( $dsn, array() );
  if (PEAR::isError($db)) { die($db->getMessage()); }

  $res = $db->query( "SELECT id FROM users WHERE login=?",
  array( $name ) );
  $uid = null;
  while( $res->fetchInto( $row ) ) { $uid = $row[0]; }

  return $uid;
}

function get_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 * FROM files WHERE user_id=?",
  array( $uid ) );
  while( $res->fetchInto( $row ) ) { $rows[] = $row; }

  return $rows;
}

$files = get_files( 'jack' );

var_dump( $files );
?>

   get_user 函數(shù)連接到包含用戶表的數(shù)據(jù)庫(kù)并檢索給定用戶的 ID。get_files 函數(shù)連接到文件表并檢索與給定用戶相關(guān)聯(lián)的文件行。

做所有這些事情的一個(gè)更好辦法是將數(shù)據(jù)加載到一個(gè)數(shù)據(jù)庫(kù)中,然后執(zhí)行查詢,比如下面的查詢。

清單 9. Getfiles_good.php


<?php
require_once("DB.php");

function get_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(
  "SELECT files.* FROM users, files WHERE
  users.login=? AND users.id=files.user_id",
  array( $name ) );
  while( $res->fetchInto( $row ) ) { $rows[] = $row; }

  return $rows;
}

$files = get_files( 'jack' );

var_dump( $files );
?>

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

    盡管該問題聽起來有些牽強(qiáng),但是在實(shí)踐中我們通常總結(jié)出所有的表應(yīng)該在同一個(gè)數(shù)據(jù)庫(kù)中,除非有非常迫不得已的理由。

問題 4:不使用關(guān)系

     關(guān)系數(shù)據(jù)庫(kù)不同于編程語(yǔ)言,它們不具有數(shù)組類型。相反,它們使用表之間的關(guān)系來創(chuàng)建對(duì)象之間的一到多結(jié)構(gòu),這與數(shù)組具有相同的效果。我在應(yīng)用程序中看到的一個(gè)問題是,工程師試圖將數(shù)據(jù)庫(kù)當(dāng)作編程語(yǔ)言來使用,即通過使用具有逗號(hào)分隔的標(biāo)識(shí)符的文本字符串來創(chuàng)建數(shù)組。請(qǐng)看下面的模式。


清單 10. Bad.sql
DROP TABLE IF EXISTS files;
CREATE TABLE files (
  id MEDIUMINT,
  name TEXT,
  path TEXT
);

DROP TABLE IF EXISTS users;
CREATE TABLE users (
  id MEDIUMINT,
  login TEXT,
  password TEXT,
  files TEXT
);

INSERT INTO files VALUES ( 1, 'test1.jpg', 'media/test1.jpg' );
INSERT INTO files VALUES ( 2, 'test1.jpg', 'media/test1.jpg' );
INSERT INTO users VALUES ( 1, 'jack', 'pass', '1,2' );

    系統(tǒng)中的一個(gè)用戶可以具有多個(gè)文件。在編程語(yǔ)言中,應(yīng)該使用數(shù)組來表示與一個(gè)用戶相關(guān)聯(lián)的文件。在本例中,程序員選擇創(chuàng)建一個(gè) files 字段,其中包含一個(gè)由逗號(hào)分隔的文件 id 列表。要得到一個(gè)特定用戶的所有文件的列表,程序員必須首先從用戶表中讀取行,然后解析文件的文本,并為每個(gè)文件運(yùn)行一個(gè)單獨(dú)的 SELECT 語(yǔ)句。該代碼如下所示。


清單 11. Get.php
<?php
require_once("DB.php");

function get_files( $name )
{
  $dsn = 'mysql://root:password@localhost/bad_norel';
  $db =& DB::Connect( $dsn, array() );
  if (PEAR::isError($db)) { die($db->getMessage()); }

  $res = $db->query( "SELECT files FROM users WHERE login=?",
  array( $name ) );
  $files = null;
  while( $res->fetchInto( $row ) ) { $files = $row[0]; }

  $rows = array();

  foreach( split( ',',$files ) as $file )
  {
    $res = $db->query( "SELECT * FROM files WHERE id=?",
      array( $file ) );
    while( $res->fetchInto( $row ) ) { $rows[] = $row; }
  }

  return $rows;
}

$files = get_files( 'jack' );

var_dump( $files );
?>

    該技術(shù)很慢,難以維護(hù),且沒有很好地利用數(shù)據(jù)庫(kù)。惟一的解決方案是重新架構(gòu)模式,以將其轉(zhuǎn)換回到傳統(tǒng)的關(guān)系形式,如下所示。

清單 12. Good.sql


DROP TABLE IF EXISTS files;
CREATE TABLE files (
  id MEDIUMINT,
  user_id MEDIUMINT,
  name TEXT,
  path TEXT
);

DROP TABLE IF EXISTS users;
CREATE TABLE users (
  id MEDIUMINT,
  login TEXT,
  password TEXT
);

INSERT INTO users VALUES ( 1, 'jack', 'pass' );
INSERT INTO files VALUES ( 1, 1, 'test1.jpg', 'media/test1.jpg' );
INSERT INTO files VALUES ( 2, 1, 'test1.jpg', 'media/test1.jpg' );

    這里,每個(gè)文件都通過 user_id 函數(shù)與文件表中的用戶相關(guān)。這可能與任何將多個(gè)文件看成數(shù)組的人的思想相反。當(dāng)然,數(shù)組不引用其包含的對(duì)象 —— 事實(shí)上,反之亦然。但是在關(guān)系數(shù)據(jù)庫(kù)中,工作原理就是這樣的,并且查詢也因此要快速且簡(jiǎn)單得多。清單 13 展示了相應(yīng)的 PHP 代碼。


清單 13. Get_good.php
<?php
require_once("DB.php");

function get_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(
    "SELECT files.* FROM users,files WHERE users.login=?
      AND users.id=files.user_id",
        array( $name ) );
  while( $res->fetchInto( $row ) ) { $rows[] = $row; }

  return $rows;
}

$files = get_files( 'jack' );

var_dump( $files );
?>

    這里,我們對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次查詢,以獲得所有的行。代碼不復(fù)雜,并且它將數(shù)據(jù)庫(kù)作為其原有的用途使用。

問題 5:n+1 模式

    我真不知有多少次看到過這樣的大型應(yīng)用程序,其中的代碼首先檢索一些實(shí)體(比如說客戶),然后來回地一個(gè)一個(gè)地檢索它們,以得到每個(gè)實(shí)體的詳細(xì)信息。我們將其稱為 n+1 模式,因?yàn)椴樵円獔?zhí)行這么多次 —— 一次查詢檢索所有實(shí)體的列表,然后對(duì)于 n 個(gè)實(shí)體中的每一個(gè)執(zhí)行一次查詢。當(dāng) n=10 時(shí)這還不成其為問題,但是當(dāng) n=100 或 n=1000 時(shí)呢?然后肯定會(huì)出現(xiàn)低效率問題。清單 14 展示了這種模式的一個(gè)例子。


清單 14. Schema.sql
DROP TABLE IF EXISTS authors;
CREATE TABLE authors (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  name TEXT NOT NULL,
  PRIMARY KEY ( id )
);

DROP TABLE IF EXISTS books;
CREATE TABLE books (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  author_id MEDIUMINT NOT NULL,
  name TEXT NOT NULL,
  PRIMARY KEY ( id )
);

INSERT INTO authors VALUES ( null, 'Jack Herrington' );
INSERT INTO authors VALUES ( null, 'Dave Thomas' );

INSERT INTO books VALUES ( null, 1, 'Code Generation in Action' );
INSERT INTO books VALUES ( null, 1, 'Podcasting Hacks' );
INSERT INTO books VALUES ( null, 1, 'PHP Hacks' );
INSERT INTO books VALUES ( null, 2, 'Pragmatic Programmer' );
INSERT INTO books VALUES ( null, 2, 'Ruby on Rails' );
INSERT INTO books VALUES ( null, 2, 'Programming Ruby' );

     該模式是可靠的,其中沒有任何錯(cuò)誤。問題在于訪問數(shù)據(jù)庫(kù)以找到一個(gè)給定作者的所有書籍的代碼中,如下所示。

清單 15. Get.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()); }

function get_author_id( $name )
{
  global $db;

  $res = $db->query( "SELECT id FROM authors WHERE name=?",
    array( $name ) );
  $id = null;
  while( $res->fetchInto( $row ) ) { $id = $row[0]; }
  return $id;
}

function get_books( $id )
{
  global $db;

  $res = $db->query( "SELECT id FROM books WHERE author_id=?",
    array( $id ) );
  $ids = array();
  while( $res->fetchInto( $row ) ) { $ids []= $row[0]; }
  return $ids;
}

function get_book( $id )
{
  global $db;

  $res = $db->query( "SELECT * FROM books WHERE id=?", array( $id ) );
  while( $res->fetchInto( $row ) ) { return $row; }
  return null;
}

$author_id = get_author_id( 'Jack Herrington' );
$books = get_books( $author_id );
foreach( $books as $book_id ) {
  $book = get_book( $book_id );
  var_dump( $book );
}
?>

    如果您看看下面的代碼,您可能會(huì)想,“嘿,這才是真正的清楚明了。” 首先,得到作者 id,然后得到書籍列表,然后得到有關(guān)每本書的信息。的確,它很清楚明了,但是其高效嗎?回答是否定的。看看只是檢索 Jack Herrington 的書籍時(shí)要執(zhí)行多少次查詢。一次獲得 id,另一次獲得書籍列表,然后每本書執(zhí)行一次查詢。三本書要執(zhí)行五次查詢!

解決方案是用一個(gè)函數(shù)來執(zhí)行大量的查詢,如下所示。


清單 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()); }

function get_books( $name )
{
  global $db;

  $res = $db->query(
    "SELECT books.* FROM authors,books WHERE
      books.author_id=authors.id AND authors.name=?",
      array( $name ) );
  $rows = array();
  while( $res->fetchInto( $row ) ) { $rows []= $row; }
  return $rows;
}

$books = get_books( 'Jack Herrington' );
var_dump( $books );
?>

    現(xiàn)在檢索列表需要一個(gè)快速、單個(gè)的查詢。這意味著我將很可能必須具有幾個(gè)這些類型的具有不同參數(shù)的方法,但是實(shí)在是沒有選擇。如果您想要具有一個(gè)擴(kuò)展的 PHP 應(yīng)用程序,那么必須有效地使用數(shù)據(jù)庫(kù),這意味著更智能的查詢。

    本例的問題是它有點(diǎn)太清晰了。通常來說,這些類型的 n+1 或 n*n 問題要微妙得多。并且它們只有在數(shù)據(jù)庫(kù)管理員在系統(tǒng)具有性能問題時(shí)在系統(tǒng)上運(yùn)行查詢剖析器時(shí)才會(huì)出現(xiàn)。

結(jié)束語(yǔ)

    數(shù)據(jù)庫(kù)是強(qiáng)大的工具,就跟所有強(qiáng)大的工具一樣,如果您不知道如何正確地使用就會(huì)濫用它們。識(shí)別和解決這些問題的訣竅是更好地理解底層技術(shù)。長(zhǎng)期以來,我老聽到業(yè)務(wù)邏輯編寫人員抱怨,他們不想要必須理解數(shù)據(jù)庫(kù)或 SQL 代碼。他們把數(shù)據(jù)庫(kù)當(dāng)成對(duì)象使用,并疑惑性能為什么如此之差。

    他們沒有認(rèn)識(shí)到,理解 SQL 對(duì)于將數(shù)據(jù)庫(kù)從一個(gè)困難的必需品轉(zhuǎn)換成強(qiáng)大的聯(lián)盟是多么重要。如果您每天使用數(shù)據(jù)庫(kù),但是不熟悉 SQL,那么請(qǐng)閱讀 The Art of SQL,這本書寫得很好,實(shí)踐性也很強(qiáng),可以指導(dǎo)您基本了解數(shù)據(jù)庫(kù)。

關(guān)鍵字:PHP、數(shù)據(jù)庫(kù)、MySQL

分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡(luò)有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國(guó)增值電信業(yè)務(wù)經(jīng)營(yíng)許可證: 粵B1.B2-20030321 備案號(hào):粵B2-20030321-1
網(wǎng)站公安備案編號(hào):44060602000007 交互式欄目專項(xiàng)備案編號(hào):200303DD003  
察察 工商 網(wǎng)安 舉報(bào)有獎(jiǎng)  警警  手機(jī)打開網(wǎng)站