MTへのDB接続


// MT設定読み込み
$line = '';
$line = file("../app/mt/mt-config.cgi");
$i = 0;
while($line[$i]!=""){
	// マッチしたら変数化
	if (preg_match("/Database/",$line[$i])) {
		$DB_NAME = explode(' ', $line[$i]);
		$DB_NAME = trim($DB_NAME[1]);
	}
	if (preg_match("/DBUser/",$line[$i])) {
		$DB_USER = explode(' ', $line[$i]);
		$DB_USER = trim($DB_USER[1]);
	}
	if (preg_match("/DBPassword/",$line[$i])) {
		$DB_PASSWORD = explode(' ', $line[$i]);
		$DB_PASSWORD = trim($DB_PASSWORD[1]);
	}
	if (preg_match("/DBHost/",$line[$i])) {
		$DB_SERVER = explode(' ', $line[$i]);
		$DB_SERVER = trim($DB_SERVER[1]);
	}
	$i ++;
}
 //------------------------------------------------------
// MT_DBに接続開始
	$db = mysql_connect($DB_SERVER,$DB_USER,$DB_PASSWORD);
	mysql_query("SET NAMES utf8");
	// DB指定(確認用)
	if(!mysql_select_db($DB_NAME, $db)){
		 echo "<div style=\"color:red;\">\nメインデータベースに接続できません。</div>\n";
	}elseif(mysql_select_db($DB_NAME, $db)){
		 // echo "<div style=\"color:green;\">\nDB指定OK!(".$DB_NAME.")</div>\n\n\n";
	}
 // EOF/MT_DBに接続開始
//------------------------------------------------------

MTサイトマップ

  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" style="color:red; width:1000px;display:block;">
  <url>
  <loc><$MTBlogURL encode_xml="1"$></loc>
  <lastmod><$MTDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>

  <changefreq>daily</changefreq>
  </url>
  
  <MTIfArchiveTypeEnabled archive_type="Individual"> 
  <MTEntries lastn="9999">
  <url>

  <loc><$MTEntryPermalink encode_xml="1"$></loc>
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  <priority>1.0</priority>

  </url>
  </MTEntries>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Monthly"> 
  <MTArchiveList archive_type="Monthly">
  <url>

  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>

  </MTEntries>
  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Weekly"> 
  <MTArchiveList archive_type="Weekly">

  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">

  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>
  </url>
  </MTArchiveList>

  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Daily"> 
  <MTArchiveList archive_type="Daily">
  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>

  <MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>

  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Author"> 
  <MTArchiveList archive_type="Author">
  <url>

  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>

  </MTEntries>
  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Author-Daily"> 
  <MTArchiveList archive_type="Author-Daily">

  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">

  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>
  </url>
  </MTArchiveList>

  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Author-Weekly"> 
  <MTArchiveList archive_type="Author-Weekly">
  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>

  <MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>

  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Author-Monthly"> 
  <MTArchiveList archive_type="Author-Monthly">
  <
url>

  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <
MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>

  </MTEntries>
  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Author-Yearly"> 
  <MTArchiveList archive_type="Author-Yearly">

  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">

  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>
  </url>
  </MTArchiveList>

  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Category"> 
  <MTArchiveList archive_type="Category">
  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>

  <MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>

  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Category-Daily"> 
  <MTArchiveList archive_type="Category-Daily">
  <url>

  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>

  </MTEntries>
  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Category-Weekly"> 
  <MTArchiveList archive_type="Category-Weekly">

  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">

  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>
  </url>
  </MTArchiveList>

  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Category-Monthly"> 
  <MTArchiveList archive_type="Category-Monthly">
  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>

  <MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>

  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Category-Yearly"> 
  <MTArchiveList archive_type="Category-Yearly">
  <url>

  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">
  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>

  </MTEntries>
  </url>
  </MTArchiveList>
  </MTIfArchiveTypeEnabled>
  
  <MTIfArchiveTypeEnabled archive_type="Page"> 
  <MTArchiveList archive_type="Page">

  <url>
  <loc><$MTArchiveLink encode_xml="1"$></loc>
  <MTEntries lastn="1" sort_by="modified_on">

  <lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
  </MTEntries>
  </url>
  </MTArchiveList>

  </MTIfArchiveTypeEnabled>
  
</urlset>

EC-CUBEのデザイン管理で、勝手にエスケープされる

EC-CUBEを地価鯖(チカッパサーバー)で運用していると、

