如果只有一種 方式使用數據庫是正確的……
您可以用很多的方式創建數據庫設計
問題
一個常見問題是較老的 PHP 代碼直接使用 mysql_ 函數來訪問數據庫
清單
<?php
function get_user_id( $name )
{
$db = mysql_connect( ’localhost’
mysql_select_db( ’users’ );
$res = mysql_query( "SELECT id FROM users WHERE login=’"
while( $row = mysql_fetch_array( $res ) ) { $id = $row[
return $id;
}
var_dump( get_user_id( ’jack’ ) );
?>
注意使用了 mysql_connect 函數來訪問數據庫
該技術有兩個很好的替代方案
使用 PEAR DB 模塊和 PDO 抽象層的另一個價值在於您可以在 SQL 語句中使用 ? 操作符
使用 PEAR DB 的替代代碼如下所示
清單
<?php
require_once("DB
function get_user_id( $name )
{
$dsn = ’mysql://root:password@localhost/users’;
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
$res = $db
$id = null;
while( $res
return $id;
}
var_dump( get_user_id( ’jack’ ) );
?>
注意
問題
與大多數現代數據庫一樣
清單
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id MEDIUMINT
login TEXT
password TEXT
);
INSERT INTO users VALUES (
INSERT INTO users VALUES (
INSERT INTO users VALUES (
這裡的 id 字段被簡單地指定為整數
清單
<?php
require_once("DB
function add_user( $name
{
$rows = array();
$dsn = ’mysql://root:password@localhost/bad_badid’;
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
$res = $db
$id = null;
while( $res
$id +=
$sth = $db
$db
return $id;
}
$id = add_user( ’jerry’
var_dump( $id );
?>
add_user
那麼替代方案是什麼呢?使用 MySQL 中的自動增量特性來自動地為每個插入創建惟一的 ID
清單
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
INSERT INTO users VALUES ( null
INSERT INTO users VALUES ( null
我們添加了 NOT NULL 標志來指示字段必須不能為空
清單
<?php
require_once("DB
function add_user( $name
{
$dsn = ’mysql://root:password@localhost/good_genid’;
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
$sth = $db
$db
$res = $db
$id = null;
while( $res
return $id;
}
$id = add_user( ’jerry’
var_dump( $id );
?>
現在我不是獲得最大的 id 值
問題
偶爾
清單
Files
CREATE TABLE files (
id MEDIUMINT
user_id MEDIUMINT
name TEXT
path TEXT
);
Load_files
INSERT INTO files VALUES (
INSERT INTO files VALUES (
Users
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id MEDIUMINT
login TEXT
password TEXT
);
Load_users
INSERT INTO users VALUES (
INSERT INTO users VALUES (
在這些文件的多數據庫版本中
清單
<?php
require_once("DB
function get_user( $name )
{
$dsn = ’mysql://root:password@localhost/bad_multi
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
$res = $db
$uid = null;
while( $res
return $uid;
}
function get_files( $name )
{
$uid = get_user( $name );
$rows = array();
$dsn = ’mysql://root:password@localhost/bad_multi
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
$res = $db
while( $res
return $rows;
}
$files = get_files( ’jack’ );
var_dump( $files );
?>
get_user 函數連接到包含用戶表的數據庫並檢索給定用戶的 ID
做所有這些事情的一個更好辦法是將數據加載到一個數據庫中
清單
<?php
require_once("DB
function get_files( $name )
{
$rows = array();
$dsn = ’mysql://root:password@localhost/good_multi’;
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
$res = $db
users
array( $name ) );
while( $res
return $rows;
}
$files = get_files( ’jack’ );
var_dump( $files );
?>
該代碼不僅更短
盡管該問題聽起來有些牽強
關系數據庫不同於編程語言
清單
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 (
INSERT INTO files VALUES (
INSERT INTO users VALUES (
系統中的一個用戶可以具有多個文件
清單
<?php
require_once("DB
function get_files( $name )
{
$dsn = ’mysql://root:password@localhost/bad_norel’;
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
$res = $db
$files = null;
while( $res
$rows = array();
foreach( split( ’
{
$res = $db
array( $file ) );
while( $res
}
return $rows;
}
$files = get_files( ’jack’ );
var_dump( $files );
?>
該技術很慢
清單
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 (
INSERT INTO files VALUES (
INSERT INTO files VALUES (
這裡
清單
<?php
require_once("DB
function get_files( $name )
{
$dsn = ’mysql://root:password@localhost/good_rel’;
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
$rows = array();
$res = $db
AND users
while( $res
return $rows;
}
$files = get_files( ’jack’ );
var_dump( $files );
?>
這裡
問題
我真不知有多少次看到過這樣的大型應用程序
清單
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
INSERT INTO authors VALUES ( null
INSERT INTO books VALUES ( null
INSERT INTO books VALUES ( null
INSERT INTO books VALUES ( null
INSERT INTO books VALUES ( null
INSERT INTO books VALUES ( null
INSERT INTO books VALUES ( null
該模式是可靠的
清單
<?php
require_once(’DB
$dsn = ’mysql://root:password@localhost/good_books’;
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
function get_author_id( $name )
{
global $db;
$res = $db
$id = null;
while( $res
return $id;
}
function get_books( $id )
{
global $db;
$res = $db
$ids = array();
while( $res
return $ids;
}
function get_book( $id )
{
global $db;
$res = $db
while( $res
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 );
}
?>
如果您看看下面的代碼
解決方案是用一個函數來執行大量的查詢
清單
<?php
require_once(’DB
$dsn = ’mysql://root:password@localhost/good_books’;
$db =& DB::Connect( $dsn
if (PEAR::isError($db)) { die($db
function get_books( $name )
{
global $db;
$res = $db
array( $name ) );
$rows = array();
while( $res
return $rows;
}
$books = get_books( ’Jack Herrington’ );
var_dump( $books );
?>
現在檢索列表需要一個快速
本例的問題是它有點太清晰了
From:http://tw.wingwit.com/Article/program/PHP/201311/21038.html