2018年以降のサーバーで、EC-CUBE2系を動かすには?

2016〜2018年頃、レンタルサーバーでPHPやSQLのバージョンアップにより
いろんなオープンソースが対応できなくなるケースが多発しています。

EC-CUBE2系の場合、症状は様々ですが
・サイトが表示されない
・インストールが完了できない
・その他

原因の一つとして
SET SESSION storage_engine = InnoDB の実行時に以下のエラーで実行できないケースがあります。

/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php の 末尾付近を編集します。

    function initObjQuery(SC_Query &$objQuery) {
        // $objQuery->exec('SET SESSION storage_engine = InnoDB');
	$objQuery->exec('SET SESSION default_storage_engine = InnoDB');
        $objQuery->exec("SET SESSION sql_mode = 'ANSI'");
    }

MySQL カラムのコメントを取得する

SQL文の半自動化に、さらなる進化がありました。

MySQLのカラムコメントを抽出することで
フォームの半自動化→7割自動化 を実現しました。

//構文設定
$stmt = $pdo->prepare('SHOW FULL columns FROM ' . wr_user);

//実行
$stmt->execute();

$array_comment = array();
$i = 0;
foreach($stmt->fetchAll() as $result):
	array_push($array_comment, $result['Comment']);
	$i ++;
endforeach;

var_dump($array_comment);

SQL文 を半自動で生成する

$pdo = new PDO('mysql:host = '.DB_SERVER.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);
$sql = "SELECT * FROM `wr_user` LIMIT 1";
$statement = $pdo->query($sql);
$item = $statement->fetch(PDO::FETCH_ASSOC);

$i = 0;
foreach($item as $key => $val){

	if($i == 0){
		$kanma = '';
	}else{
		$kanma = ',';
	}

	$key_text .= $kanma."`".$key."`";
	$val_text .= $kanma."'$".$key."'";

	$i ++;
}
echo '<hr>'.$key_text.'<hr>';
echo $val_text.'<hr>';


$sql = "INSERT INTO `wr_user` ($key_text) VALUES($val_text)";
echo $sql;
$db = mysql_connect(DB_HOST.":".DB_PORT,DB_USER,DB_PASSWORD);
// mysql_query("SET NAMES utf8");
mysql_set_charset('utf8');
mysql_select_db(DB_NAME, $db);


$sql = "SELECT * FROM wr_posts LIMIT 1";
$rs = mysql_query($sql,$db);
$item = mysql_fetch_assoc($rs);
var_dump($item);


$i = 0;
foreach($item as $key => $val){

	if($i == 0){
		$kanma = '';
	}else{
		$kanma = ',';
	}

	$key_text .= $kanma."`".$key."`";
	$val_text .= $kanma."'$".$key."'";

	$i ++;
}
echo '<hr>'.$key_text.'<hr>';
echo $val_text.'<hr>';

自動生成の例
INSERT INTO `wr_user`
  (`user_id`,`f1`,`f2`,`f3`)   
  VALUES
  (‘exampleuser_id’,’examplef1′,’examplef2′,’examplef3′)

MySQLのフィールド名をSQL文用に自動で整形する。

MySQLのフィールド名(カラム名)をSQL文用に自動で整形する。

$sql = "SELECT * FROM `dtb_customer` LIMIT 1";
$rs = mysql_query($sql,$db);
$item = mysql_fetch_assoc($rs);
// Key を配列化
$key_arr = array();
foreach($item as $key => $val){
	echo $key."<br>";
}
$sql = "SELECT * FROM `dtb_products` LIMIT 1";
$rs = mysql_query($sql,$db);
$item = mysql_fetch_assoc($rs);
// Key を配列化
$key_arr = array();
foreach($item as $key => $val){
	//      echo $key."=>".$val."<br>"; // 試験表示
	//     array_push($key_arr, $key);
	echo "`".$key."`,";
}

SQLデータベースに接続の基本コード

php5〜php7

Database に接続

$pdo = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);

ヒットがユニークの場合

