Ajax Load More(Repeater Templates)

URLをカスタムフィールドとして取り出す場合の例
2行名のURL部分がカスタムフィールドのケース

<li class="load_more_box">
  <a href="<?php $hoge = get_post_meta(get_the_ID(),'url',true); echo $hoge;?>" target="_brank">
   <h3 class="load_more_img"><?php if ( has_post_thumbnail() ) { the_post_thumbnail('large'); }?></h3>
   <h4><?php the_title(); ?></h4>
</a>
</li>
<li class="load_more_box">
<?php $hoge = get_post_meta(get_the_ID(),'url',true); if($hoge != ''){ echo '<a href="'.$hoge.'" target="_brank">'; } ?>
   <h3 class="load_more_img"><?php if ( has_post_thumbnail() ) { the_post_thumbnail('large'); }?></h3>
   <h4><?php the_title(); ?></h4>
<?php $hoge = get_post_meta(get_the_ID(),'url',true); if($hoge != ''){ echo '</a>'; } ?>
</li>

「CSSの変更が反映されない」の予防策

通常であれば「右クリック→ソースの表示→CSSリンクをクリックして再読み込み」
web制作中に何度もやらなければならないのはうっとうしい

解決策

<link rel='stylesheet' href='./style.css?t=<?php echo $_SERVER['REQUEST_TIME']; ?>' type='text/css' media='all' />

cssファイル名にGET変数としてUNIX時刻を付加することで、秒単位で別ファイルとして読み込まれるので、変更更新が随時反映される。

WordPressのカテゴリタイトルから「カテゴリー:」を消す

WordPressのカテゴリページやタグページのタイトルには、タイトルの頭に「カテゴリー:」や「タグ:」

functions.php に下記を追記

add_filter( 'get_the_archive_title', function ($title) {
    if ( is_category() ) {
        $title = single_cat_title( '', false );
    } elseif ( is_tag() ) {
        $title = single_tag_title( '', false );
    } elseif ( is_author() ) {
        $title = '' . get_the_author() . '' ;
    }
    return $title;
});

MySQL8 でベースにする文字コードはutf8mb4_unicode_ci

照合順序(COLLATION)とは

照合順序は文字列の比較やソート順のルールのことです。各キャラクタセットごとに照合順序が定義されています。

-- SHOW COLLATIONS で一覧が見れる
mysql> SHOW COLLATIONS;
+----------------------------+----------+-----+---------+----------+---------+---------------+
| Collation                  | Charset  | Id  | Default | Compiled | Sortlen | Pad_attribute |
+----------------------------+----------+-----+---------+----------+---------+---------------+
| armscii8_bin               | armscii8 |  64 |         | Yes      |       1 | PAD SPACE     |
| armscii8_general_ci        | armscii8 |  32 | Yes     | Yes      |       1 | PAD SPACE     |
| ascii_bin                  | ascii    |  65 |         | Yes      |       1 | PAD SPACE     |
| ascii_general_ci           | ascii    |  11 | Yes     | Yes      |       1 | PAD SPACE     |
| big5_bin                   | big5     |  84 |         | Yes      |       1 | PAD SPACE     |
| big5_chinese_ci            | big5     |   1 | Yes     | Yes      |       1 | PAD SPACE     |
| binary                     | binary   |  63 | Yes     | Yes      |       1 | NO PAD        |
<snip>

MySQL 8.0 で、utf8mb4 の照合順序が増えました。以下の表で太字にしたものが、新規に追加されたものです。各文字列が、同一と扱われる場合は、○としています。
ci/csCase [In]sensitive の略で、asAcent SensiteveksKatakana Sensitive の略です。

COLLATION A、a はは、ぱぱ はは、ハハ びょういん、びよういん 🍣、🍺 +、+
utf8mb4_bin × × × × × ×
utf8mb4_0900_bin × × × × × ×
utf8mb4_unicode_ci
utf8mb4_general_ci × × × ×
utf8mb4_unicode_520_ci ×
utf8mb4_0900_ai_ci ×
utf8mb4_0900_as_ci × ×
utf8mb4_ja_0900_as_cs × × × ×
utf8mb4_ja_0900_as_cs_ks × × × × ×

アルファベットの大文字・小文字を区別しない要件で、どれが選ばれそうか・・・
utf8mb4_0900_as_ci は「びょういん」「びよういん」が同一と扱われてしまい、いまいちに感じます。

そもそも、日本語の文字列比較やソート結果を網羅的に精査するのは現実的に可能なんでしょうか(上記の表以外にも考えないといけない、パターンがありそうです)。日本語には異字体・長音記号・漢数字・・・ちょっと思いつくだけでも、扱いに悩みそうな要素が多くあります。

絵文字が区別できないとは言え、utf8mb4_general_ci にはずっと使ってきた実績と安心があります。
MySQL 8.0 でも utf8mb4_general_ci を 引き続き使うケースが多いのではないでしょうか。

MySQL 8.0 で utf8mb4_general_ci を使うときの注意点

ALTER TABLE CONVERT TO 時に COLLATION の指定が必要

MySQL 8.0 で utf8mb4 のデフォルトの照合順序が utf8mb4_general_ci から utf8mb4_0900_as_ci に変更になりました。

あわせて、従来の3バイトUTF8、utf8(mb3) は deprecated になっています。
utf8mb4 に変換するときに COLLATE を明示的に指定しないと、utf8_general_ci から utf8mb4_0900_ai_ci へとテーブルのデフォルト照合順序になってしまいます。

mysql> SELECT * FROM utf8t WHERE c1 = "ぱぱ";
Empty set (0.00 sec)

mysql> ALTER TABLE utf8t CONVERT TO CHARACTER SET 'utf8mb4';
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

-- 「ぱぱ」で「はは」がヒットしてしまう
mysql> SELECT * FROM utf8t WHERE c1 = "ぱぱ";
+----+--------+
| pk | c1     |
+----+--------+
|  1 | はは   |
+----+--------+
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE utf8t \G
*************************** 1. row ***************************
       Table: utf8t
Create Table: CREATE TABLE `utf8t` (
  `pk` bigint unsigned NOT NULL AUTO_INCREMENT,
  `c1` varchar(255) DEFAULT NULL,
  UNIQUE KEY `pk` (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

このように、COLLATE を指定してALTERする必要があります。

mysql> ALTER TABLE utf8t CONVERT TO CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>  SHOW CREATE TABLE utf8t \G
*************************** 1. row ***************************
       Table: utf8t
Create Table: CREATE TABLE `utf8t` (
  `pk` bigint unsigned NOT NULL AUTO_INCREMENT,
  `c1` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  UNIQUE KEY `pk` (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)

SET NAMES では COLLATE の指定が必要

同様に、SET NAMES で照合順序を明示的に指定していない場合、MySQL 8.0 からは utf8mb4_0900_as_ci が使われてしまいます。

# MySQL 8.0 以降は utf8mb4_0900_as_ci が使われる
mysql> SET NAMES utf8mb4;

# MySQL 8.0 以降は 明示的に utf8mb4_general_ci を指定する必要がある。
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;

Basic認証用からログアウトする方法

Basic認証用でログイン中のURLで、ファイル名だけを存在しないURLにしてアクセスする
「Unauthorized」が表示されログアウト成功!
.htaccess は下記のように書く

AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /home/www/.htpasswd
require valid-user
<IfModule mod_headers.c>
	<IfModule mod_rewrite.c>
		<Files logout.php>
			RewriteEngine on
			RewriteRule '' '' [R=401,L]
		</Files>
	</IfModule>
</IfModule>

一つ問題がありWordpressの場合は、Wordpressの404が表示されてしまいログアウトできない
ディレクトリを作り、そのディレクトリ配下の存在しないファイルにアクセスすることでログアウトできる。

wordpress の URL関連変数

1.URLの記載方法(HTML、リンク)
Wordpressの場合 手打ちの固定URLではなく、Wordpress変数で書くことが基本
誤り例)	https://okusuri24.net/login/
正解例)	<?php echo site_url(); ?>/login/
(Wordpressテンプレートの基礎です)

2.URLの記載方法(HTML、Themeディレクトリ配下の”ファイル・画像”のURL)

誤り例) https://okusuri24.net/wp-content/themes/hueman-child/image/icn_4arrow.png
正解例) <?php echo get_parent_theme_file_uri(); ?>/image/icn_4arrow.png
(Wordpressテンプレートの基礎です)

3.URLの記載方法(CSS、画像URL)
CSSに記載するURLは、「CSSファイルからの相対Pathで記載する」
誤り例) https://okusuri24.net/wp-content/themes/hueman-child/image/icn_4arrow.png
正解例) ./image/icn_4arrow.png
(一般CSSの基礎です)

