±¾ÎÄͨ¹ýÒ»¸ö¼òµ¥µÄweb Ó¦Óã¬ÑÝʾÁË PHP ºÍ PostgresSQL ÔÚµç×ÓÉÌÎñÖеÄÓ¦Óá£
²»¾ÃÒÔǰ£¬Èç¹ûÒª¼Ü¹¹Ò»¸öÑÏËàµÄWebÓ¦Óõϰ£¬Òâζ׏ºÂò¼Û¸ñ²»·ÆµÄCold Fusion Ðí¿É£¬ÒÔ¼°Ò»¸öÉÌÒµµÄÊý¾Ý¿â·þÎñ³ÌÐòÏñSybase ¼ÓÉÏSun ·þÎñÆ÷¡£ÐÒÔ˵ÄÊÇ£¬ÕâÑùµÄÈÕ×Óһȥ²»¸´·µÁË¡£Ëæ×ÅÈÕ½¥³ÉÊìµÄÃâ·ÑÊý¾Ý¿âÊг¡ÒÔ¼°Apache ʹÓÃÕߵĴóÁ¿Ôö³¤£¬Ò»Ð©Ìæ´ú²úÆ·ÒѾ¾ßÓÐÏ൱£¬ÉõÖÁ³¬¹ýÁËÕâЩרÓÐÈí¼þµÄÄÜÁ¦¡£
±È½ÏºÃµÄ¿ª·ÅÔ´ÂëÈí¼þµÄÒ»ÖÖÊÇ PHP£¬Ò»¸öºÜÏñPerl µÄ½Å±¾ÓïÑÔ£¬ÒÔ¼°PostgreSQL£¬Ò»¸öºÜÇ¿´óµÄÃæÏò¶ÔÏóµÄÊý¾Ý¿â¡£Èç¹û°ÑÁ½Õß½áºÏÆðÀ´µÄ»°£¬Äã¿ÉÒÔÉè¼Æ´Ó¼òµ¥µÄÁôÑÔ²¾µ½Ò»¸ö¾Þ´óµÄ»ùÓÚWeb µÄ²ÆÎñÈí¼þ¡£PHP Ìṩ´óÄÔ¶øPostgres Ìṩ·¢´ïµÄ¼¡Èâ¡£
ÏÂÃæ½éÉÜÒ»¸öºÜ»ù±¾µÄ PHP ¹ºÎï³µºÍ¿â´æÓ¦Ó㬳ä·ÖÀûÓà Postgres µÄÊÂÎñ¹¦ÄÜ¡£Ô´ÂëÍÆäËû×ÊÁÏ¿ÉÒÔ´?PHPBuilder.com ÏÂÔØ¡£
Ê×ÏÈÒªÌáµ½µÄÊÇÓ¦ÓóÌÐòµÄ½á¹¹£¬ÔÚÎÒµÄPHP Web Ó¦ÓÃÖУ¬ÎÒ×ÜÊÇÊ×ÏÈÉèÖÃÒ»¸ö×ÛºÏ¿â£¬ÍøÕ¾µÄÿһ¸öÒ³Ãæ¶¼»áÓõ½Ëü£¬È¡Ãû½Ðcommon.php ´æ·ÅÔÚinclude Ŀ¼¡£
Õâ¸ö¿â»á´¦ÀíÈÕ³£ÈÎÎñ£¬ÀýÈçÊý¾Ý¿âÁ¬½Ó£¬Óû§¼ø±ð£¬Õ¾µãµÄÍ·²¿/β²¿ÎļþµÈ¡£°ÑÕâЩº¯Êý·ÅÔÚÒ»¸öµØ·½£¬ÎÒÃǵÄÓ¦Óÿ´ÉÏÈ¥ºÜ¸É¾»£¬ÈÝÒ×ά»¤¡£
±íÒ»£ºÊ¾·¶µÄ¿â´úÂë
common.php:
//Á¬½Ó postgres Êý¾Ý¿â
$conn=pg_pconnect("user=tim dbname=db_example");
//¿´Á¬½ÓÊÇ·ñ³É¹¦
if (!$conn) {
//Èç¹ûʧ°ÜÔò±¨¸æ³ö´í
echo pg_errormessage($conn);
exit;
}
//Õ¾µãµÄÍ·Îļþ
function site_header ($title) {
return '
}
// Ò³Ãæ½áβµÄ HTML ´úÂë
function site_footer () {
return '';
}
//Ò»¸ö¼òµ¥µÄ²éѯִÐк¯Êý£¬ÓÃÀ´¼õÉÙ´úÂë
function query($sql) {
global $conn;
return pg_exec($conn,$sql);
}
//ÈÃÿһ¸öÒ³Ãæ×Ô¶¯Æô¶¯session»òÕß±£´æ session ״̬
session_start();
?>
Òò´Ë£¬ÎÒÃǵĵÚÒ»¸ö°æ±¾µÄ¿âÒѾ¿ÉÒÔÓÃÁË£¬ËüÁ¬½ÓÊý¾Ý¿â£¬ÌṩÁ˼òµ¥µÄ HTML
´úÂë¡£
ÎÒÃÇÕ¾µãÉÏÿһ¸öÒ³Ãæ¶¼°üÀ¨£º
require ($DOCUMENT_ROOT.'/include/common.php');
echo site_header('ʾ·¶Ò³Ãæ');
/*
Ò³ÃæÂß¼´¦Àí
*/
echo site_footer();
?>
Ò»°ã˵À´£¬ÔÚ¹¹½¨Ó¦ÓóÌÐòʱ£¬°ÑÂß¼ºÍʵ¼ÊµÄ±íʾ£¨ÔÚÎÒÃÇÕâÀï¾ÍÊÇHTML£©·Ö¿ªÊǺÜÃ÷Öǵġ£Òò´Ë£¬ÎÒ°ÑÂß¼·Åµ½º¯ÊýÀïÃæ¡£µ«ÊÇPHP ʹÓú¯Êýµ÷Óõķ½·¨£¬È±µãÊÇûÓбê×¼µÄ³ö´í´¦Àí¹ý³Ì£¬Èç¹ûº¯ÊýÄÚ²¿ÓдíµÄ»°£¬ºô½Ðº¯ÊýµÄ³ÌÐò²»ÄܰѰѴíÎóÐÅÏ¢´«µÝ¸øÓû§¡£ÔÚÆäËûµÄÓïÑÔ£¬ÀýÈçJava ÀïÃæ£¬Äã¿ÉÒÔʹÓÃtry/catchÓï¾äÀ´´¦Àí¡£
ÎҵĽâ¾ö°ì·¨ÊÇ£¬Ã¿¸öº¯Êý×ÜÊÇ·µ»Ø true »òÕß false £¬ÉèÖÃÒ»¸ö$feedbackÈ«¾Ö±äÁ¿£¬ÕâÑùµÄ»°£¬½á¹û¾Í¿ÉÒÔ²âÊÔ¡£ÏÖÔÚÓÐÒ»¸ö½Ð×öPEAR (http://pear.php.net/) µÄÏîÄ¿ÔÚ×ö±ê×¼»¯´íÎó´¦ÀíÒÔ¼°Êý¾Ý¿â´æÈ¡µÄŬÁ¦£¬
µ«Êǵ½Ä¿Ç°ÎªÖ¹£¬»¹²»ÄÜÎȶ¨ÔËÐС£
ÏÂÃæÊÇÒ»¸öʹÓÃÎÒµÄ true/false ·½·¨µ÷Óú¯ÊýµÄÀý×Ó£º
$result=function_call_name();
if (!$result) {
//ÏÔʾ´íÎó
echo $feedback;
} else {
//ûÓдíÎ󣬼ÌÐø
}
?>
ºÃÁË£¬ÏÖÔÚÈÃÎÒÃÇ¿ªÊ¼ÏëÏ빺Îï³µ°É£¡ ÎÒÃÇÐèҪһЩ»ù±¾µÄÊý¾Ý½á¹¹´æ´¢¹ºÎï³µµÄÊý¾Ý¡£ÀýÈ磬ÎÒÃÇÐèÒªÒ»¸ö¿â´æÊý¾Ý¿âÁгöÎïÆ·Ãû×Ö£¬²¿¼þºÅÂ룬¼Û¸ñÒÔ¼°ÊýÁ¿£¬Í¬Ê±£¬ÎÒÃÇ
»¹ÐèÒª¼Ç¼¹Ë¿Í¹ºÂòµÄÎïÆ·......Ì«¸´ÔÓÁË£¬¾ÍдÕâЩ°É¡£
±í¶þ¡¢¹ºÎï³µÊý¾Ý½á¹¹
Cart.sql:
# ½¨Á¢Ò»¸ö˳Ðò±íÓÃÀ´²úÉú¹Ë¿ÍºÅÂë¡£
# ÿ¸öid Ö®¼äÓÃËæÒâµÄÒ»¸öÊý×Ö·Ö¿ª£¬ÒÔ·À±ðÈ˲²⹺Îï³µºÅÂë¡£
create sequence seq_customer_id increment 26 start 1;
create table customers (
customer_id int not null default 0 primary key,
name text,
address text,
credit_card text,
total_order MONEY DEFAULT '{CONTENT}.00'
);
create table cart_items (
cart_item serial,
customer_id int,
part_number int,
quantity int
);
create index idx_cart_customer on cart_items(customer_id);
create table item_inventory (
part_number serial,
name text,
price float,
inventory int
);
Õâ¸ö½á¹¹¸øÎÒÃÇÒ»¸ö»ù±¾µÄ¹ºÎï³µ£¬ÎªÁ˹淶Êý¾Ý¿âģʽ£¬ÎÒ½¨Á¢Ò»¸ö¶ÀÁ¢µÄ±í£¬ÓÃÓÚÁгö¹Ë¿ÍµÄ¹ºÎï³µÀïµÄÄÚÈÝ¡£ÕâÑù£¬Èù˿͵ĹºÎï³µ¿ÉÒÔÓжàÏîÎïÆ·£¬²¢ÇÒ¿ÉÒÔºÜÈÝÒ×
µØºÍ¿â´æÊý¾Ý¿âÁ¬½Ó¡£
ÏÖÔÚÎÒÃÇÐèÒª¿¼ÂÇ»¸öÔÚÏßÉ̵êµÄ¸÷ÖÖ¹¦ÄÜÁË¡£Ò»¸ö×î»ù±¾µÄ¹¦ÄܾÍÊÇÈ¡µÃÒ»²¿¹ºÎï³µ£¬Íù³µÀïÌí¼ÓÎïÆ·£¬È»ºó½áÕË¡£µ±È»Ò»¸öʵ¼Ê²Ù×÷µÄÔÚÏßÉ̵꣬»¹ÐèÒªºÜ¶à¹¦ÄÜ£¬Ïñä¯À?ÎïÆ·£¬µ÷ÕûÊýÁ¿µÈ¡£ÕâЩ¾ÍµÈÄã×Ô¼ºÀ´Íê³ÉÁË¡£
ÎÒ´ÓÒ»¸ö¼òµ¥µÄÉú³ÉÒ»¸ö¹Ë¿ÍµÄ¹¦ÄÜ¿ªÊ¼£¬ËùÓÐÕâЩÆäʵ¾ÍÊÇÔÚÅŶӵĹ˿ÍÖÐÈ¡µÃÏÂÒ»¸ö¹Ë¿ÍµÄ×ÊÁÏ£¬²åÈë¹Ë¿Í±í£¬°Ñ¹Ë¿ÍºÅÂëÔÚPHP4 ÄÚÖõÄsession ¹ÜÀíÖÐ×¢²á¡£
±íÈý¡¢½¨Á¢Ò»¸öй˿Í
function cart_new() {
global $conn, $customer_id, $feedback;
// Æô¶¯Ò»¸öÊÂÎñ
query("BEGIN WORK");
//²éѯÏÂÒ»¸ö¹Ë¿ÍºÅÂë
$res=query("SELECT nextval('seq_customer_id')");
//¼ì²é´íÎó
if (!$res || pg_numrows($res)<1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error - Database didn't return next value ';
query("ROLLBACK");
return false;
} else {
$customer_id=pg_result($res,0,0);
// µÇ¼Çµ½ session
session_register('customer_id');
// ²åÈëй˿Í
$res=query("INSERT INTO customers (customer_id)
VALUES ('$customer_id')");
//¼ì²é´íÎó
if (!$res || pg_cmdtuples($res)<1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error - couldn't insert new customer row ';
query("ROLLBACK");
return false;
} else {
//commit this transaction
query("COMMIT");
return true;
}
}
}
?>
Õâ¶Î´úÂë±È½Ï³¤£¬ËäÈ»ÎÒ²»ÊǺÜϲ»¶£¬µ«ÊÇËüÑÝʾÁËÔõÑùÕýÈ·¿ªÊ¼ºÍ½áÊøPostgres µÄÊÂÎñÒÔ¼°ÔõÑù¼ì²é²éѯÓï¾äµÄ´íÎó¡£ÎÒÒªÔÚËùÓеĴúÂëÓõ½Í¬ÑùµÄ´íÎó¼à²â³ÌÐò£¬ÎÒÏ룬ÄãÒ²Ó¦¸ÃÈç´Ë¡£
ÐèÒª¼Æ»®ºÃÈç¹û²éѯ³ö´íµÄ´¦Àí°ì·¨£¬ÄãÊÇÖ±½ÓÖÕÖ¹³ÌÐòÄØ£¿»¹ÊÇÖØÐÂÔËÐвéѯÓï¾ä£¬ÒÖ»ò¼ÌÐøÖ´ÐУ¬¾Íµ±Ê²Ã´Ò²Ã»Óз¢Éú£¿×Ðϸ¿¼ÂÇÿÖÖÑ¡ÔñµÄ½á¹û¡£ÀýÈ磬Èç¹û²»Äܵõ½ÏÂÒ»¸ö¹Ë¿ÍµÄcustomer_id £¬ÄÇô£¬½¨Á¢Ð¹˿͵ļǼҲ¾ÍÅÝÌÀ£¬½ÓÏÂÀ´¾ÍÊDz»ÄܸüÐÂËýµÄµØÖ·£¬²»ÄÜÍù¹ºÎï³µÀïÌí¼ÓÎïÆ·£¬¶Ô°É£¿
ÏÖÔÚ£¬ÎÒÃÇ¿´¿´Ìí¼ÓÎïÆ·µÄ¹ý³Ì£¬Õâ¸ö²½ÖèÏà¶Ô±È½ÏÈÝÒ×£¬ÔÚÌí¼ÓÎïÆ·Ö®Ç°£¬ÒªÏȼì²éÎïÆ·ÊÇ·ñÔÚÊý¾Ý¿âÖС£ÕâÑù±È½Ï°²È«£¬ÒòΪÎïÆ·ºÅÂëÀ´×Ôä¯ÀÀÆ÷£¬¿ÉÄܱ»´Û¸Ä¡£Ò»µ©ÖªµÀÎïÆ·´æÔÚ£¬ÎÒÃǾÍÄܲâÊÔËüÊÇ·ñÒѾÔÚ¹ºÎï³µÀÈç¹ûÒѾ·ÅÈ룬ÄÇôÊýÁ¿¼ÓÒ»£¬¶ø²»ÊÇÁíÍâ²åÈëÒ»ÐУ¬·ñÔò£¬²åÈëÒ»ÌõÊýÁ¿ÎªÒ»µÄ¼Ç¼µ½¹ºÎï³µ¡£
±íËÄ¡¢Ìí¼ÓÎïÆ·µ½¹ºÎï³µ
function cart_add_item($item_id,$quantity=1) {
global $customer_id, $feedback, $conn;
$res=query("SELECT * FROM item_inventory WHERE part_number='$item_id'");
if (!$res || pg_numrows($res)<1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error-item not found ';
return false;
} else {
// ¼ì²éÎïÆ·ÊÇ·ñ·ÅÈ빺Îï³µ£¬Èç¹ûÊÇ£¬Ôö¼ÓÊýÁ¿
// ¿ªÊ¼ÊÂÎñ
query("BEGIN WORK");
$res=query("SELECT * FROM cart_items ".
"WHERE part_number='$item_id' AND customer_id='$customer_id' FOR UPDATE");
if (!$res || pg_numrows($res)<1) {
//Èç¹ûûÓиÃÎïÆ·£¬Ð²åÈëÒ»Ìõ
$res=query("INSERT INTO cart_items ".
"(customer_id,part_number,quantity)".
"VALUES ($customer_id,$item_id,$quantity)");
if (!$res || pg_cmdtuples($res) < 1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error-couldn't insert into cart ';
//¾¡¹ÜûÓж«Î÷±»¸Ä±ä£¬µ«ÊÇ×îºÃ»¹ÊǻعöÊÂÎñ
query("ROLLBACK");
return false;
} else {
query("COMMIT");
return true;
}
} else {
//¹ºÎï³µÖÐÒѾ´æÔÚ¸ÃÎïÆ·
$res=query("UPDATE cart_items SET quantity = quantity + $quantity ".
"WHERE part_number='$item_id' AND
customer_id='$customer_id'");
if (!$res || pg_cmdtuples($res) < 1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error-couldn't increment quantity in cart ';
query("ROLLBACK");
return false;
} else {
// Ìá½»¸Ä±ä£¬Õýʽ¸üÐÂÊý¾Ý¿â¡£
query("COMMIT");
return true;
}
}
}
}
?>
ÏÖÔÚÎÒÃÇÄܽ¨Á¢Ð¹˿ͣ¬²¢ÇÒËûÃÇÌí¼ÓÎïÆ·ÁË¡£ÎÒÃÇÏÖÔÚÐèÒª½áÕË£¬²¢¼õµô¿â´æ¡£ÕâÒ»²¿·ÖÊÇ×Ôӵ쬳ä·ÖÀûÓÃÁËPostgres µÄÊÂÎñ¹¦ÄܺÍÏȽøËø»úÖÆ¡£
ÎÒÃÇÓÃPostgres µÄ SELECT...FOR UPDATE Óï·¨×÷Ϊ¿ªÊ¼£¬Õâ¸öÓï¾äÄÜÓÐЧµØ¶Ôµ±Ç°Ñ¡ÔñµÄÐмÓËøÊ¹ÄãÄÜÔÚÒ»¸öÊÂÎñÀï¸üв¢Ìá½»¸Ä±ä¡£
ͨ¹ýÔÚÒ»¸öÊÂÎñÀïʹÓÃÕâ¸öÓï¾ä£¬Äã¿ÉÒÔ±£Ö¤Êý¾ÝµÄÒ»ÖÂÐÔ¡£ÔÚÆäËûµÄһЩÊý¾Ý¿â£¬ÀýÈçMySQL £¬¾Í²»ÄÜËø¶¨Ö¸¶¨µÄÊý¾ÝÐУ¬¶øµÃµ½²»ÕýÈ·µÄÊý¾ÝÒÔ¼°Ã»ÓÃµÄ¿â´æÍ³¼Æ¡£
Õâ¸öÓï¾äÒ²ÄÜÀûÓÃ×Ó²éѯ£¬ÁíÍâÒ»¸öÊý¾Ý¿âµÄ±ê×¼ÌØÐÔ¡£×Ó²éѯ¿ÉÒÔÈÃÄãºÜʡʵذÑÁ½¸ö²éѯ½áºÏÔÚÒ»Æð£¬
Ëø¶¨ÐÐÒÔºó£¬ÎÒÃÇÐèÒª°´ÕÕ¹ºÎï³µµÄÎïÆ·¼õÉÙ¶ÔÓ¦µÄ¿â´æÁ¿¡£Îª¼ò±ãÆð¼û£¬ÎÒÃÇ¶Ô¿â´æ²»¹»²»±¨¸æ´íÎ󣬲¢°Ñ¿â´æ±äΪ¸ºÊý¡£Äã¿ÉÒÔ×Ô¼ºÐ´Ò»¸ö¹ÜÀíÒ³Ãæ£¬²é¿´¸ºÊý¿â´æµÄÎïÆ·£¬²¢È¥¶©¹º¡£
×îºó£¬ÎÒÃǸüй˿ͱíÖеÄÐÅÓÿ¨£¬¹ºÂòÐÅÏ¢£¬ºÏ¼Æ¹ºÂò½ð¶î£¬³·µôÕâ¸ö¹Ë¿ÍµÄsession¡£
±íÎå¡¢½áÕË£¬¼õ¿â´æ
function cart_checkout($credit_card,$address,$name) {
global $conn, $customer_id, $feedback;
// ÊÂÎñ¿ªÊ¼
query("BEGIN WORK");
// Ëø×¡¿â´æ±íµÄ¶ÔÓ¦ÐУ¬ÓÃÒ»¸ö¼òµ¥µÄ×Ó²éѯÀ´´¦Àí¡£
$sql="SELECT * FROM item_inventory ".
"WHERE part_number ".
"IN (SELECT part_number FROM cart_items ".
"WHERE customer_id='$customer_id') ".
"FOR UPDATE";
$res=query($sql);
if (!$res || pg_numrows($res)<1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error - no items locked ';
query("END WORK");
return false;
} else {
// ¿â´æµÄij¼¸ÐÐÒѱ»Ëø¶¨£¬´Ó¹ºÎﳵȡµÃÎïÆ·ÒÔ¼°ÊýÁ¿¡£
$sql="SELECT part_number,quantity ".
"FROM cart_items ".
"WHERE
customer_id='$customer_id' ".
"ORDER BY part_number DESC";
$res2=query($sql);
if (!$res2 || pg_numrows($res2)<1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error - no items in cart ';
query("END WORK");
return false;
} else {
$rows=pg_numrows($res2);
// ¸üÐÂ¿â´æÓà¶î
for ($i=0; $i < $rows; $i++) {
// ¶ÁÈ¡¹ºÎï³µÊý¾Ý
$quantity=pg_result($res2,$i,'quantity');
$item_id=pg_result($res2,$i,'part_number');
$res3=query("UPDATE item_inventory".
"SET inventory =inventory-$quantity ".
"WHERE part_number='$item_id'");
if (!$res3 || pg_cmdtuples($res3) < 1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error - updating inventory failed ';
query("ROLLBACK");
return false;
}
}
// ¿â´æ¸üнáÊø£¬µÃµ½Õâ¸ö¶©µ¥µÄºÏ¼Æ½ð¶î²¢¸üй˿ͼǼ
$res=query("SELECT sum(cart_items.quantity*item_inventory.price) ".
"FROM cart_items,item_inventory ".
"WHERE cart_items.customer_id='$customer_id' ".
"AND cart_items.part_number=item_inventory.part_number");
if (!$res || pg_numrows($res) < 1) {
//couldn't get order total
$feedback .= pg_errormessage($conn);
$feedback .= ' Error - couldn't get order total ';
query("ROLLBACK");
return false;
} else {
// ¸üй˿ͱí
$total=pg_result($res,0,0);
$res=query("UPDATE customers ".
"SET address='$address',name='$name',".
"total_order='$total',credit_card='$credit_card'".
"WHERE customer_id='$customer_id'");
if (!$res || pg_cmdtuples($res) < 1) {
$feedback .= pg_errormessage($conn);
$feedback .= ' Error - updating customer information ';
query("ROLLBACK");
return false;
} else {
// ¸Ä±äÕýʽÉúЧ
query("COMMIT");
// ɾ³ý session
$customer_id=0;
session_destroy();
return true;
}
}
}
}
}
?>

