バージョン選択

フォーラム

メニュー

オンライン状況

42 人のユーザが現在オンラインです。 (36 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 42
もっと...

サイト内検索

質問 > 管理機能 > 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
alt_shta6
投稿日時: 2018/10/4 19:44
対応状況: 開発中
新米
登録日: 2018/4/13
居住地:
投稿: 7
購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。
▼テンプレート
[EC-CUBE] 3.0.15
[レンタルサーバ] エックスサーバー
[PHP] 7.0.30
[データベース] MySQL 5.7.16

現状、購入後、別のECCUBEのDBに購入情報を入れるカスタマイズをしています。
その際に、複数商品がある場合も、購入商品の情報は1点しか入りません。

DBのテーブルdtb_shipment_itemに複数商品を購入した際に情報が入っているので、その情報を別のECCUBEのDBのテーブルdtb_shipment_itemに入れれば良いと思うのですが、
カスタマイズしている部分は
「src>Eccube>Controller>ShoppingController.php」
です。


/**
     * 購入処理
     */
    public function confirm(Application $app, Request $request)
    {
〜〜〜〜〜〜〜〜
// 受注IDをセッションにセット
            $app['session']->set($this->sessionOrderKey, $Order->getId());
〜〜〜〜〜〜〜〜
            //購入情報をマスターに反映させるためにデータを取得
            //使用する配列を設定
            $o_list = array();
            $set_order = array();
            $set_value = array();
            
            //店舗の情報を設定
			$shops = '◯◯◯◯◯店';
			$shop_id = "xxxxxxxx";
			$master = "xxxxxxxx";
			$master_memberId = xx;
            //購入のidを取得
            $g_Id = $app['session']->get($this->sessionOrderKey);
            
            //データベースのフォーマットを設定
            $entityManager = $app['orm.em'];
			$pdo = $entityManager->getConnection()->getWrappedConnection();
			
            //取得するデータを配列で設定
			$datas = ["name01", "name02", "kana01", "kana02", "company_name", "email", "tel01", "tel02", "tel03", "fax01", "fax02", "fax03", "zip01", "zip02", "zipcode", "addr01", "addr02", "subtotal", "delivery_fee_total", "charge", "tax", "total", "payment_total", "payment_method", "create_date", "update_date", "order_date", "del_flg", "status", "note", "customer_id", "order_pref", "order_sex", "order_job", "payment_id", "device_type_id", "pre_order_id"];
			for($j = 0; $j < count($datas); $j++){
				if($j < 17){
					$o_list[$j] = "order_" . $datas[$j];
				}else {
					$o_list[$j] = $datas[$j];
				}
			}
            //idに基づきデータを取得
            $stmt = $app['db']->query('select * from dtb_order WHERE order_id=' . $g_Id);
			while ($row = $stmt->fetch()) {
			// orderは配列で設定
				for($k = 0; $k < count($datas); $k++) {
					$set_order[$k] = $row[$o_list[$k]];
					if($k == 29){
						$set_order[$k] = $shops;
					}else if($k == 30) {
						$set_order[$k] = $master_memberId;
					}
				}
			}
			
			//非会員の場合に性別と仕事を自動設定
			if(is_null($set_order[32])){
				$set_order[32] = "1";
			}
			if(is_null($set_order[33])){
				$set_order[33] = "18";
			}
			
			array_push($o_list, "shop_id");  //shop_idを設定する為に配列の最後に追加
			$list_imp = implode(",", $o_list);  //配列を文字列化
 			//$order_imp = implode(",", $set_order);
			
			// db_insertのvalueを設定
			for($l = 0; $l < count($datas); $l++){
				$set_value[$l] = "'%s'";
			}
			
			array_push($set_value, "'%s'");  //shop_idを設定する為に配列の最後に追加
			$value_imp = implode(",", $set_value);  //配列を文字列化
			array_push($set_order, $shop_id);  //shop_idを設定する為に配列の最後に追加
			

			//購入データをマスターにインサート
			$sql = "INSERT INTO $master.dtb_order (" . $list_imp . ") VALUES (" . $value_imp . ")";
			$query = vsprintf($sql, $set_order);
			$stmt = $pdo->prepare($query);
			$stmt->execute();
	        
		  // csvエクスポート用のdetailの設定

			$set_detail = array();
			$set_Cvalue = array();
			$d_list = array();
			//取得するデータを配列で設定
			$detail = ["order_id", "product_id", "product_class_id", "product_name", "product_code", "class_name1", "class_name2", "class_category_name1", "class_category_name2", "price", "quantity", "tax_rate", "tax_rule"];
			
			// masterになるとorder_idが変化している為、pre_order_idからorder_idを取得
			$pre_id = "'" . $set_order[36] . "'";
			$stmt = $app['db']->query("select * from $master.dtb_order WHERE pre_order_id=" . $pre_id);
			while ($row = $stmt->fetch()) {
				$p_id = $row["order_id"];		
			}
			
			//取得するデータを再配列化
			for($o = 0; $o < count($detail); $o++){
				$d_list[$o] = $detail[$o];
			}
			
			$stmt = $app['db']->query('select * from dtb_order_detail WHERE order_id=' . $g_Id);
			//データを取得して配列化
			while ($c_row = $stmt->fetch()) {
				for($m = 0; $m < count($detail); $m++) {
					if($m == 0){
						$set_detail[$m] = $p_id;
					} else {
						$set_detail[$m] = $c_row[$detail[$m]];		
					}
				}
			}
			
			for($n = 0; $n < count($detail); $n++){
				$set_Cvalue[$n] = "'%s'";
			}
			
			//配列を文字列化
			$value_imp = implode(",", $set_Cvalue);	
			$d_imp = implode(",", $d_list);
			
			// 配列の中身をチェックする際のdump
			//dump($d_imp);
			//dump($value_imp);
			//dump($set_detail);
			$sql = "INSERT INTO $master.dtb_order_detail (" . $d_imp . ") VALUES (" . $value_imp . ")";
			$query = vsprintf($sql, $set_detail);
			$stmt = $pdo->prepare($query);
			$stmt->execute();
		
	/* ------------------------------------------------------------
			
			  ここからshipping用
			
		------------------------------------------------------------ */	
		/* 	使用する配列を追加 */
		$s_list = array();
		$set_s_order = array();
		$s_set_value = array();
		
		$sp_list = array();
		$set_sp_order = array();
		$sp_set_value = array();

		/* 取得するデータを配列で設定 */
		//time_idとcountry_idはエラーを起こしnullになるので削除
		$s_date = ["pref", "order_id", "delivery_id", "fee_id", "name01", "name02", "kana01", "kana02", "company_name", "tel01", "tel02","tel03", "fax01", "fax02", "fax03", "zip01", "zip02", "zipcode", "addr01", "addr02", "delivery_name", "delivery_time", "delivery_date", "delivery_fee", "commit_date", "rank"];
		for ($o = 0; $o < count($s_date); $o++ ){
			if ($o == 1 || $o == 2 || $o == 3 || $o == 25) {
				$s_list[$o] = $s_date[$o];
			}else {
				$s_list[$o] = "shipping_" . $s_date[$o];
			}
		}
		
		//idに基づきデータを取得
		$stmt = $app['db']->query('select * from dtb_shipping WHERE order_id=' . $g_Id);
		while ($row = $stmt->fetch()) {
		// orderは配列で設定
			for($p = 0; $p < count($s_date); $p++) {
				if($p == 1) {
					$set_s_order[$p] = $p_id; //order_idをmaster側のidにする
				} else {
					$set_s_order[$p] = $row[$s_list[$p]];
				}
			}
		}
		
		$s_list_imp = implode(",", $s_list);  //配列を文字列化
		
		// db_insertのvalueを設定
		for($q = 0; $q < count($s_date); $q++){
			$s_set_value[$q] = "'%s'";
		}
		
		$s_value_imp = implode(",", $s_set_value);  //配列を文字列化
		
		/* 	masterのshippingにデータを挿入 */
		$s_sql = "INSERT INTO $master.dtb_shipping (" . $s_list_imp . ") VALUES (" . $s_value_imp . ")";
		$s_query = vsprintf($s_sql, $set_s_order);
		$stmt = $pdo->prepare($s_query);
		$stmt->execute();
		
		/* masterのshoppin_idを取得する */
		$s_stmt = $app['db']->query("select * from $master.dtb_shipping WHERE order_id=" . $p_id);
		while ($row = $s_stmt->fetch()) {
			$s_id = $row["shipping_id"];		
		}
		
		/* 	order_idとshippinng_idをshipment_itemにセットする */
		
		/* 	店舗側のshipment_itemの情報を取得 */
		$sp_date = ["order_id", "product_id", "product_class_id", "shipping_id", "product_name", "product_code", "class_name1", "class_name2", "class_category_name1", "class_category_name2", "price", "quantity"];
		for ($r = 0; $r < count($sp_date); $r++ ){
			$sp_list[$r] = $sp_date[$r];
		}

		//idに基づきデータを取得
		$stmt = $app['db']->query('select * from dtb_shipment_item WHERE order_id=' . $g_Id);
		while ($row = $stmt->fetch()) {
		// orderは配列で設定
			for($s = 0; $s < count($sp_date); $s++) {
				if($s == 0) {
					$set_sp_order[$s] = $p_id; //order_idをmaster側のidにする
				} elseif($s == 3){
					$set_sp_order[$s] = $s_id; //shipping_idをmaster側のidにする
				} else {
					$set_sp_order[$s] = $row[$sp_list[$s]];
				}
			}
		}
		
		$sp_list_imp = implode(",", $sp_list);  //配列を文字列化
		
		// db_insertのvalueを設定
		for($t = 0; $t < count($sp_date); $t++){
			$sp_set_value[$t] = "'%s'";
		}
		
		$sp_value_imp = implode(",", $sp_set_value);  //配列を文字列化
		
		/* 	masterのshipment_itemに情報を挿入 */
		$sp_sql = "INSERT INTO $master.dtb_shipment_item (" . $sp_list_imp . ") VALUES (" . $sp_value_imp . ")";
		$sp_query = vsprintf($sp_sql, $set_sp_order);
		$stmt = $pdo->prepare($sp_query);
		$stmt->execute();
〜〜〜〜〜〜〜〜
}
468
投稿日時: 2018/10/5 1:05
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1315
Re: 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。
データ移行元のDBとデータ移行先のDBの
dtb_order_detail, dtb_shipping, dtb_shipment_itemのレコードが一致しているか確認されてみては如何でしょうか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

alt_shta6
投稿日時: 2018/10/5 13:55
対応状況: −−−
新米
登録日: 2018/4/13
居住地:
投稿: 7
Re: 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。
確認しましたら、
dtb_shipping
dtb_order
は正常に情報が入っていると思います。

dtb_order_detail
dtb_shipment_item
上記2テーブルは2商品購入時1商品の情報しか入っておりませんでした。
468
投稿日時: 2018/10/5 14:42
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1315
Re: 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。
dtb_order_detail, dtb_shipment_itemに対するインサート文が1レコード分しか実行されていないのではないでしょうか?
あと、文字列でSQL文を組み立てられていますが、SQLインジェクションは大丈夫でしょうか?
購入データのお問い合わせ欄は自由に入力ができますので、少し気になりました。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

alt_shta6
投稿日時: 2018/10/9 11:43
対応状況: −−−
新米
登録日: 2018/4/13
居住地:
投稿: 7
Re: 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。
>>インサート文が1レコード分しか実行されていないのではないでしょうか?
上記確認します。ありがとうございます。

SQLインジェクションの件も調べて対策したいと思います。ご指摘いただきありがとうございます。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

統計情報

総メンバー数は36,251名です
総投稿数は88,524件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
1851
4
yuh
1524
5
468
1315
6
red
1199
7
umebius
1007
8
fukap
907
9
shutta
827
10
tsuji
815
11 ramrun 789
12
tao_s
667
13 karin 656
14 sumida 641
15
homan
633
16
h_tanaka
632
17 DELIGHT 571
18
patapata
502
19
flealog
483
20 tonton 436


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© LOCKON CO.,LTD. All Rights Reserved.