いずれも、とりあえずは動きますが、Wordpressの基本機能を潰す行為になり、後々困るので

Macから受け取った圧縮ファイルが文字化け

Macから受け取った圧縮ファイルが文字化け
以前はMac使いとして、最初に覚えること、できないとパソコン使えないのか? と思われてしまうことでしたが
最近は、文字化けあフィルを送ることが平気な「プロのつもり人間」が多いです

そんなことに、文句を言って、文字化けしないMacの使い方を教えるくらいなら
こちらで対処しようということです

# apt install unar
# unar [ファイル名]

VirtualHost の設定

ubuntu18 の apache2.4 で バーチャルホストの設定例

/etc/apache2/site-acailable/00-deefault.conf に書くとOKらしい

記載例

<VirtualHost *:80>
    ServerName ○○○.localhost
    DocumentRoot /home/hashimoto/www/○○○
</VirtualHost>

※”DocumentRoot” は任意で自分のサーバーに準じてね!

You don’t have permission to access this resource. apache2.conf の書き方

ubuntu18 の apache2.4 で下記のようなエラーが出た場合の対処方法

Forbidden
You don’t have permission to access this resource.

DOCUMENTS_ROOT の設定に問題あり

/etc/apache2/apache2.conf
のDOCUMENTS_ROOT

/etc/apache2/site-acailable/00-deefault.conf
の VirtualHost に ドキュメントルートの内容を書く
↑これって、気付き難いよね!

両方のファイルのを書き換えてから apache の再起動で治った

Unknown collation: ‘utf8mb4_unicode_520_ci’

原因は移行先サーバーのMySQLがMySQL5.5以下であるためです。例えば某Sサーバーなど..。utf8mb4_unicode_520_ciというcollationはMySQL5.6以上でしか利用できません。
現行のWordPressはutf8mb4_unicode_520_ciが使用できるサーバーではutf8mb4_unicode_520_ciを優先的に使用してインストールを行います。charsetとcollationを決定するwp-db.phpのコードは以下のようになっています。

	/**
	 * Determines the best charset and collation to use given a charset and collation.
	 *
	 * For example, when able, utf8mb4 should be used instead of utf8.
	 *
	 * @since 4.6.0
	 * @access public
	 *
	 * @param string $charset The character set to check.
	 * @param string $collate The collation to check.
	 * @return array The most appropriate character set and collation to use.
	 */
	public function determine_charset( $charset, $collate ) {
		if ( ( $this->use_mysqli && ! ( $this->dbh instanceof mysqli ) ) || empty( $this->dbh ) ) {
			return compact( 'charset', 'collate' );
		}

		if ( 'utf8' === $charset && $this->has_cap( 'utf8mb4' ) ) {
			$charset = 'utf8mb4';
		}

		if ( 'utf8mb4' === $charset && ! $this->has_cap( 'utf8mb4' ) ) {
			$charset = 'utf8';
			$collate = str_replace( 'utf8mb4_', 'utf8_', $collate );
		}

		if ( 'utf8mb4' === $charset ) {
			// _general_ is outdated, so we can upgrade it to _unicode_, instead.
			if ( ! $collate || 'utf8_general_ci' === $collate ) {
				$collate = 'utf8mb4_unicode_ci';
			} else {
				$collate = str_replace( 'utf8_', 'utf8mb4_', $collate );
			}
		}

		// _unicode_520_ is a better collation, we should use that when it's available.
		if ( $this->has_cap( 'utf8mb4_520' ) && 'utf8mb4_unicode_ci' === $collate ) {
			$collate = 'utf8mb4_unicode_520_ci';
		}

		return compact( 'charset', 'collate' );
	}

 

対策・解決方法

インポートするSQLファイルをエディタで開き、以下のように置き換えます。

utf8mb4_unicode_520_ci → utf8_general_ci

utf8mb4 → utf8

[参考]

https://stackoverflow.com/questions/29916610/1273-unknown-collation-utf8mb4-unicode-ci-cpanel/29939906#29939906

 

chromeが落ちる、音が出ない

最近chromeが突然落ちたり、Youtubeの音が出なくなったらり
O.S.はUbuntu(Debian系Linux)なのだ
いろいろ試して、やっと原因に辿り着いた

解決方法を調査した結果,試験運用中のQUICというプロトコルを使用していることが原因であることが分かりました.

ということで chromeの検索バーに「chrome://flags」と入力し,設定欄の「試験運用版のQUICプロトコル」を無効にします.

これで解決した。

——————
その2

cheromeでyoutubeを立ち上げる
Firefoxでchromeを立ち上あげる
firefoxを閉じる
chromeを再起動
OKだった

カスタムフィールドの値を表示する(繰り返しフィールド、画像)

カスタムフィールドの値を表示する
繰り返しフィールドで、画像の場合

<?php
$rows = get_field('フィールド名' );
for($i = 0; $rows[$i] != ''; $i ++){
    $row = $rows[$i];
    $image = $row['サブフィールド名'];
    // echo '<pre>';
    // var_dump($image);
    // echo '</pre>';
    echo '<div style="margin-top:20px;">'.$image[title].'<div>';
    echo '<img src="'.$image[url].'" alt="'.$image[title].'" />';
}
?>

wordpressの管理画面にページを増やす

wordpressの管理画面に「ページ、メニュー」を増やす方法

1つだけ増やす例は沢山公開されているが、複数の場合は下記のように書く

function.php の最後に書きます。

// ページの追加
add_action( 'admin_menu', 'register_my_custom_menu_page' );
function register_my_custom_menu_page() {
    add_menu_page('管理画面の使い方', '予約管理', 'manage_options', 'yoyaku', 'add_manual_page', 'dashicons-welcome-learn-more', 3);
	add_menu_page('顧客管理の使い方', '顧客管理', 'manage_options', 'customer', 'add_manual_page2', 'dashicons-welcome-learn-more', 3);
}
// ページの中身のHTML
function add_manual_page() {
	include('../yoyakukanri.php');
}
function add_manual_page2() {
	include('../customer.php');
}

wordpressで「ログイン状態を保存する」が解除されてしまう

使っている theme の function.php に、下記のコードを追記することで
ログイン状態を維持できるようになる

function wplogin_rememberme_checked() {?>
    <script src="//code.jquery.com/jquery-1.11.1.js"></script>
    <script>
        $(document).ready(function(){
            $('#rememberme').prop('checked', true);
        });
    </script>
<?php }
add_action( 'login_enqueue_scripts', 'wplogin_rememberme_checked' );

WordPressでカテゴリ毎に公開・非公開を変更

<?php

include ('./wp-config.php');

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

// 該当カテゴリのPOST_IDの配列を生成
$post_id_array = array();
$sql = "SELECT * FROM `mint_term_relationships` WHERE `term_taxonomy_id` = '2'"; // カテゴリIDを指定
foreach($pdo->query($sql) as $item) {

	array_push($post_id_array, $item[object_id]);
}

var_dump($post_id_array);

// 公開フラグを変更する
for($i = 0; $post_id_array[$i] != ''; $i ++){

	// 公開
	// $sql = "UPDATE `mint_posts` SET `post_status` = 'publish', `comment_status` = 'open', `ping_status` = 'open' WHERE `ID` = '$post_id_array[$i]'";

	// 非公開
	$sql = "UPDATE `mint_posts` SET `post_status` = 'inherit', `comment_status` = 'closed', `ping_status` = 'closed' WHERE `ID` = '$post_id_array[$i]'";

	$statement = $pdo->query($sql);
}
?>

css レスポンシブ、背景画像とコンテンツをアスペクト比を保持したまま画面幅に追従する

font-size: 16vw;
width: 50vw;
height: 100vh;

% の代わりに vh,vw を使うと、テキストサイズなども追従するので便利

使い方のコツ

width には vw
height には vh
ということではない

vw 画面幅の何%か?
vh 画面高さの何%か?
ということなので

width にも height にも margin にも vh で指定すれば、アスペクト比(縦横比)を保持できる

指定カテゴリの記事一覧、アイキャッチ有り


<?php
	$cat = 'カテゴリスラッグ';
	$num = '5';
	global $post;

	$term_id = get_category_by_slug($cat)->term_id;
	$myposts = get_posts('numberposts=' .$num. '&category_name=' .$cat);
	if ($myposts) {
		foreach($myposts as $post):
			setup_postdata($post);
			echo '<li><div class="blog_thumb"><a href=' .get_permalink(). '>';
			if ( has_post_thumbnail() ) {
				echo ''.get_the_post_thumbnail($page->ID, 'thumbnail'). '';
			} else {
				echo '<span class="no_image"><i class="fa fa-ban fa-2x" aria-hidden="true"></i>&nbsp;No images</span>';
			}
			echo '</a></div><div class="blog_data">';
			echo '<div class="blog_date">' .get_the_time('Y/n/j').'</div>';
			echo '<div class="blog_tit"><a href='.get_permalink().'>'. the_title("","",false).'</a></div>';
			echo '<div class="blog_content">' .mb_substr( strip_tags( $post -> post_content ), 0, 100 ). '...</div></div></li>';
		endforeach;
	echo '</ul><p><a href=' .get_category_link($term_id). '>カテゴリの一覧 ≫</a></p>';
	} else {
	echo '<p>記事がありません。</p>';
	}