$sql = "SELECT * FROM `tb_hogehoge`";
$statement = $pdo->query($sql);
$item = $statement->fetch(PDO::FETCH_ASSOC);
var_dump($item);

Roop の場合

$sql = "SELECT * FROM `tb_hogehoge`";
foreach($pdo->query($sql) as $item) {
	var_dump($item);
}

↓php7 から使えなくなる。

$db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD);
// mysql_query("SET NAMES utf8");
mysql_set_charset('utf8');
mysql_select_db(DB_NAME, $db);
$sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '$_GET[category_id]'";
$rs1 = mysql_query($sql1,$db);
$item1 = mysql_fetch_assoc($rs1);

MySQL 複数テーブルを結合して検索する

複数のテーブルを結合して、一つのテーブルのように見立てて、WHEREできる。

tb_menber
menber_id name birthday address

tb_profile
tall blood hobby

SELECT * FROM `tb_member` INNER JOIN `tb_profile`

すると
menber_id name birthday address tall blood hobby
に対して WHERE文が使える

AUTO_INCREMENTの値を更新する

AUTO_INCREMENTの値として代入する数値は「’」コロンで囲まない。

$sql = "ALTER TABLE `dtb_products_class_product_class_id_seq` AUTO_INCREMENT = 777";

ついでに
EC-CUBE のあるバージョンで発生した事例。

CSVによる商品登録のさい
dtb_products_class_product_class_id_seq や dtb_products_product_id_seq において
・AUTO_INCREMENT を更新する
・sequence を更新する
両方更新しないと管理画面からの商品登録でエラーになる。

phpMyadminにログインできない

 

ユーザー名やパスワードが間違っていない。
config.inc.php が間違っていない。
 

ログインがエラーにならないのに
ログイン画面に戻ってしまう。
ブラウザによっては「アクセスが拒否されました」と表示される。
 

つまり、パスワード云々ではなく、拒否される
権限が無いのね。
 

試しに
phpMyadmin/setup にアクセスしてみる。
↓こんなエラーだ
session_start(*************): open failed: Permission denied (13)
セッションが書き込めないのね、ということで
 

/var/lib/php/session のパーミッションを確認する

[root@hogehoge php]# ls -l
drwxrwx— 2 apache apache session

 

apache からの書き込みがOKでも動かない
動いているサーバーの設定を見てみると
webユーザーにも許可が出ている。
 

webユーザーも読み書きできるようにパーミッションを変えたら
phpMyadmin が無事に動きました。

EC-CUBEやWordpressは動いていたので、session_save_path を疑いませんでしたが
彼らは session_save_path を指定して権限を付与している。
phpMyadmin はデフォルトのsession_save_path を使っている。
session_save_path を指定して、権限を付与するのもOKってことですね。

データベースのメンテナンス

データベースのオーバーヘッドは、INSERT、DELETE、UPDATEを行っているうちにできるゴミ(未使用)領域のようなものです。

これを解消するためには、テーブルの最適化が必要です。

phpMyAdminからDB表示、画面一番下の「オーバーヘッドのあるテーブルを確認」→チェックが入る→ドロップダウンリストから「テーブルを最適化する」、で実行できます。

MySQLの条件ソートで大文字小文字が区別されない

WHEREで大文字小文字が区別されないなんて迷惑な機能があります。
大文字小文字を区別するには条件式の前に”INARY”を付加するといいらしい。

SELECT * FROM `dtb_coupon` WHERE BINARY `coupon_code` = ‘$_POST[use_coupon]’ AND `del_flg` = ‘0’

AUTO_INCREMENTの値をリセットする方法

EC-CUBEなどで、カテゴリIDや商品IDを指定したいということもあるようです。
AUTO_INCREMENT(自動採番)を採用しているのは、指定する必要性が考えられないからです。
番号を指定したいというご要望も多いですね。
理由は聞かないことにしています。
辻褄の合う理由など存在しないのですから、聞いて腹だ立つのなら、聞かずに対応してしまいましょう。

操作は至って簡単!

ALTER TABLE &lt;テーブル名&gt; AUTO_INCREMENT = 1;

