ホームページ > php教程 > php手册 > PHP4 と PostgreSQL を使用して電子商取引アプリケーションを構築する

PHP4 と PostgreSQL を使用して電子商取引アプリケーションを構築する

WBOY
リリース: 2016-06-21 09:05:12
オリジナル
1045 人が閲覧しました

電子商取引

この記事では、単純な Web アプリケーションを介して、電子商取引における PHP と PostgresSQL のアプリケーションを示します。

少し前まで、本格的な Web アプリケーションを構築するには、高価な Cold Fusion ライセンスと、Sybase などの商用データベース サーバーと Sun サーバーを購入する必要がありました。幸いなことに、そんな日々はもう終わりました。無料のデータベース市場が成熟し、Apache ユーザーが大幅に増加するにつれて、これらの独自ソフトウェアの機能に匹敵する、あるいはそれを超える代替手段が数多く登場しています。

より優れたオープンソース ソフトウェアの 1 つは、Perl によく似たスクリプト言語である PHP と、非常に強力なオブジェクト指向データベースである PostgreSQL です。 2 つを組み合わせれば、単純なゲストブックから巨大な Web ベースの金融ソフトウェアまで、あらゆるものをデザインできます。 PHP は頭脳を提供し、Postgres は体力を提供します。

以下では、Postgres のトランザクション機能を最大限に活用する、非常に基本的な PHP ショッピング カートと在庫アプリケーションを紹介します。ソース コードは PHPBuilder.com からダウンロードすることをお勧めします。

最初に言及するのは、私の PHP Web アプリケーションでは、常に最初に common.php という名前の包括的なライブラリをセットアップして、 include ディレクトリに保存します。

このライブラリは、データベース接続、ユーザー認証、サイトのヘッダー/末尾ファイルなどの日常的なタスクを処理します。これらの関数を 1 か所にまとめることにより、アプリケーションは見た目がすっきりし、保守も容易になります。

表 1: デモ ライブラリ コード

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);

//各ページがセッションを自動的に開始するか、セッションのステータスを保存します

_start();


したがって、ライブラリの最初のバージョンはすでに利用可能であり、データベースに接続して簡単な HTML
コードを提供します。

サイトのすべてのページには以下が含まれます:



require ($DOCUMENT_ROOT.'/include/common.php');

/*
ページロジック処理
*/

echo site_footer();

?> 一般に、アプリケーションを構築するときは、ロジックを実際のプレゼンテーション (この場合は HTML) から分離することが賢明です。したがって、関数の中にロジックを入れました。ただし、PHP は関数呼び出しの方法を使用します。欠点は、関数内でエラーが発生した場合に、関数を呼び出したプログラムがエラー情報をユーザーに渡すことができないことです。 Java などの他の言語では、try/catch ステートメントを使用してこれを処理できます。