?>

google 削除

ご連絡いただきありがとうございます。ご報告いただいた情報はページ自体から削除するか、そのページをウェブから削除する必要があります。Google が削除することはできませんが、ウェブマスターやサイト所有者に削除を依頼していただくことはできます。Google からウェブマスターにこのページをウェブから削除するよう依頼することはできませんのでご了承ください。ページの削除を希望する場合は、こちらに記載されている手順で Google からのキャッシュ ページの削除をリクエストできます。

Strict Standards エラーを非表示にできない EC-CUBE2.4系

configファイルで ’error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);’と書いても効果なしでした。

/data/class/SC_Initial.php
102行目付近

function setErrorReporting() {
	error_reporting(E_ALL & ~E_NOTICE);
}

ここを書き換えたら Strict Standards エラー が非表示になった。

function setErrorReporting() {
	error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
}

error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);

error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);

Gimpでグリットのサイズを変更する。

Gimpでグリットのサイズを変更しても反映せれない。

原因調査の結果

編集 > 設定 > グリットのサイズ変更
これでは反映されない

画像 > グリッドの設定
これだとリアルタイムで反映される

達人プログラマーになるには?

大規模システムを一人で組む機会が多く、毎回思うことがある。 ソースコードをロス無く最小限の文字数で描き、後から見て分かりやすい、動作も軽快。 結果として、短時間で描き上げることができる。

これらは個別の事のように見えますが、全てつながっていて、どれか一つが劣っても「良いプログラム」とはいえません。

そのために、日頃から心がけていることが2つあります。一つは ”ソースコードを日本語で描く” 二つ目は ”自分の愚かさを記録する” ということです。 この二つを心がければ、誰でもプログラムが上手に描けるようになります。

まずはじめに ”ソースコードを日本語で描く” についてお話します。 クライアントや元請けさんから頂く仕様書を見て、毎回感じること。 解りにくい! 何を伝えたいのか不明瞭! 主語が抜けている! 意味を取り違えた専門用語! それが普通の人なんだなって思う。

意味を取り違えた専門用語!」ってチョー恥ずかしいことですが、けっこう皆さんやってます。 特にディレクションとか専門にしている ”制作しない制作会社” に多いですね〜。 多いというかほぼ全員ですけどね。 そういう人たちが、専門用語を間違った意味で普及しているってのが現実ですかね。

話がそれましたので本題にもどります。 頂いた仕様書は、取り消し線、下線、太文字、色文字、追記、などをフルに活用して、分かりやすい仕様書に仕上げます。 次に、仕様書の項目ごとに、ソースコードを書くのですが、コンピュータ語ではなく、日本語で書きます。 オープンソースのカスタマイズの例をご覧ください。

どのファイルの何行目を編集・追記すればいいか? その場所をどうやって見つけたのか?
具体的に、最小限の文字で、解りやすく、書く それだけなんですが、これが描ければ、プログラムは8割がた完成したようなものです。

上の例を見て、お気づきの方、いらっしゃいますか? これね〜。 数学の試験問題みたいでしょ。 問題が解りやすいと、答えは容易なんです。 プログラムが上手でない人は、この「ソースコードを日本語で描く」という作業をせず、いきなりソースコードを書こうとしているんですね。 あなたは天才ですか?って感じ! だからいつまでたっても上達しない。
「ソースコードを日本語で描く」の意味はこんな感じです。 ご理解いただけたでしょうか?

では、次に「自分の愚かさを記録する」について話してみます。 作業中つまずいたこと、新たに覚えたこと、面倒だと思ったこと、をブログに書いていきます。 ただそれだけです。 そのメリットは大きいです。その後の作業がどんどん早くなります。

理由は、つまずいた時、検索をかけると、自分の過去のミスが出てきます。 脳の無限ループに陥ること無く、瞬時に解決できます。 「自分の愚かさを記録」したサンプルは、お気づきの方もいるかも知れませんが、このサイトそのものです。

ということで、この文章は終わりのタイミングで、達人プログラマになるために大切なこと、もう一つありました。 「知識ではなく、知恵を求めよ。知識は過去の産物だが、知恵は未来をもたらす。」ラムビー族(インディアン)の格言ですね。 プログラマーにはピッタリの言葉なんです。

なぜかというと、自分の知識に執着してハマること多し。 昨日覚えたソースコードや関数、今日描いたら動かないなんてこと日常茶飯事です。 原因はサーバーの仕様がことなっていたり、プログラム言語モジュールがアップデートされたりで、昨日の常識は、今日には通用しないんです。

知識か?知恵か?を理解し 「自分の愚かさを記録」して 自分が原因の、脳の無限ループにはまらないこと。 とても大切です。 ハマりが多いと、メンタル病みますからね〜。 プログラマが体調不良で退社するって、まさにこれなんです。

”ソースコードを日本語で描く” ”自分の愚かさを記録する”
この2つを心がければ、かならず達人プログラマになれるでしょう。

form に複数ボタンで 異る処理をする(その1)

標準的なformボタン

<form>
  <input type='submit' value='送信'>
</form>

複数ボタンを設置

<form>
  <input type='submit' name='action' value='送信'>
  <input type='submit' name='action' value='下書き保存'>
</form>

ボタンごとに異る処理

if ($_POST['action'] == '送信') {
  // 送信処理
} else if ($_POST['action'] == '下書き保存') {
  // 保存処理
}

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'");
    }

Smartyで開発中にキャッシュ問題を回避する

template_c を毎回削除は手間がかかるので
毎回強制的にコンパイルさせます。

方法は Smarty.class.php を編集します。
場所は環境によって異なりますが今回は下記のディレクトリにありました。
/app/framework/lib/Smarty/libs/Smarty.class.php
361行目付近
$force_compile = false;
true にすればOKです。

公式サイトに書いてあります。
https://www.smarty.net/docsv2/ja/variable.force.compile.tpl

EC-CUBE3で設置URLから”/html/”をなくす

EC-CUBE3で設置URLから”/html/”をなくす以外にも、設置URLを変更する場合の方法です。

これで「html/」にアクセスするとデフォルトテンプレートでサイトが展開されているわけですが、やはり気になってしまうのはURLにどうしても「html」が入ってしまうことだと思います。

ファイルの移動

./html/ 配下のファイルを全て、一つ上の階層に移動します。
※ フォルダは移動しない。

「index.php」と「.htaccess」は上書きしてOKです。

ファイルの修正

index.php
Before require __DIR__.’/../autoload.php’;
After  require __DIR__.’/autoload.php’;

index_dev.php
require_once __DIR__.’/../vendor/autoload.php’;
$config_dev_file = __DIR__.’/../app/config/eccube/config_dev.yml’;
‘profiler.cache_dir’ => __DIR__.’/../app/cache/profiler’,
この3箇所を同じように「/../」→「/」としておきます。

app/config/eccube/path.yml
root_urlpath の「html」を消す。

以上で完了です。

WordPressでpathやURLを取得するためのタグと出力例

n