管理画面から編集したときに「”」が勝手にエスケープされてしまう。

「”」→「¥”」

対応策

magic_quotes_gpc が ON ならば OFF にする。

対応策というより「常識」です。

チカッパでは、”,htaccess” に “php_flag magic_quotes_gpc 0” と書いても効きません。
コントロールパネル → php.ini設定
で設定します。

カテゴリLevrl1 ならリンクしない、それ以外はリンクする

<!-- カテゴリLevrl1 ならリンクしない、それ以外はリンクする -->
<!--{php}-->$hoge = ($this->get_template_vars('level')); if($hoge == 1){<!--{/php}-->
    <!--{$arrTree&#91;cnt&#93;.category_name|escape}-->
<!--{php}-->}else{<!--{/php}-->
    <a href="<!--{$smarty.const.URL_DIR}-->products/list.php?category_id=<!--{$arrTree&#91;cnt&#93;.category_id}-->"<!--{if in_array($arrTree&#91;cnt&#93;.category_id, $tpl_category_id) }--> class="onlink"<!--{/if}-->>
        <!--{$arrTree&#91;cnt&#93;.category_name|escape}-->
    </a>
<!--{php}-->}<!--{/php}-->

新規投稿・編集のテキストエリアのサイズ調整

私の場合、該当ファイル本体をいじっているが、こんなところで調整できるらしい?
Wordpressの記事を書くボックスが狭いのはなぜだろう?
疑問だが、どうせ別なエディタで編集してペーストだから、頬って置いたが、こんな機能があったことは知らなかった。
こういうのって、素人さんのほうがしているのかもしれない。
少々恥ずかしい発見でした。

wpman_20091220

サイトマップ生成プラグイン

WordPressでサイトマップ自動生成プラグイン

Dagon Designのがよさそうなので Download

プラグインを有効にしたら、サイトマップ用に固定ページをつくって一行書くだけ!

&lt;!-- ddsitmapgen --&gt;

※ハイフンとddsitmapgenの間にスペースがないと動作しないようだ。
ddsitmapgen
 
 

もう少々高度なことをしたい場合、

テーマディレクトリに”sitmap.php”を作る。
内容は下記のように記述する。

&lt;?php
/*
Template Name: SITEMAP
*/
?&gt;

&lt;?php get_header();?&gt;

&lt;div id="sitemap"&gt; 
    &lt;?php echo ddsg_create_sitemap(); ?&gt;
&lt;/div&gt;

&lt;?php get_footer(); ?&gt;

固定ページをつくる。

タイトル"サイトマップ"
パーマリンク"https://mint123.tokyo/technology/sitmap"

本文は空でよい。
ページのテンプレートに ‘SITEMAP” を選択する。
ddsitmapge2

あとは、テンプレートでお好きなようにどうぞ!!

・・・カスタマイズしないとイマイチなプラグインかもしれないことに気付いてしまった。

オープンソースなのだから、汎用性を言うことを考えれば、この程度の(作りこんでいない)ベースになるものがいいのかもしれない。

記事IDから親カテゴリ情報抽出

wordpress のDB構成というのはとても洗練された無駄の無いものです。
その反面、記事IDからカテゴリを抽出しようとすると、3重の逆ループをかけなければなりません。
3重逆ループってどこかで聞いたような…ルービックキューブの公式を見出すことと同じです。
覚えるとか慣れるということではなく、出すことと同じ難易度ということになります。
これができると一人前の数学者かもしれません。

&lt;?php

    // MySQLに接続 ------------------

    $sql="SELECT * FROM `tech_posts` WHERE `post_status` = 'publish' ORDER BY `ID` DESC";
    $hack .= '&lt;br&gt;'.$sql.'&lt;br&gt;';
    $rs = mysql_query($sql,$db);
    $i = 0;
    while($item = mysql_fetch_assoc($rs)){
        $hack .= '■'.$item[ID].'■';
        if($i &lt;= 9){
            
            // カテゴリID抽出
            $sql2="SELECT * FROM `tech_term_relationships` WHERE `object_id` = '$item[ID]'"; // post_id がマッチしたら
            $rs2 = mysql_query($sql2,$db);
            
            $item2 = mysql_fetch_assoc($rs2);
            if( ($item2[term_taxonomy_id] &gt;= "2") && ($item2[term_taxonomy_id] &lt;= "8") ){
                
                $sql3="SELECT * FROM `tech_term_relationships` WHERE `object_id` = '$item[ID]'";
                $rs3 = mysql_query($sql3,$db);
                $item3 = mysql_fetch_assoc($rs3);
                
                // カテゴリID整形
                    $idid1 = '00'.$item3[term_taxonomy_id].'-';

ソースコード全文はこちら

新規に作成したページのエラー

下記のようなエラーを吐いて何も表示されない。

Warning: Unknown: SAFE MODE Restriction in effect. The script whose gid is 1000 is not allowed to access /virtual/ドメイン名/public_html/xxxx/user_data/guide.php owned by uid 1000 in Unknown on line 0

Warning: Unknown: SAFE MODE Restriction in effect. The script whose uid is 1000 is not allowed to access /virtual/ドメイン名/public_html/xxxx/user_data/guide.php owned by uid 1000 in Unknown on line 0

Warning: Unknown: failed to open stream: Success in Unknown on line 0

Fatal error: Unknown: Failed opening required '/virtual/ドメイン名/public_html/xxxx/user_data/guide.php' (include_path='.:/usr/local/lib/php') in Unknown on line 0

user_dataのパーミッションは777
user_data内のphpファイルの権利者がapacheになっています。
これを、他のファイルと同じように変更すると回避できる。

「サイトを開く」のリンクを新しいタブで開くようにする。

wp_man20091204a

[File] wp-admin/admin-header.php
[Line] 104

&lt;a href="&lt;?php echo trailingslashit( get_bloginfo('url') ); ?&gt;" target="_blank" title="&lt;?php _e('Visit site') ?&gt;"&gt;&lt;/

なんだこんなこと?と馬鹿にしないでください。
2クリックか?1クリックか?
作業は倍か半分かというとても大きな違いです。
コレラが積み重なると大きなボトルネックなになります。

気がつくたびに、小さなことでもクリアしていかないと、最速の開発はできません。

子カテゴリーを表示する

tpl_subtitleに親カテゴリー+子カテゴリーを表示する

[修正ファイル EC-CUBE2系]

data/class/pages/products/LC_Page_Products_List.php

[修正前]

$arrFirstCat = $objDb->sfGetFirstCat($arrCategory_id[0]);
$tpl_subtitle = $arrFirstCat['name'];

[修正後]

$tpl_subtitle = $objDb->sfGetCatCombName($arrCategory_id[0]);

とすることで、親カテゴリー+子カテゴリーも表示する事が出来ます。

EC-CUBEのデータベースの文字化け

管理画面では化けないが、データベースをのぞくと化けてしまう。
これがEC-CUBEの仕様のようです。

そこで回避策ですが…
サーバー環境により異なりますので、一例としてご覧ください。

  1. 普通にインストール
  2. データベースのテーブルを全て削除
  3. お決まりの「UTF-8化おまじない」を行う
  4. 再度eccubeインストール

たったこれだけで、EC-CUBEが快適に利用できます。

データベースでも化けていないので、
メンテナンスも、サーバー移転も心配がありません。

オープンソースとは、完全でないからオープンソースです。
完璧にするのは利用者自身に委ねられています。

皆さんも挑戦してね!

商品をカートに入れる処理

商品を買い物カゴに入れる処理

// 新カートID
$new_no = カート内の番号;// product_id
$_SESSION[cart][$new_no][id][0] = (string)$product_id;

// 規格1
$_SESSION[cart][$new_no][id][1] = (string)$stsize;

// 規格2、指定がない場合は「0」
$_SESSION[cart][$new_no][id][2] = (string)0;

// 数
$_SESSION[cart][$new_no][quantity] = 1;

// カート番号
$_SESSION[cart][$new_no][cart_no] = カート内の番号;

// 価格
$_SESSION[cart][$new_no][price] = $price02;

// ポイントレート
$_SESSION[cart][$new_no][point_rate] = $point_rate;


このようにしてセッションに登録すれば、カートに入ったことになる。
しかし、注視すべき点が一つある。
(string)のようにするのが重要!
配列の型が適切でないと、決済の最後の処理で、「申し訳ございませんが、ご購入の直前で売り切れた商品があります。この手続きは無効となりました」としかられてしまう。

もとファイルを変更するなら
/data/class/SC_CartSession.php

WordPress の バックアップ

WordPress Database Backup というプラグインがある。

ダウンロードサイトは、http://www.ilfilosofo.com/blog/wp-db-backup

これは、とても素晴らしい!

他のプラグインは、あっても困らないが、無くても困らないものばかり。

これは、一度使ったら、手放せない。

30分もあれば作れる簡単なプラグインだが、配布してくれるのがうれしい。

いや、違う、まともなプラグインを作る輩が存在することが嬉しい!

サーバー内にバックアップしたところで、サーバがとまればそれまで、

主導でダウンロードしようものなら、そのうちに飽きてしまう。

しかし、設定しだいでは、毎日、バックアップしメールで送ってくれるしカラクリのようだ。

望むならば、1時間毎にも設定できる。

まあ、普通は1週間が妥当かもしれない。

自分の場合は、1日一回にした。

2日分もデータが飛んだら、大きな損失になる。

1時間に一回は多いような気がするので、

昼間、仕事をしている時間帯、つまりデータが次々と更新される時間帯に限り、

2時間に一回、バックアップをメールで送信にカスタマイズしようとも考えている。

…目視確認、DBに再インポートできるか確認、というのも、わずらわしいので、

受信して、DB検証をしてくれる、サーバーでも作ろうか。。。?

「最新の投稿」のMAXを変える

wp-includes/default-widgets.php
542行目付近

if ( !$number = (int) $instance['number'] )
$number = 10;
else if ( $number &lt; 1 )
$number = 1;
else if ( $number &gt; <strong>15</strong> )
$number = <strong>15</strong>;

同ファイル内に15という数値が沢山あるので、一括置換してしまおう!
バージョンによっては、1っ箇所の場合もある、その辺は、自分でソースコードをきちんと読んでから変更してください。
※ ソースコードを理解しないまま、見たり聞いたりした情報だけで作業を行うことは、とても危険です。

joomla!その2

インストールでphpの設定が違うと怒る

.htaccrss で設定すれば良いのは分かるが、

こう少し、サーバー側の設定に依存しない書き方をしなければ、オープンソースとしては、生き残れないだろう。

joomla!はユーザ登録できない仕様です。

Joomla! 1.0.15JP Stable での不具合

管理画面からのユーザー登録はOK

フロント画面からのユーザー登録は登録ボタンを押しても何も変化がない。

エラーにもならない。

ページも変わらない。

登録そのものが行われない。

こんなオープンソースなぜ配布しているのか?

/components/com_registration/registration.html.php の64行目を修正する。

このようにかかれていますが、明らかな構文違いです。

} else if (r.exec(form.username.value) || form.username.value.length &lt; 3) || mb.exec(form.username.value)) {

カッコだけにしてみると

} else if ( () || <span style="color: #ff0000;">)</span> || ()) {

明らかに閉じカッコが多い

下記のように修正すれば動きます。

} else if (r.exec(form.username.value) || form.username.value.length &lt; 3 || mb.exec(form.username.value)) {

Joomla!って結構面白そうだし、見た目はとてもよくできている。

しかし、このような致命的なバグを放置したりするから、人気が出ないのかもしれない。

少々直して動いたが、それ以上使う気にはなれない。

少なくなった在庫をメールで知らせてくれる機能

/html/shopping/complete.php (/data/class/pages/shopping/LC_Page_Shopping_Complete.php)

// 在庫を減らす処理
function lfReduceStock($objQuery, $arrID, $quantity) {
    $where = "product_id = ? AND classcategory_id1 = ? AND classcategory_id2 = ?";
    $arrRet = $objQuery->select("stock, stock_unlimited", "dtb_products_class", $where, $arrID);
    
    // 売り切れエラー
    if(($arrRet[0]['stock_unlimited'] != '1' && $arrRet[0]['stock'] < $quantity) || $quantity == 0) {
        $objQuery->rollback();
        sfDispSiteError(SOLD_OUT, "", true);
    // 無制限の場合、在庫はNULL
    } elseif($arrRet[0]['stock_unlimited'] == '1') {
        $sqlval['stock'] = null;
        $objQuery->update("dtb_products_class", $sqlval, $where, $arrID);
    // 在庫を減らす
    } else {
        $sqlval['stock'] = ($arrRet[0]['stock'] - $quantity);
        if($sqlval['stock'] == "") {
            $sqlval['stock'] = '0';
        }        
        $objQuery->update("dtb_products_class", $sqlval, $where, $arrID);
    }
    
<div style="color:tomato;">
// 在庫数が0の場合はNULL
    if( ($sqlval['stock'] <= 5) && ($arrRet&#91;0&#93;&#91;'stock_unlimited'&#93; != '1') ){
        // メール送信先
        $stock_mail = "zaiko@domain.com";
        // 件名
        $stock_sub = "商品在庫が少なくなりました。";
        // メッセージ
        $stock_msg = "商品ID:".$arrID&#91;0&#93;."(".$arrID&#91;1&#93;.",".$arrID&#91;2&#93;.")"."の商品が少なくなりました。";
        // メールを送信します。
        mb_send_mail($stock_mail, $stock_sub, $stock_msg);
    }
</div>
}

EC-CUBEのログインチェック(裏技)

カスタマイズによる追加管理画面を別窓で開く場合、SESSIONを引っ張ってきてログインチェックをするのが正しい方法だが、
これでもいいじゃないか?
『「/admin/」からのリンクアクセスのみ許可する』方法でも、セキュリティ的には、変わらない。
しかもソースコードは短くなるので、重宝しています。

 //------------------------------------------------------
// LOGIN_CHECK
    if (preg_match("/admin/", $_SERVER[HTTP_REFERER])){
        
    }else{
        echo "&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /&gt;&lt;body&gt;&lt;div style=\"color:red;\"&gt;\n不正なアクセスです。&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;\n";
        exit();
    }
 // EOF &gt;&gt; LOGIN_CHECK
//------------------------------------------------------

変数の表示

「POST, GET, SESSION, SERVER」などの変数を表示する。

echo '&lt;pre&gt;&lt;h3&gt;_GET&lt;/h3&gt;';
var_dump($_GET);
echo '&lt;h3&gt;_POST&lt;/h3&gt;';
var_dump($_POST);
echo '&lt;h3&gt;_SESSION&lt;/h3&gt;';
var_dump($_SESSION);
echo '&lt;h3&gt;_SERVER&lt;/h3&gt;';
var_dump($_SERVER);

 
 

書いたり、消したりがめんどうなので、こんな感じです。
EC-CUBEの場合

&lt;!--{php}--&gt;
if($_GET[hack] != ""){
    $_SESSION[hack] = 1;
}
if($_SESSION[hack] == 1){
    echo '&lt;pre style="text-align:left;"&gt;&lt;h3&gt;_GET&lt;/h3&gt;';
    var_dump($_GET);
    echo '&lt;h3&gt;_POST&lt;/h3&gt;';
    var_dump($_POST);
    echo '&lt;h3&gt;_SESSION&lt;/h3&gt;';
    var_dump($_SESSION);
    echo '&lt;h3&gt;_SERVER&lt;/h3&gt;';
    var_dump($_SERVER);
    echo '&lt;/pre&gt;';
}
&lt;!--{/php}--&gt;

ECCUBEの文字化け

サーバ移転や、試験環境などの構築で、文字化けが発生することがしばしばある。
データベース接続まわりを除いてみると、大切な記述が欠けている。

ファイル名: /data/class/SC_DbConn.php
65行付近

$this->conn = $objDbConn;
$this->conn->query("SET NAMES utf8");
$this->error_mail_to = DB_ERROR_MAIL_TO;
$this->error_mail_title = DB_ERROR_MAIL_SUBJECT;
$this->err_disp = $err_disp;
$this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
$this->conn->query("SET NAMES utf8");

を追記すれば解決する。

※ この作業を行うタイミングが重要です。
インストールのどのタイミングで行うか、DB接続直後です。

注意
エンコード関連を変更した後は、キャッシュファイルのクリアを忘れるべからず。

解説
php.ini のエンコード関係は、あまり指定しないのがサーバー屋の流儀である。
その場合、データベースの読み書きは、サーバーのデフォルト・エンコードで行われる。

サーバーのエンコードは、
最近は、UTF-8が多くなってきたが、以前はEUCが主流だった。

DBのエンコードとPHPファイルのエンコードが同じであっても、文字化けが発生する場合は、サーバーのデフォルトエンコードを疑うのが基本である。

データベース汎用化モジュール

データベースを汎用化的概念で操作することに成功しました。

メリットは、ブログなどの小規模開発から、業務管理システムやECサイトなどの中規模開発程度まであってもあれば、データベース設計が不要になります。

また、開発の大半を占めるデータベースの

  • 読み込み
  • 登録
  • 更新
  • ソート抽出

の開発が半自動化されます。

デメリットは回避できる設計を施してありますので、フレームワークなどのように動作が 重くなることはございません。

EC-CUBE ヴァージョン 2.3.4 のClass名が変

EC-CUBE ヴァージョン 2.3.4
同じバージョンでありながら、試験環境の最新のものと実稼動サーバーの仕様が違う。
w(°o°)w おおっ!!

レイアウトも全く同じになのに表示が大きく乱れる。

管理画面から編集できるソースではない場所に書かれているクラス名が違うのには驚いた。
統一性とか、管理体制に劣ることがまた立証されてしまった。
オープンソースだから仕方ない。

言い換えれば、「EC-CUBE Myバージョン」の完成度が上がっていくだけのことだ。

EC-CUBEでRSSの日時を反映させる

EC-CUBEのRSSでは、日付けと日時が反映されないバグがあります。
バグというよりは、製作途中のようなソースコードなのですが、この機会に機能させてみましょう。

[対象ファイル1]
data/class/pages/rss/LC_Page_Rss.php

71行目付近の
「$this->timestamp = SC_Utils…」を削除します。

lfGetNewsという関数を丸ごと書き換えます。

[対象ファイル2]
data/Smarty/templates/default/rss/index.tpl

49行目あたりの「<!–{* <pubDate><!–{“r”|sf_mktime:$arrNews[cnt…」を削除
50行目あたりの「 <pubDate><!–{$arrNews[cnt].news_date|escape}–></pubDate>」を変更します。

詳細なソースコードの全文はこちらです。

EC-CUBEでIEでSSLのエラー

EC-CUBEでIEでSSL接続した場合、どのページに飛んでもセキュリティ情報のアラームが毎回表示される場合の修正方法です。
「このページにはセキュリティで保護されている項目と保護されていない項目が含まれています。 保護されていない項目を表示しますか?」

次のページはSSL(https)なのに、http://○×□▽… というように、http:// でファイルや画像を読み込んでいませんか?

WordPressで日付に曜日を表示する

$kizi_id =  $post-&gt;ID;
// echo $kizi_id.'&lt;br&gt;';
// Config読込み
include $_SERVER[DOCUMENT_ROOT]."/wp-config.php";// MySQLに接続 ------------------
$db = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
//mysql_query("SET NAMES utf8″);
// DB指定(確認用)
if(!mysql_select_db(DB_NAME, $db)){
    // echo '&lt;div style="color:red;"&gt;メインデータベースに接続できません。&lt;/div&gt;';
}elseif(mysql_select_db(DB_NAME, $db)){
    // echo '&lt;div style="color:green;"&gt;DB指定OK!('.DB_NAME.')&lt;/div&gt;';
}
// &lt; EOF &gt; MySQLに接続 ------------------

$sql="SELECT * FROM `tech_posts` WHERE `ID` = '$kizi_id'";
$rs = mysql_query($sql,$db);
$item = mysql_fetch_assoc($rs);
// var_dump($item);
$date = $item[post_date];
list($date, $gomi) = explode(' ', $date);
// echo $date.'&lt;br&gt;';
list($year, $month, $mday) = explode('-', $date);
// echo $yy.'=='.$mm.'=='.$mday.'&lt;br&gt;';

//日付から曜日を判定する関数
function date2wday($year, $month, $mday) {
if($month == 1 || $month == 2) {
    $year--;
    $month += 12;
}
$wday = ($year + intval($year/4) - intval($year/100) + intval($year/400) +
                intval((13*$month+8)/5) + $mday) % 7;
    return $wday;
}
$wday = date2wday($year, $month, $mday);

$arr_wday = array("日", "月", "火", "水", "木", "金", "土");
$str_wday2 = $arr_wday[$wday];

$str_wday2 = $str_wday2 . "曜日";

// echo $str_wday2;

↑こういうことをしなくても、↓これでできる。

&lt;?php the_date("Y年 n月 j日 l"); ?&gt;

カスタムフィールドを抽出して条件分岐

カスタムフィールドの値により様々なアイコンを表示する。
コンナ感じかな?

<?php
    // echo post_custom('施工実績(ジャンル)');
    $hoge = post_custom('施工実績(ジャンル)');
    // echo $hoge;
    if($hoge == '新築'){
        $echoimg = 'icon_mini_new.png';
    }elseif($hoge == 'リフォーム'){
        $echoimg = 'icon_mini_rehome.png';
    }elseif($hoge == '外構・ミニハウス'){
        $echoimg = 'icon_mini_gaikou.png';
    }elseif($hoge == '店舗'){
        $echoimg = 'icon_mini_shop.png';
    }
?>
<img src="<?php bloginfo('template_directory'); ?>/images/<?php echo $echoimg; ?>">