関連テーブルのIDの変更もお忘れなく…

フィールド名とフォーム名の自動化

フィールド名を勝手に抽出し、
POSTがあれば、POSTを優先
無ければDBを優先
これを勝手に行うソースコード

この記事に出会ったあなたはラッキーです。

// テーブル抽出(1レコードのみ)
$sql = "SELECT * FROM `TABLE_NAME`";
$rs = mysql_query($sql,$db);
$item = mysql_fetch_assoc($rs);

// Key を配列化
$key_arr = array();
foreach($item as $key => $val){
    // echo $key."=>".$val."&lt;br&gt;"; // 試験表示
    array_push($key_arr, $key);
}

// POST があれば変数に代入、無ければテーブルから変数に代入
$i="0";
while($key_arr[$i]!=""){
    $value=$key_arr[$i];
    
    // POST があれば変数に代入
    if(($_POST[$value]!="") && ($_POST[$value]!="NULL")){
        $$value=$_POST[$value];
    
    // 無ければテーブルから変数に代入
    }else{
        $$value=$item[$value];
    }
    
    $i ++;
}

Perl で Mysql

ひとつはPPMにCPANを登録する事。
メニューの「Edit」→「Reference」→「Repositories」にて「Name」は適当に、「Location」に「http://cpan.uwinnipeg.ca/PPMPackages/10xx/」と入力して「Add」ボタンをクリックして登録。
これでCPANに接続しする事ができ、CPANからもモジュールをダウンロードする事ができる。

ふたつ目はコマンドプロンプトから「perl -MCPAN -e shell」と入力。
これはCPANとコマンドで対話する事ができるシェルコマンド。
「cpan>」の後に「install DBD::mysql」と入力してモジュールをダウンロード&インストールするのだ。

レコードの検索

////////////////
// 比較演算子 //
////////////////

where フィールド名 = ‘値’ レコードが値と等しい場合
where フィールド名 <> ‘値’ レコードが値と等しくない場合
where フィールド名 > ‘値’ レコードが値よりも大きい場合
where フィールド名 >= ‘値’ レコードが値以上である場合
where フィールド名 < '値' レコードが値より小さい場合 where フィールド名 <= '値' レコードが値以下である場合 //////////////////// // その他の演算子 // //////////////////// where フィールド名 between '値1' and '値2' レコードが値1と値2の間である場合値1と値2も含む where フィールド名 in ('値1', '値2'...) レコードがいずれかの値である場合複数の値を指定できる where フィールド名 is null レコードがnull値である場合 where フィールド名 is not null レコードがnull値でない場合 where フィールド名 like '値%' 値から始まるレコードを検索前方一致 where フィールド名 like '%値%' 値を含むレコードを検索中間一致 where フィールド名 like '%値' 値で終わるレコードを検索後方一致 //////////////// // 論理演算子 // //////////////// where 条件1 and 条件2 条件1でありかつまた条件2である場合(論理積) where 条件1 or 条件2 条件1あるいは条件2である場合(論理和) where not (条件) 条件でない場合(論理否定)

郵便番号を住所変換する

DBは郵便サイトからダウンロード
http://www.post.japanpost.jp/zipcode/dl/kogaki.html

SQL文(1)
テーブル生成

CREATE TABLE mtb_zipcode (
jis varchar(10) NULL,
zip_old varchar(5) NULL,
zip varchar(7) NULL,
addr1_kana varchar(100) NULL,
addr2_kana varchar(100) NULL,
addr3_kana varchar(100) NULL,
addr1 varchar(100) NULL,
addr2 varchar(100) NULL,
addr3 varchar(100) NULL,
c1 int NULL,
c2 int NULL,
c3 int NULL,
c4 int NULL,
c5 int NULL,
c6 int NULL
)

SQL文(2)
データ挿入
vscファイルのエンコードを調整しておく

LOAD DATA LOCAL INFILE '/home/_DATABASE_BACKUP/KEN_ALL_UTF8.csv'
INTO TABLE `tb_zip_code`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'