関数 解説 出力
ABSPATH インストールされた場所のパス C:\xampp\htdocs\xampp\example/(ローカルの場合)
/var/www/html/example/(サーバの場合)
admin_url() 管理画面のパス http://www.example.com/wp-admin/
content_url() wp-contentディレクトリのパス http://www.example.com/wp-content
get_attachment_link( $id ) 添付ファイルのIDを渡すと添付ページの URI を返す http://www.example.com/?attachment_id=$id
get_author_posts_url( $author ) 投稿者別のアーカイブページへのリンク。投稿者名を入力する http://www.example.com/?author=0
get_bloginfo( $show ) デフォルトはnameでサイト名が返ってくる。変数による違いは以下の通り。 http://localhost/xampp/example
$show = ‘admin_email’ admin@example.com
$show = ‘atom_url’ http://www.example.com/home/feed/atom
$show = ‘charset’ UTF-8
$show = ‘comments_atom_url’ http://www.example.com/home/comments/feed/atom
$show = ‘comments_rss2_url’ http://www.example.com/home/comments/feed
$show = ‘description’ Just another WordPress blog
$show = ‘home’ http://www.example.com/home (DEPRECATED! use url option instead)
$show = ‘html_type’ text/html
$show = ‘language’ en-US
$show = ‘name’ Testpilot
$show = ‘pingback_url’ http://www.example.com/home/wp/xmlrpc.php
$show = ‘rdf_url’ http://www.example.com/home/feed/rdf
$show = ‘rss2_url’ http://www.example.com/home/feed
$show = ‘rss_url’ http://www.example.com/home/feed/rss
$show = ‘siteurl’ http://www.example.com/home (DEPRECATED! use url option instead)
$show = ‘stylesheet_directory’ http://www.example.com/home/wp/wp-content/themes/largo
$show = ‘stylesheet_url’ http://www.example.com/home/wp/wp-content/themes/largo/style.css
$show = ‘template_directory’ http://www.example.com/home/wp/wp-content/themes/largo
$show = ‘template_url’ http://www.example.com/home/wp/wp-content/themes/largo
$show = ‘text_direction’ ltr
$show = ‘url’ http://www.example.com/home
$show = ‘version’ 3.5
$show = ‘wpurl’ http://www.example.com/home/wp
get_category_link( $id ) カテゴリーアーカイブページヘのリンク http://www.example.com/?cat=0
get_day_link( $year, $month, $day ) 日別アーカイブページのリンク。デフォルトは現在の日。 http://www.example.com/?m=20150313
get_edit_user_link( $user_id ) ユーザー情報編集画面用のパス http://www.example.com/wp-admin/profile.php
get_feed_link() FeedのURLを取得 http://www.example.com/?feed=rss2
get_month_link( $year, $month )

年別アーカイブページのリンク。デフォルトは現在の年度。 http://www.example.com/?m=201503
get_page_link( $id ) 固定ページのパーマリンクを取得 http://www.example.com/?page_id=$id
get_permalink( $id ) $idを入力するとURLのスラッグを返す。パーマリンク設定によって異なる http://www.example.com/?p=$id
get_post_type_archive_link( $posttype ) カスタム投稿タイプのアーカイブページを返す。get_post_type_archive_link( get_post_type() )など http://www.example.com/$posttype
get_stylesheet() 現在適用されているテーマ(スタイルシート)のディレクトリ twentyten-child
get_stylesheet_directory() 現在適用されているテーマ(スタイルシート)のディレクトリ /var/www/html/example/wp-content/themes/twentyten-child
get_stylesheet_directory_uri() 現在適用されているテーマをURI表記で返す http://www.example.com/wp-content/themes/twentyten-child
get_stylesheet_uri() 現在適用されているテーマ(スタイルシート)のパス /var/www/html/example/wp-content/themes/twentyten-child/style.css
get_tag_link( $id ) タグアーカイブページヘのリンク。IDで指定してスラッグで返ってくる。 http://www.example.com/?tag=wordpress
get_template_directory() 親テーマのディレクトリ /var/www/html/example/wp-content/themes/twentyten
get_template_directory_uri() 親テーマのURI http://www.example.com/wp-content/themes/twentyten
get_term_link( $id ) カスタム分類アーカイブページヘのリンク。タクソノミーが無いとWP_Error Objectを返す http://www.example.com/custom-taxonomy
get_theme_root() テーマのディレクトリ /var/www/html/example/wp-content/themes
get_theme_root_uri() 親テーマのディレクトリ http://www.example.com/wp-content/themes
get_year_link( $year ) 年別アーカイブページのリンク。デフォルトは現在の年度。 http://www.example.com/?m=2015
home_url( $path, $scheme ) $pathにはホームURLからの相対パス。$schemeはhttpかhttpsもしくはrelative(相対パス) http://www.example.com/$path
includes_url() wp-includesのディレクトリを返す http://www.example.com/wp-includes/
plugin_dir_path( __FILE__ ) 現在のファイルのディレクトリを返す。pluginファイルに書けばプラグインのパスを返すが、必ずしもpluginのディレクトリを返すとは限らない /var/www/html/example/wp-content\themes\twentyten-child/
plugins_url() プラグインディレクトのパス http://www.example.com/wp-content/plugins
site_url() サイトのアドレスを表示。スラッシュは付かない http://localhost/xampp/example
the_permalink() 現在のページのパス http://www.example.com/
WP_CONTENT_DIR wp-contentディレクトリのパス /var/www/html/example/wp-content
wp_get_shortlink( $id ) 短縮URL、ショートリンクを表示する。パーマリンク設定で長いスラッグにしている場合に外部プログラムへ短いURLを渡したい場合などに使う http://www.example.com/?p=$id
WP_LANG_DIR languagesディレクトリのパス /var/www/html/example/wp-content/languages
wp_login_url() ログイン画面のパス http://www.example.com/wp-login.php
wp_logout_url() ログアウト用のパス http://www.example.com/wp-login.php?action=logout&_wpnonce=0000000000
wp_lostpassword_url() ログアウト用のパス http://www.example.com/wp-login.php?action=lostpassword
WP_PLUGIN_DIR プラグインディレクトのパス /var/www/html/example/wp-content/plugins
wp_registration_url() ユーザー登録用のパス http://www.example.com/wp-login.php?action=register
wp_upload_dir($time) アップロードディレクトリ URL。配列で返ってくる。$timeはデフォルトはnull。$time = ‘path‘ /var/www/html/example/wp-content/uploads
$time = ‘url‘ http://www.example.com/wp-content/uploads
$time = ‘subdir‘
$time = ‘basedir‘ /var/www/html/example/wp-content/uploads
$time = ‘baseurl‘ http://www.example.com/wp-content/uploads
$time = ‘error‘ bool(false)

WordPressのリビジョン機能を停止する

WordPressのリビジョン機能は、編集するたびに、以前の状態を保存されます。
編集画面を開いていると、数分に一度、自動保存もされます。

1つの記事に対し、数十から数百に及ぶこともあり、データベースの肥大化、動作が重くなる原因となります。

リビジョン削除のプラグインもありますが、プラグインを増やすことも動作が重くなる要因なので
ソースコードで停止する方法です。

wp-config.php に次の一行を追記します。

define('WP_POST_REVISIONS', false);

※ ABSPATH よりも前に記載しないと効きません。

welcart 商品の並び順をドラッグアンドドロップで変える

商品マスタ(商品一覧)のテンプレートファイル
/wp-content/plugins/usc-e-shop/includes/usces_item_master_list.php

詳細

/home/hashimoto/www/yoga-lien.com/wp-content/plugins/usc-e-shop/js にファイルを追加
jquery-1.8.0.min.js
jquery-ui.js

商品一覧のテンプレート(一覧大規模変更)
/home/hashimoto/www/yoga-lien.com/wp-content/plugins/usc-e-shop/includes/usces_item_master_list.php

// 並び替えページ
”usces_item_popup.php”を追加(新設)した。

”itemList.class.php” にてソート順を変更した

手法:$rows[L:410付近]の並び順を変えることで成功!

DB wp_posts.to_ping 型をtext → int に変更

// Heart-Lab Start
//-------------------------------------------------

/*
echo '<pre>';
var_dump($rows);
echo '</pre>';*/

// 商品IDのソート順
$id_array = array();
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);
$sql = "SELECT * FROM `wp_posts` WHERE `post_mime_type` = 'item' AND `post_type` = 'post' AND `post_status` = 'publish' ORDER BY `to_ping` ASC";
foreach($pdo->query($sql) as $item) {
// 	echo $item[ID].' -- ';
	array_push($id_array, $item[ID]);
}
// var_dump($id_array);

// $rows の並び順を変える
for($i = 0; $id_array[$i] != ''; $i ++){
	for($a = 0; $rows[$a] != ''; $a ++){
		if($id_array[$i] == $rows[$a][ID]){
			$new_rows[$i][ID] = $rows[$a][ID];
			$new_rows[$i][item_code] = $rows[$a][item_code];
			$new_rows[$i][item_name] = $rows[$a][item_name];
		}
	}
}

// echo '<pre>';
// var_dump($new_rows);
// echo '</pre>';

$rows = $new_rows;

// Heart-Lab END
//-------------------------------------------------

”usces_item_popup.php”

<html lang="ja" class="no-js"><head><meta charset="UTF-8">
<!-- WR -->
<style>
a {
 color: gray;
}
.wr_menu li {
	display: inline-block;
	margin: 0 20px 30px 0;
}
.ns {
	display: block;
	float: left;
	border: 1px solid silver;
	width: 500px;
	height: 60px;
	background: white;
	overflow: hidden;
	margin: 0 0 5px 0;
}
.w100 {
	display: block;
	float: left;
	width: 80px;
}
.w200 {
	display: block;
	float: left;
	width: 300px;
	overflow: hidden;
}
#tablenavi {
	display: none;
}
</style>
</head>
<body>
<?php
error_reporting(E_ALL & ~E_NOTICE);
$act1 = ''; $act2 = ''; $act3 = '';
if($_GET["wr"] == 'lesson'){
	$act1 = ' style="color:red;font-weight: bold"';
}elseif($_GET[wr] == 'shopping'){
	$act2 = ' style="color:red;font-weight: bold"';
}else{
	$act3 = ' style="color:red;font-weight: bold"';
}
echo '<div class="wr_menu">';
echo '<li><a href="?page=usces_itemedit&wr=all"'.$act3.'>All</a></li>';
echo '<li><a href="?page=usces_itemedit&wr=lesson"'.$act1.'>Lesson</a></li>';
echo '<li><a href="?page=usces_itemedit&wr=shopping"'.$act2.'>Shopping</a></li>';
echo '</div>';
?>