私の解決策は、各関数に対して常に true または false を返し、結果をテストできるように $フィードバック グローバル変数を設定することです。現在、PEAR (http://pear.php.net/) というプロジェクトがあり、エラー処理やデータベースアクセスの標準化に取り組んでいます
が、今のところ安定して動作することができません。

true/false メソッドを使用して関数を呼び出す例を次に示します。


$result=function_call_name();

if (!$result) {
//Show error
echo $フィードバック;
} else {
//エラーはありません、続行します
}

?>

それでは、ショッピング カートについて考えてみましょう。 ショッピング カートのデータを保存するには、いくつかの基本的なデータ構造が必要です。たとえば、商品名、部品番号、価格、数量をリストする在庫データベースが必要ですが、同時に顧客が購入した商品も記録する必要があります...複雑すぎるので、これらを記述するだけです。

表 2. ショッピング カートのデータ構造

Cart.sql:

# 顧客番号を生成するためのシーケンス テーブルを作成します。
# 他の人がショッピング カートの番号を推測できないように、各 ID を乱数で区切ります。
シーケンス seq_customer_id 増加 26 開始 1;

テーブル顧客を作成 (
customer_id int not null デフォルト 0 主キー、
名前テキスト、
住所テキスト、
credit_card テキスト、
total_order MONEY DEFAULT '{CONTENT}.00'
) ;

テーブル cart_items を作成します (
cart_item シリアル、
customer_id int、
part_number int、
quantity int
);create table item_inventory (
part_number series,
name text,
price float,
inventory int
);


この構造は、データベース スキーマを標準化するために、抽出列の独立したテーブルを作成しました。顧客のショッピングカートの中身。このようにして、顧客はショッピング カートに複数の商品を入れることができ、在庫データベースに簡単に接続できます。

次に、アイテムを検討し、数量を調整する必要がある理由を検討する必要があります。これを自分で完了するかどうかはあなた次第です。

顧客を生成する簡単な関数から始めました。これはすべて、実際にキューに入れられた顧客から次の顧客の情報を取得し、それを顧客テーブルに挿入し、PHP4 の組み込みセッション管理に顧客番号を登録することです。

表 3. 新しい顧客の作成

function cart_new() {

global $conn, $customer_id, $フィードバック

// トランザクションを開始します
query("BEGIN WORK");
//次の顧客番号をクエリします
$res=query("SELECT nextval('seq_customer_id')");

//エラーをチェックします
if (!$res || pg_numrows($res)<1) {
$フィードバック .= pg_errormessage($conn);
$フィードバック .= ' エラー - データベースは次の値を返しませんでした ';
return false
} else {
$customer_id=pg_result( $ res,0,0);

// セッションに登録
session_register('customer_id');

// 新しい顧客を挿入
$res=query("INSERT INTO Customers (customer_id)
VALUES ('$customer_id' ) ");

//エラーを確認する
if (!$res || pg_cmdtuples($res)<1) {
$フィードバック .= pg_errormessage($conn);
$フィードバック .= ' エラー - できませんでした新しい顧客行を挿入 ';
query("ROLLBACK");
return false;
// このトランザクションをコミット
}
}

?> ;

このコードはあまり好きではありませんが、Postgres トランザクションを正しく開始および終了する方法と、クエリ ステートメントのエラーをチェックする方法を示しています。私はすべてのコードで同じエラー監視ルーチンを使用していますが、あなたもそうすべきだと思います。

クエリが失敗した場合の対処法を計画する必要があります。プログラムを直接終了する必要がありますか?それともクエリ ステートメントを再実行しますか、それとも何も起こらなかったかのように実行を続行しますか?それぞれの選択の結果を慎重に検討してください。たとえば、次の顧客の customer_id を取得できない場合、新しい顧客レコードを作成することはできず、その顧客の住所を更新したり、ショッピング カートに商品を追加したりすることはできません。 ?

次に、アイテムを追加するプロセスを見てみましょう。このステップは比較的簡単です。アイテムを追加する前に、まずアイテムがデータベースに存在するかどうかを確認する必要があります。アイテム番号はブラウザから取得され、改ざんされる可能性があるため、これはより安全です。アイテムが存在することがわかったら、それがすでにカートにあるかどうかをテストし、存在する場合は、別の行を挿入する代わりに数量に 1 つ追加します。それ以外の場合は、数量 1 のレコードをカートに挿入します。

表 4、ショッピング カートに商品を追加します

function cart_add_item($item_id,$quantity=1) {
global $customer_id, $フィードバック, $conn;

$res=query("SELECT * FROM item_inventory WHERE part_number='$item_id'");

if (!$res || pg_numrows($res)<1) {
$フィードバック .= pg_errormessage($conn);
$フィードバック .= ' エラー- アイテムが見つかりません ';
return false
} else {
// アイテムがショッピングカートに入れられているかどうかを確認し、入っている場合は数量を増やします
// トランザクションを開始します
query("BEGIN WORK"); $res=query( "SELECT * FROM cart_items ".
"WHERE part_number='$item_id' AND customer_id='$customer_id' FOR UPDATE"); $res || pg_numrows($res)<1 ) {

/ /商品が存在しない場合は、新しい商品を挿入します
$res=query("INSERT INTO car_items ".
"(customer_id,part_number,quantity)".
"VALUES ($customer_id,$item_id, $quantity)");

if (!$res || pg_cmdtuples($res) < 1) {
$フィードバック .= pg_errormessage($conn);
$フィードバック .= ' エラー - カートに挿入できませんでした';
//何も変更されていませんが、トランザクションをロールバックすることをお勧めします
query("ROLLBACK");
return false;
query("COMMIT");
}
} else {
//ショッピングカート内に商品はすでに存在します
$res=query("UPDATE car_items SET 数量 = 数量 + $数量 ".
"WHERE part_number='$item_id' AND
customer_id='$customer_id '");
if (!$res || pg_cmdtuples($res) < 1) {
$フィードバック .= pg_errormessage($conn);
$フィードバック .= ' エラー - カート内の数量を増やすことができませんでした ';
query("ROLLBACK");
return false;
} else {
// 変更を送信し、データベースを正式に更新します。
query("COMMIT");
return true;
}
}
}
}

?> これで、新しい顧客がアイテムを追加できるようになります。次に、チェックアウトして在庫を減らす必要があります。この部分は最も複雑で、Postgres のトランザクション機能と高度なロック メカニズムを最大限に活用します。

まず、Postgres の SELECT...FOR UPDATE 構文から始めます。このステートメントは現在選択されている行を効果的にロックし、トランザクションで変更を更新およびコミットできるようにします。

トランザクションでこのステートメントを使用すると、データの一貫性を確保できます。 MySQL などの他のデータベースでは、特定のデータ行をロックできないため、不正確なデータや無用な在庫統計が取得されます。

このステートメントは、データベースのもう 1 つの標準機能であるサブクエリを利用することもできます。サブクエリを使用すると、2 つのクエリを簡単に組み合わせることができます。

行をロックした後、ショッピング カート内の商品に応じて、対応する在庫を減らす必要があります。わかりやすくするために、在庫不足のエラーは報告せず、在庫を負の数に変換します。自分で管理ページを作成して、マイナス在庫の商品を表示して注文することができます。

最後に、顧客テーブルのクレジットカード、購入情報、購入総額を更新し、顧客のセッションをキャンセルします。

表 5、チェックアウト、在庫削減

function cart_checkout($credit_card,$address,$name) {
global $conn, $customer_id, $フィードバック

// トランザクション開始
query; BEGIN WORK");

// 在庫テーブルの対応する行をロックし、単純なサブクエリを使用して処理します。

$sql="SELECT * FROM item_inventory ".
"WHERE part_number ".
"WHERE customer_id='$customer_id') ".
$res= query($sql);

if (!$res || pg_numrows($res)<1) {
$フィードバック .= pg_errormessage($conn);
$フィードバック .= ' エラー - ロックされている項目はありません '; query("END WORK");
return false;
} else {

// 在庫の特定の行がロックされているため、ショッピング カートからアイテムと数量を取得します。
$sql="SELECT 部品番号, 数量 ".
"WHERE
customer_id='$customer_id' ".
$res2=query($sql); (!$res2 || pg_numrows($res2)<1) {
$フィードバック .= pg_errormessage($conn);
$フィードバック .= ' エラー - カートに商品がありません '
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-$quantity ".
"WHERE part_number='$item_id'");

if (!$res3 || pg_cmdtuples($res3) < 1) {
$フィードバック .= pg_errormessage($conn ) ;
$フィードバック .= ' エラー - 在庫の更新に失敗しました ';
return false
}
}
//在庫の更新が完了しました。 Record
$ 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) {
//注文合計を取得できませんでした
$フィードバック .= pg_errormessage($conn);
$フィードバック .= 'エラー - 注文合計を取得できませんでした ';
return false;
// 顧客テーブルを更新します
$total=pg_result($res,0,0); res=query(" 顧客を更新 ".
"SET address='$address',name='$name',".
"total_order='$total',credit_card='$credit_card'".
"WHERE customer_id= '$customer_id'" )​​;

if (!$res || pg_cmdtuples($res) < 1) {
$フィードバック .= pg_errormessage($conn);
$フィードバック .= ' エラー - 顧客情報の更新 ';
query("ROLLBACK ");
return false;
} else {
// 変更は正式に有効になります

// セッションを削除します
$customer_id=0; true を返します
}
}
}
}

?>





関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート