バージョン選択
フォーラム
メニュー
オンライン状況
|
|
88 人のユーザが現在オンラインです。 (77 人のユーザが フォーラム を参照しています。) |
|
|
質問 > 管理機能 > 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。 |
|
管理機能
投稿者 |
スレッド |
alt_shta6 |
投稿日時: 2018/10/9 11:43
対応状況: −−−
|
新米 登録日: 2018/4/13 居住地: 投稿: 7 |
Re: 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。 >>インサート文が1レコード分しか実行されていないのではないでしょうか? 上記確認します。ありがとうございます。
SQLインジェクションの件も調べて対策したいと思います。ご指摘いただきありがとうございます。
|
|
|
468 |
投稿日時: 2018/10/5 14:42
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。 dtb_order_detail, dtb_shipment_itemに対するインサート文が1レコード分しか実行されていないのではないでしょうか? あと、文字列でSQL文を組み立てられていますが、SQLインジェクションは大丈夫でしょうか? 購入データのお問い合わせ欄は自由に入力ができますので、少し気になりました。 ---------------- 株式会社シロハチ ■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 1:05
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 購入後、別のDBに購入情報を入れる際複数商品の情報を入れたい。 データ移行元のDBとデータ移行先のDBの dtb_order_detail, dtb_shipping, dtb_shipment_itemのレコードが一致しているか確認されてみては如何でしょうか? ---------------- 株式会社シロハチ ■ECCUBE2系、3系構築カスタマイズご相談ください。 ■EC-CUBE3マニュアル ■blog
|
|
|
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();
〜〜〜〜〜〜〜〜
}
|
|
|
|
統計情報
総メンバー数は88,307名です
総投稿数は109,692件です
|