<script type="text/javascript">
<!--
function p_reload(){
var pwin=window.opener;
pwin.location.reload();
pwin.focus();
window.close();
}
//-->
</script>
<button type="button" onclick="p_reload()" style="float: right;">閉じる</button>
<br><br>


<form action="" method="post">
      <input type="submit" id="submit" value="並び順を保存する" onClick="alert('並べ替え完了です')"/>
            <ul class="sortable">
<!-- WR -->



<?php

include("../../../../wp-config.php");
$pdo = 
new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);


// 並べ替え
if($_POST[result] != ''){
	
	$sort_ids = explode(",", $_POST[result]);
	
	for($i = 0; $sort_ids[$i] != ''; $i ++){
		if($_GET[wr] == 'shopping'){
			$a = $i;
		}else{
			$a = $i + 10000;
		}
		$sql = "UPDATE `wp_posts` SET `to_ping` = '$a' WHERE `ID` = '$sort_ids[$i]'";
		$statement = $pdo->query($sql);
	
	}
}


$sql = "SELECT * FROM `wp_posts` WHERE `post_mime_type` = 'item' AND `post_type` = 'post' AND `post_status` = 'publish' ORDER BY `to_ping` ASC";


foreach($pdo->query($sql) as $item) {
	
	$print_flg = 0;
	
	if($_GET[wr] == 'shopping'){
		$sql2 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$item[ID]' AND `term_taxonomy_id` = '5'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		
		if($item2[object_id] != ''){
			$print_flg = 1;
		}
	}
	if($_GET[wr] == 'lesson'){
		$sql2 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$item[ID]' AND `term_taxonomy_id` = '3'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		
		if($item2[object_id] != ''){
			$print_flg = 1;
		}
	}
	
	if( ($_GET[wr] == '') || ($_GET[wr] == 'all') ) $print_flg = 1;
	
	if($print_flg == 1){
		
		// 商品情報取得
		$sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_isku_'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		
		$hoge = explode(";", $item2[meta_value]);
		
		$wr_array = array();
		for($i = 0; $hoge[$i] != ''; $i ++){
			
			$hhh = explode('"', $hoge[$i]);
			
	// 		echo $i.'> '.$hhh[1].'<br>';
			array_push($wr_array, $hhh[1]);

		}
		

		$ID = $item["ID"]; ///////idのようなモノ
		$code = $wr_array[1];
		$price = number_format($wr_array[7]);
		$stock_num = number_format($wr_array[11]);
		
		// 在庫有無
		if($stock_num == 0){
			$stock_text = '<span style="color:red;">在庫切れ</span>';
		}else{
			$stock_text = '.';
		}
		
		// 公開状態
		if($item[post_status] == 'publish'){
			$open_text = '公開';
		}else{
			$open_text = '<span style="color:red;">非公開</span>';
		}
		
		// カテゴリ
		$sql3 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$ID' AND `term_taxonomy_id` != '2'";
		$statement3 = $pdo->query($sql3);
		$item3 = $statement3->fetch(PDO::FETCH_ASSOC);
		
		$sql4 = "SELECT * FROM `wp_terms` WHERE `term_id` = '$item3[term_taxonomy_id]'";
		$statement4 = $pdo->query($sql4);
		$item4 = $statement4->fetch(PDO::FETCH_ASSOC);
		$category = $item4[name];
		
		
		// 画像
		$sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_thumbnail_id'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		
		$sql2 = "SELECT * FROM `wp_posts` WHERE `ID` = '$item2[meta_value]'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		$img = $item2[guid];
		$post_name = $item2[post_title];
		
		// url
		$sql2 = "SELECT * FROM `wp_options` WHERE `option_name` = 'siteurl'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		$http_url = $item1[option_value];
		
		$item[post_title] = mb_strimwidth( $item[post_title], 0, 85, '…','UTF-8' );
		
		echo '<li class="ns" id="'.$ID.'">
			<div class="w100"><img src="'.$img.'" width="60" alt="
IMG"></div>
			<div class="w100">'.$ID.'</div>
			<div class="w200">'.$code.'<br>'.$item[post_title].'</div>
			<!--
			<div class="w100">'.$price.'</div>
			<div class="w100">'.$stock_num.'</div>
			<div class="w100">'.$stock_text.'</div>
			<div class="w100">'.$category.'</div>
			<div class="w100">'.$open_text.'</div>
			-->
			</li><!-- ----リスト---- -->';
	}

	

}

?>

<?php

		// url
		$sql2 = "SELECT * FROM `wp_options` WHERE `option_name` = 'siteurl'";
		$statement2 = $pdo->query($sql2);
		$item2 = $statement2->fetch(PDO::FETCH_ASSOC);
		$http_url = $item2[option_value];
?>

<!-- WR -->
             </ul>
      <input type="hidden" id="result" name="result" />
</form>




<script src="<?php echo $http_url; ?>/wp-content/plugins/usc-e-shop/js/jquery-1.8.0.min.js"></script>
<script src="<?php echo $http_url; ?>/wp-content/plugins/usc-e-shop/js/jquery-ui.js"></script>
<script>
$(function() {
	$(".sortable").sortable();
	$(".sortable").disableSelection();
	$("#submit").click(function() {
		var result = $(".sortable").sortable("toArray");
		$("#result").val(result);
		$("form").submit();
	});
});
</script>

<div style="clear:both;"></div>
<!--
<pre>
<?php var_dump($_POST); ?>
</pre>
-->
<!-- WR -->

SQLite3 にPHPで接続する

シンプルに接続

// 基本接続
$dsn ="sqlite:yoga.db";
$pdo = new PDO($dsn);
// SQL文処理
$sql = "select * from tb_shop";
$statement = $pdo->prepare($sql);
$statement->execute();

ループ(レコード)読み込み

// 基本接続
$dsn ="sqlite:yoga.db";
$pdo = new PDO($dsn);
// SQL文処理
$sql = "select * from tb_shop";
$rs = $pdo->prepare($sql);
$rs -> execute();
foreach ($rs->fetchall() as $key => $value) {
	echo '<hr>';
	var_dump($value);
}

エラーチェックなどを行う場合

// SQLite3 に接続
$dsn ="sqlite:yoga.db";
$pdo = new PDO($dsn);
$sqltext = "select * from tb_shop";
$sql = $pdo->prepare($sqltext);
try{
	if(!$sql->execute()){
		echo "Failed(SQL文に問題あり)";
	}
	foreach ($sql->fetchall() as $key => $value) {
		echo "$key:$value[0]<br/>\n";
	}
} catch(Exception $e){
	echo "Failed:(システムエラー)".$e->getMessage();
}

Welcart の商品情報の取り出し方

商品名、説明などは、wp-posts に記録され、その他の情報は wp-postmeta に記録されています。

例)データベース

// 商品情報取得
$sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_isku_'";
$statement2 = $pdo->query($sql2);
$item2 = $statement2->fetch(PDO::FETCH_ASSOC);

$hoge = explode(";", $item2[meta_value]);

$wr_array = array();
for($i = 0; $hoge[$i] != ''; $i ++){
	
    $hhh = explode('"', $hoge[$i]);
	
    // echo $i.'> '.$hhh[1].'<br>';
    array_push($wr_array, $hhh[1]);
}

上記のような方法で整形したデータ

0> code
1> L-20170926
2> name
3> 
4> cprice
5> 
6> price
7> 1500
8> unit
9> 
10> stocknum
11> 8
12> stock
13> 0
14> gp
15> 0
16> sort
17> 0
18> 

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

Thunderbird でgmailが 突然エラーになった

google アカウントの設定

ログインとセキュリティ → 接続済みのアプリとサイト → 安全性の低いアプリの許可: 有効

何度設定しても、無効になっていた。 有効が完全に反映されたらメールアクセスできるようになった

potision: absolute; と親要素の関係

potision: absolute;
top: 0;
left: 0;

これだけだと、画面全体の左上に配置されてしまいます。

親要素に’position: relative;’を指定すると、親要素の左上に表示されます。

SQL文 を半自動で生成する


$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."'".$_POST[$key]."'";
    $i ++;
}

echo '<hr>'.$key_text.'<hr>';
echo $val_text.'<hr>';

$sql = "INSERT INTO `tb_staff` ($key_text) VALUES($val_text)";
echo $sql;

$statement = $pdo->query($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′)

レスポンシブデザインのブレークポイントを考える

主な機種の画面サイズ
ブラウザ表示は下記のようになります。

320px iPhone
375px iPhone
360px Android
414px iPhone6 Plus
600px Nexus 7
768px iPad iPad mini Nexus9
800px Nexus10

PC用には、800px〜1000px、100px以上があればいい感じです。

全部のサイズに対応する必要はないので
360,600,800,1000,over あたりをブレイクポイントとする。

WordPressでログインURLを変える

1) TOPディレクトリに「heart-lab-login.php」というファイルを作る。
内容は下の通り。

<?php
define( 'ANYWHERE_LOGIN', sha1( 'keyword' ) );
require_once './wp-login.php';
?>

2) テーマファイルのfunction.php に下記を追記する


define( 'ANYWHERE_LOGIN_PAGE', 'heart-lab-login.php' );
add_action( 'login_init', 'heart_lab_login_init' );
add_filter( 'site_url', 'heart_lab_login_site_url', 10, 4 );
add_filter( 'wp_redirect', 'heart_lab_login_wp_redirect', 10, 2 );

if ( ! function_exists( 'heart_lab_login_init' ) ) {
	function heart_lab_login_init() {
		if ( !defined( 'ANYWHERE_LOGIN' ) || sha1( 'keyword' ) != ANYWHERE_LOGIN ) {
			status_header( 403 );
			exit;
		}
	}
}

if ( ! function_exists( 'heart_lab_login_site_url' ) ) {
	function heart_lab_login_site_url( $url, $path, $orig_scheme, $blog_id ) {
		if ( ( $path == 'wp-login.php' || preg_match( '/wp-login\.php\?action=\w+/', $path ) ) &&
			( is_user_logged_in() || strpos( $_SERVER['REQUEST_URI'], ANYWHERE_LOGIN_PAGE ) !== false ) )
			$url = str_replace( 'wp-login.php', ANYWHERE_LOGIN_PAGE, $url );
		return $url;
	}
}

if ( ! function_exists( 'heart_lab_login_wp_redirect' ) ) {
	function heart_lab_login_wp_redirect( $location, $status ) {
		if ( strpos( $_SERVER['REQUEST_URI'], ANYWHERE_LOGIN_PAGE ) !== false )
			$location = str_replace( 'wp-login.php', ANYWHERE_LOGIN_PAGE, $location );
		return $location;
	}
}

3) その結果
「wp-admin」「wp-login.php」は403になるので安全です。

モーダルウィンドウの実装方法

modal-multi.js

<!DOCTYPE html>
<html lang="ja-JP">
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="./js/modal-multi.js"></script>
<style>
.modal-content {
	width: 50% ;
	margin: 0 ;
	padding: 10px 20px ;
	border: 2px solid #aaa ;
	background: #fff ;
	position: fixed ;
	display: none ;
	z-index: 2 ;
}
#modal-overlay {
	z-index: 1 ;
	display: none ;
	position: fixed ;
	top: 0 ;
	left: 0 ;
	width: 100% ;
	height: 120% ;
	background-color: rgba( 0,0,0, 0.75 ) ;
}
.button-link {
	color: #00f ;
	text-decoration: underline ;
}
.button-link:hover {
	cursor: pointer ;
	color: #f00 ;
}
</style>
</head>
<body>


	
<!-- 1つ目のコンテンツ [開始] -->
<div id="modal-content-01" class="modal-content">
	<!-- モーダルウィンドウのコンテンツ開始 -->
	<p>1つ目のモーダルウィンドウです。全体を囲むdiv要素に[id="modal-content-01"]が設定されています。</p>
	<p>「閉じる」か「背景」をクリックするとモーダルウィンドウを終了します。</p>
	<p><a id="modal-close" class="button-link">閉じる</a></p>
	<!-- モーダルウィンドウのコンテンツ終了 -->
</div>
<!-- 1つ目のコンテンツ [終了] -->

<!-- 2つ目のコンテンツ [開始] -->
<div id="modal-content-02" class="modal-content">
	<!-- モーダルウィンドウのコンテンツ開始 -->
	<p>2つ目のモーダルウィンドウです。全体を囲むdiv要素に[id="modal-content-02"]が設定されています。</p>
	<p>「閉じる」か「背景」をクリックするとモーダルウィンドウを終了します。</p>
	<p><a id="modal-close" class="button-link">閉じる</a></p>
	<!-- モーダルウィンドウのコンテンツ終了 -->
</div>
<!-- 2つ目のコンテンツ [終了] -->

<!-- 3つ目のコンテンツ [開始] -->
<div id="modal-content-03" class="modal-content">
	<!-- モーダルウィンドウのコンテンツ開始 -->
	<p>3つ目のモーダルウィンドウです。全体を囲むdiv要素に[id="modal-content-03"]が設定されています。</p>
	<p>「閉じる」か「背景」をクリックするとモーダルウィンドウを終了します。</p>
	<p><a id="modal-close" class="button-link">閉じる</a></p>
	<!-- モーダルウィンドウのコンテンツ終了 -->
</div>

<p><a class="modal-syncer button-link" data-target="modal-content-01">クリックすると、1つ目のモーダルウィンドウを開きます。</a></p>
<p><a class="modal-syncer button-link" data-target="modal-content-02">クリックすると、2つ目のモーダルウィンドウを開きます。</a></p>
<p><a class="modal-syncer button-link" data-target="modal-content-03">クリックすると、3つ目のモーダルウィンドウを開きます。</a></p>
<!-- 3つ目のコンテンツ [終了] -->




</body>
</html>

フローティングメニューのベストバージョン

初期状態は、ヘッダーの下のサイドバーに表示される。
ヘッダーが見えなくなると、フローティング開始。
これが一番自然でベストだと思う。

<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/start/jquery-ui.css" type="text/css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script type="text/javascript" src="//www.softel.co.jp/blogs/tech/wordpress/wp-content/themes/sfm/js.php"></script>
<script>$(function(){$("#source-viewer").text($("#source").html());});</script>
<script id="source">
$(function(){
    var o = $("#menu_left");
    var offset = o.offset();
    var topPadding = 30;
    $(window).scroll(function() {
        if ($(window).scrollTop() > offset.top) {
            o.stop().animate({
                marginTop: $(window).scrollTop() - offset.top + topPadding
            });
        } else {
            o.stop().animate({
                marginTop: 0
            });
        };
    });
});
</script>

カテゴリの表示順を逆にする(EC-CUBE)

デフォルトでは、後から登録したカテゴリが上になってしまう。

通常、登録するときは、上から入力していくと、全てが逆順に表示され、順番の入れ替えがとても面倒になる。

対策として、SQLのソート順を逆にする。

(フロント表示、管理画面の左のカテゴリディレクトリ表示)
/data/class/helper/SC_Helper_Category.php [line:544]

// $where = "del_flg = 0 AND $pid_name = ? ORDER BY rank DESC";
   $where = "del_flg = 0 AND $pid_name = ? ORDER BY rank ASC";

(カテゴリの追加変更ツリー)
/data/class/pages/admin/products/LC_Page_Admin_Products_Category.php
上記に習い、カテゴリのソート順を変更する
ORDER BY rank DESC ⇒ ORDER BY rank ASC

とても簡単なカスタマイズだが、少しづつ使いやすくするには、EC-CUBEのバカ機能を沢山直さなければならない。

WordPress[twentysixteen] テーマのリセットCSS

twentysixteen

 html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure,  footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin:0; padding:0; border:0; outline:0; font-size:100%; vertical-align:baseline; background:transparent; }  body { line-height:1; }  article,aside,details,figcaption,figure, footer,header,hgroup,menu,nav,section {  display:block; }  nav ul { list-style:none; }  blockquote, q { quotes:none; }  blockquote:before, blockquote:after, q:before, q:after { content:''; content:none; }  a { margin:0; padding:0; font-size:100%; vertical-align:baseline; background:transparent; }  / change colours to suit your needs / ins { background-color:#ff9; color:#000; text-decoration:none; }  / change colours to suit your needs / mark { background-color:#ff9; color:#000;  font-style:italic; font-weight:bold; }  del { text-decoration: line-through; }  abbr[title], dfn[title] { border-bottom:1px dotted; cursor:help; }  table { border-collapse:collapse; border-spacing:0; }  /* change border colour to suit your needs  */ hr { display:block; height:1px; border:0;  border-top:1px solid #cccccc; margin:1em 0; padding:0; }  input, select { vertical-align:middle; }




.skip-link, .menu-toggle, .site-header-menu {
	display: none;
}


/* カラム設定
-------------------------------------------------*/
#masthead {
	width: 100%;
}
	.site-header-main {
		max-width: 1000px; 
		margin: 0 auto;
		border: 1px solid silver;
	}
#content {
	width: 100%;
	margin: 20px 0 40px 0;
}
	#content_inner {
		max-width: 1000px; 
		margin: 0 auto;
		border: 1px solid silver;
	}
#footer {
	width: 100%;
}
	#footer_inner {
		max-width: 1000px; 
		margin: 0 auto;
		border: 1px solid silver;
	}

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."`,";
}

mint apache2 cgi 設定

見落としがちなCGIを有効にする設定

設定ファイルに絶対間違いはないのにCGIプログラムが動かず、そのソースが表示されるときにはどうしたら良いんだろう?

その場合は、ApacheにCGIを実行するモジュールが組み込まれているか確認します。

$ sudo apache2ctl -M|grep cgi
cgi_module (shared)
このコマンドでcgi_moduleが表示されない時には、ApacheにCGIモジュールが組み込まれていません。

UbuntuのApacheパッケージでCGIモジュールを読みこませるには、/etc/apache2/mods-available/cgi.loadをmods-enabledにコピーまたはリンクを作成します。

$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/cgi.load .
$ ls -l | grep cgi
lrwxrwxrwx 1 root root 26 11月 3 11:58 cgi.load -> ../mods-available/cgi.load
これでApacheを再起動するとCGIプログラムが動くようになるはずです。

configはこんな感じ

<Directory /home/hashimoto/www/>
#	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
	
	Order allow,deny
	allow from all
	Options +ExecCGI
	AddHandler cgi-script .cgi
</Directory>

PHP + MySQL で登録時に重複チェックをしたいです。【の対策】

フォームから投げたデータをデータベースに登録する。

多くの人は、リロードすると重複登録されてしまう対策に苦労しています。

いろんな方のお話を聞いていると
いろいろむずかしいことをしている感じです。

でも、本当はとても簡単です。

POSTを消してしまえばいいのです。

$_POST = array();

下記でも消えるはずですが、unset は挙動不審なので、上のようにからの配列にしてしまうと確実で簡単です。

unset($_POST);

EC-CUBEで管理画面にログインできない時

data/class/pages/admin/LC_Page_Admin_Index.php


//                 if (SC_Utils_Ex::isBlank($this->arrErr)) {
//                     $this->lfDoLogin($objFormParam->getValue('login_id'));
// 
//                     SC_Response_Ex::sendRedirect(ADMIN_HOME_URLPATH);
//                 } else {
//                     // ブルートフォースアタック対策
//                     // ログイン失敗時に遅延させる
//                     sleep(LOGIN_RETRY_INTERVAL);
// 
//                     SC_Utils_Ex::sfDispError(LOGIN_ERROR);
//                 }
           if (true) {

                $this->lfDoLogin($objFormParam->getValue('login_id'));
                SC_Response_Ex::sendRedirect(ADMIN_HOME_URLPATH);
            }else{
                SC_Utils_Ex::sfDispError(LOGIN_ERROR);
            }

新規ウインドウを開く(位置指定)

JavaScriptで小窓を開く

<SCRIPT language="JavaScript">
<!--
// サブウィンドウの大きさと開く位置の指定
w = 640; // 横幅
h = 480; // 縦幅
// 中央に開く
function openWindowC() {
x = (screen.width - w) / 2;
y = (screen.height - h) / 2;
subWin = window.open("開くURL","OpenWindow",
"screenX="+x+",screenY="+y+",left="+x+",top="+y+",width="+w+",height="+h);
}
//-->
</SCRIPT>
<div class="exit"><INPUT type="button" value="お気に入り" onClick="openWindowC()"></div>

子ウインドウを閉じるときに、元ウインドウを更新する。

たとえば、
会員一覧ページで、一部を変更するために子窓を立ち上げます。
更新登録して閉じると、
元ウインドウ(親ウインドウ)の会員データはそのままです。

自動で更新できたらといいなということで、書いてみました。
だれが書いても似たコードになると思います。

<script type="text/javascript">
<!--
function p_reload(){
var parent=window.opener;
parent.location.reload();
parent.focus();
window.close();
}
//-->
</script>
<button type="button" onclick="p_reload()">閉じる</button>

「parent」は変数名なので変えてもOKです。

CORESERVER に EC-CUBEを設置する 2.*系

1..htaccess ファイル
AddHandler application/x-httpd-phpcgi .php
———-
2..user.ini ファイルを作成し、以下の一行を記述
magic_quotes_gpc = on
———-
3..user.ini ファイルを .htaccess と同階層にアップロード

Formで入力されたデータを反映する。 ページはリロードさせない。

手法1

<script>
$('#submitBtn').click(function(e) {
	alert('押されたけどページの更新はしないよ。');
	return e.preventDefault();
});
</script>

↑たったこれだけでOK

手法2

form タグに  onsubmit=”doSomething();return false;” を追記するだけ。

<form id="fep-submission-form" method="post" onsubmit="doSomething();return false;">

下記のような書き方もある

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.3");</script>
<script type="text/javascript">
$(document).ready(function(){
    $("#form00").submit(function(){
        $.post( "postsample.php", $(this).serialize(), function(response){
            alert(response);
        } );
        return false;
    });
});
</script>

<form id="form00">
<input type="text" name="hogehoge">
<input type="submit" value="送信">
</form>

ファイルリスト取得PHP

<html xmlns="http://www.w3.org/1999/xhtml" class="wp-toolbar"  lang="ja">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
$dir = './';

$files = scandir($dir);
$files = array_filter($files, function ($file) {
	return !in_array($file, array('.', '..'));
});

$list = array();
$text = '';
foreach ($files as $file) {
	$fullpath = rtrim($dir, '/') . '/' . $file;
	if (is_file($fullpath)) {
		$list[] = $fullpath;
	}
	if (is_dir($fullpath)) {
		$list = array_merge($list, getFileList($fullpath));
	}
}

function getFileList($dir) {
    $files = glob(rtrim($dir, '/') . '/*');
    $list = array();
    foreach ($files as $file) {
        if (is_file($file)) {
            $list[] = $file;
        }
        if (is_dir($file)) {
            $list = array_merge($list, getFileList($file));
        }
    }
 
    return $list;
}

for($i = 0; $list[$i] != ''; $i ++){
	$list[$i] = preg_replace("$\.\/$", "", $list[$i]);
	$list[$i] = preg_replace("$\/$", ",", $list[$i]);
	echo $list[$i].'<br>';
}
?>

php(ImageMagick)で EPS, AI 画像に変換する(その3)

EPS, AI をPHPなどプログラムで変換するときのコツを書きます。(その2)

イラストレーター(.ai)
「PDF互換」で透過されていれば、そのまま透過されます。
「PDF互換」で透過されていなければ、そのまま透過されません。
※ ちなみに、「PDF互換なし」で入稿すると、データがありませんと返ってきます。
イラレ入稿には、レイヤは関係ないのです。
レイヤで透かしを入れたとか、レイヤで透過していたとか、印刷ができてから言っても無理なので、ご注意ください。
イラレの場合「レイヤに透過情報が入っている」は無効です。
イラレの場合「PDF互換レイヤに透過情報」が入っていることが重要です。

フォトショップ(.eps)
各レイヤが画像ですので、レイヤごとに一枚の画像ファイルとして出力されます。
吐き出しファイル名を「output.png」と指定すると
output-0.png
output-1.png
output-2.png
output-3.png
output-*.png
というように、沢山のファイルが吐出されます。
ゼロは全レイヤを統合した画像ファイル
それ以降は、レイヤごとに画像化したファイル
です。
レイヤが独立した画像として認識されるので「透過情報」も引き継がれます。

DTP印刷でも、プログラムの自動処理でも、入稿したとおりに透過情報も反映されます。

※ イラレ入稿で透過されないのは、入稿データが透過されていないのです。

 

試しに
私も、入稿データを作ってみました。

フォトショでは透過情報を簡単にきちんと保存できます。
イラレで透過情報をきちんと保存することは、神業くらい難しいようです。
イラレでレイヤ単位で透過しているのは、大概はベクトル情報です。(←NG) 画像情報としてきちんと透過しなければ入稿には反映されません)

↑確認方法は

イラレで保存したデータを、他のソフトで開いてみてください。
それで透過していたら成功です!

php(ImageMagick)で EPS, AI 画像に変換する(その2)

EPS, AI をPHPなどプログラムで変換するときのコツを書きます。(その2)

イラストレーター(.ai)
透過しているか? 透過していないか?(←ここは自己責任)
一枚の画像化されたレイヤ(PDF互換レイヤ)が印刷対象です。
(イラレでしか見れない他のレイヤは無意味ということです)

フォトショップ(.eps)
各レイヤが画像ですので、レイヤごとに一枚の画像ファイルとして出力されます。
レイヤごとに、印刷に使用されます。

ここで、よくあるトラブルが
イラレで透過していたのに、透過していないポスターが何百枚も出来上がってきた。

イラレは「PDF互換の1レイヤ」のみが利用されます。
それが透過していなかったのなら、入稿した人の原因です。

そういう理由で
イラレで入稿した場合「png」で入稿し直してくださいと言われることも多いです。
「イラレのPDF互換」できちんと透過できている場合は、言われません。
「イラレのPDF互換で透過」の難しさを知っている人は、EPSかpngで入稿しています。
なんでイラレはダメなの?
そんな印刷トラブルが多いようです。

次回は、プログラムで、EPS, AIを 自動変換してみます。

php(ImageMagick)で EPS, AI 画像に変換する(その1)

EPS, AI をPHPなどプログラムで変換するときのコツを書きます。

イラストレーター(.ai)
レイヤは、画像ではなくベクトルデータです。
保存の時に「PDF互換」にチェックを入れると、全レイヤを統合した画像データが
一枚目のレイヤとして保存されます。
この一枚のレイヤのみが、印刷に使用されます。
(イラレでしか見れない他のレイヤは無意味ということです)

フォトショップ(.eps)
各レイヤが画像ですので、レイヤごとに一枚の画像ファイルとして出力されます。
レイヤごとに、印刷に使用されます。

みなさんお気づきと思いますが(←そんなこと、知ってるよという人がほとんどだと思います)
↓イラレは画像処理ソフトではないのです。PDF互換の一枚のレイヤ画像のみが利用されます。
http://d.hatena.ne.jp/akane_neko/20130418/1366236806

印刷屋さんが扱う場合も、プログラムで自動処理を行う場合も
全く同じことができます。

印刷屋さんも(.ai)のソフト上で透過していても
『イラレの「PDF互換」で透過』していないものは、透過しないまま印刷されます。
(当然です)

次は、もう少し具体的に説明します。

css TOPへ戻るボタン(フローティング、フェード)

HTML

<p id="page-top"><a href="#page">PAGE TOP</a></p>

javascript

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
	var topBtn = $('#page-top');	
	topBtn.hide();
	$(window).scroll(function () {
		if ($(this).scrollTop() > 500) {
			topBtn.fadeIn();
		} else {
			topBtn.fadeOut();
		}
	});
	//スクロールしてトップ
    topBtn.click(function () {
		$('body,html').animate({
			scrollTop: 0
		}, 500);
		return false;
    });
});
</script>

CSS

#page-top {
    position: fixed;
    bottom: 20px;
    right: 20px;
    font-size: 77%;
}
#page-top a {
    background: #666;
    text-decoration: none;
    color: #fff;
    width: 100px;
    padding: 30px 0;
    text-align: center;
    display: block;
    border-radius: 5px;
}
#page-top a:hover {
    text-decoration: none;
    background: #999;
}

css 画像を親要素の枠に収まる最大限で拡大縮小

#shop_detail .img1 {
	display: block;
	width: 400px;
	height: 300px;
	padding: 10px;
	border: 1px solid silver;
	display: table-cell;
}
#shop_detail .img1 .img1_box {
	display: block;
	width: 380px;
	height: 280px;
	text-align: center;
	object-fit: cover;
}
#shop_detail .img1 .img1_box img {
	width: 380px;
	height: 280px;
	object-fit: contain;
}

EC-CUBEをログイン状態にする

EC-CUBEをログイン状態にする(2.11系)

他のシステムでログイン中のユーザーが
連動したEC-CUBEにログイン状態を維持する場合などに利用。

data/class/CS_Customer.php
186行目付近

function isLoginSuccess($dont_check_email_mobile = false) {
// ログイン時のメールアドレスとDBのメールアドレスが一致している場合
if (isset($_SESSION['customer']['customer_id'])
	&& SC_Utils_Ex::sfIsInt($_SESSION['customer']['customer_id'])
) {
	$objQuery =& SC_Query_Ex::getSingletonInstance();
	$email = $objQuery->get('email', 'dtb_customer', 'customer_id = ?', array($_SESSION['customer']['customer_id']));
	if ($email == $_SESSION['customer']['email']) {
	// モバイルサイトの場合は携帯のメールアドレスが登録されていることもチェックする。
	// ただし $dont_check_email_mobile が true の場合はチェックしない。
	if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE && !$dont_check_email_mobile) {
		$email_mobile = $objQuery->get('email_mobile', 'dtb_customer', 'customer_id = ?', array($_SESSION['customer']['customer_id']));
		return isset($email_mobile);
	}
	return true;
	}
}
return false;
}

上をコメントアウトして、下のように希望のコードに変える。
この処理でログイン状態にはなるが、擬似ログインとも言える。
決済に必要な情報がセッションにあるかどうかは、確認し適宜補填すること。

下の例は、他のシステムにログインしていると「$_SESSION[‘member_id’]」がNULLでない。
その場合、EC-CUBEでもログイン状態と認めるケース。

function isLoginSuccess() {
	if($_SESSION['member_id'] != ''){
		return true;
	}else{
		return false;
	}
}

フォームの入力文字の型をチェック(エンコードで違いあり)

カタカナその他2バイト文字の正規表現はエンコードによって異なるので注意が必要。
正規表現の末尾の「u」があるので、UTF8の場合の例です。


// check
$error = 0;
// email
if(preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/iD', $_SESSION['f5'])){
	
}else{
	$error = 1;
	$error_email = '<div class="red">メールアドレスが不正です。</div>';
}
if(!preg_match( "/[\@-\~]/" , $_SESSION[f6])) {
	$error = 1;
	$error_email = '<div class="red">パスワードが不正です。</div>';
}
// password
if($_SESSION[f6] != $_SESSION[f6a]){
	$error = 1;
	$error_pw = '<div class="red">パスワードが一致しません。</div>';
}

if($_SESSION[f6] == ''){
	$error = 1;
	$error_pw = '<div class="red">パスワードを入力してください。</div>';
}

// zip-code 半角数字以外を削除
if($_SESSION[f7] != ''){
	$_SESSION[f7] = preg_replace("/ー|−|―/", "-", $_SESSION[f7]);
	$_SESSION[f7] = preg_replace("/--/", "-", $_SESSION[f7]);
	$_SESSION[f7] = preg_replace('/[^0-9_-]/', '', $_SESSION[f7]);
	$_SESSION[f7] = preg_replace('/[^0-9a-zA-Z]/', '', $_SESSION[f7]);
}
// tel
if($_SESSION[f11] != ''){
	$_SESSION[f11] = preg_replace("/ー|−|―/", "-", $_SESSION[f11]);
	$_SESSION[f11] = preg_replace("/--/", "-", $_SESSION[f11]);
	$_SESSION[f11] = mb_convert_kana($_SESSION[f11], "a", "utf-8");
	$_SESSION[f11] = preg_replace('/[^0-9_-]/', '', $_SESSION[f11]);
}
// 名前カナ
$error_name_kana = '';
if($_SESSION[f3] != ''){
	if(!preg_match("/^[ァ-ヶー]+$/u",$_SESSION[f3])){
		$error = 1;
		$error_name_kana = '<div class="red">カタカナで入力してください。</div>';
	}
}
if($_SESSION[f4] != ''){
	if(!preg_match("/^[ァ-ヶー]+$/u",$_SESSION[f4])){
		$error = 1;
		$error_name_kana = '<div class="red">カタカナで入力してください。</div>';
	}
}
// shop_name
if($_SESSION[f13] != ''){
	if(!preg_match("/^[ァ-ヶー]+$/u",$_SESSION[f13])){
		$error = 1;
		$error_shopname_kana = '<div class="red">カタカナで入力してください。</div>';
	}
}

メールアドレスかどうかをチェックする

フォームに入力されたメールアドレスをチェックする

個人的には正規表現を使うのがおすすめ
むやみに便利な関数を使うと、phpのバージョンアップで動かなくなく可能性が高い

正規表現のパターンマッチで

f(preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/iD', $mailaddress)){
     return '正しいメールアドレスです';
}else{
     return '正しくないメールアドレスです';
}

filter_var関数で

if(filter_var($mailaddress, FILTER_VALIDATE_EMAIL)){
     return '正しいメールアドレスです';
}else{
     return '正しくないメールアドレスです';
}

filter_var関数の方がソースコードが短縮できるように見えるが、
関数を読み込んで処理されるまでの見えない部分を考慮すれば
圧倒的に正規表現のほうがロスが少ない。

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