へっぽこコーダー備忘録

phpやらjavascriptやら、使った技術をすぐに忘れちゃうから、おぼえがき程度に書いていきまーす

jQueryでデバイスがスマホかどうか判別☆

下記のURLへ引っ越しました。
http://hepocoder.com/
10秒後に移動しますm(__)m

タイトルの条件判定方法を忘れないように書いときます☆

 

var agent = navigator.userAgent;
if( agent.search(/iPhone/) != -1 || agent.search(/Android/) != -1){
/* ここにスマホの場合の動作を記述 */
}

 

 

フォームの結果先から前のページに戻ると「ドキュメントが有効期限切れです」になっちゃうときの対処☆

下記のURLへ引っ越しました。
http://hepocoder.com/
10秒後に移動しますm(__)m

PHPを使用し、フォームでの絞り込みを使用したサイトで、結果ページからブラウザの「戻る」ボタンで前のページに戻ろうとすると、

f:id:sawayaka4kumi:20150403152855p:plain

ってなっちゃいました。

「再試行」を行うとページは表示されるのですが、不恰好なので「再試行」を行わずとも、戻った時点でページが表示されるようにしたい!

 

ということで、調べてみました。

まず、わたしの環境は、Wordpressベースで、formの条件をsessionでも持ち歩いております。

で、session周りの問題だろうと思い検索すると、ありがたいことに同じ悩みを持った人がたくさんいました。

結果的には、

session_start();

の前に

session_cache_limiter("none");

やら
session_cache_limiter("private_no_expire");
を書いてやると解決しました!って人がいっぱい☆
 
session_cache_limiterの設定については↓のサイトを見てね☆
なので、
session_cache_limiter("private_no_expire");

session_start();

 

って書いてやって終わりだ!って安心していたのですが、そうでもなかった!

Wordpressを使用していたため、

 そもそも「session_start();」の記述がヘッダにない(汗)

「session_start();」を書かなくてもsessionは使用できているのですが。。。

 

とりあえず、funcion.phpにアクションフックで

function init_sessions() {
    if (!session_id()) {
    session_cache_limiter("private_no_expire");
    session_start();
    }
}
add_action('init', 'init_sessions');

を追加してやりました。

これでヘッダに必要な設定を書き込めただろうと思い、ブラウザで動きを確認するも

f:id:sawayaka4kumi:20150403152855p:plain。。。。。

 

もはや、wordpressで「session_start();」とか記述するのが間違っているのか。。。

 

で、調査を続けること数十分。キャッシュデータの使用云々をヘッダ情報に直接指定してやればよいとの情報を発見!

またもやfunction.phpを開き、今度は、

function add_header_session() {
    header("Cache-Control: private");
    header("Pragma: no-cahce");
    header("Expires: ");
    header("Last-Modified: ");
}
add_action( 'send_headers', 'add_header_session' );

を記述。

最後の希望にすがりながらブラウザを更新し、

「戻る」ボタンをクリックすると、ちゃんと前のページが表示されるようになりました^^

 

Wordpressで、カテゴリーをURLにしたけど、複数のカテゴリーを登録するとIDの小さいカテゴリがURLになっちゃう(汗)

下記のURLへ引っ越しました。
http://hepocoder.com/
10秒後に移動しますm(__)m

Wordpressの投稿URLを「ドメイン/カテゴリ/投稿名」ってしてやったときに、ちょっと問題が発生しちゃいました。

その問題というのは、投稿にカテゴリを複数設定してやった場合に、URLに含まれるカテゴリがIDの小さい順に優先されてしまうというものです!


例えば、投稿作成時、カテゴリ「food」、投稿名「shop1」にしたとき、投稿URLを「http://sample.com/food/shop1」ってしたいとします。

この場合、投稿に設定するカテゴリが「food」だけなら、なんら問題はないですね。

しかし、投稿に「food」「area」という複数のカテゴリを設定した場合、話は変わってきます。

 

仮に「food」のIDが「1」、「area」のIDが「2」ならば、URLは目的の通り、

http://sample.com/food/shop1

となりますが、「area」のIDが「1」、「food」のIDが「2」であった場合、URLは

http://sample.com/area/shop1」となってしまうのです!


どうやら、IDの小さい方がURLとして読み込まれちゃう感じ;

 

カテゴリ数が少ない場合は、カテゴリを操作して対応できますが、大量にカテゴリがある場合はどうしようもない!

 

で、困っていた時に発見したプラグインが「Slightly troublesome permalink」です☆

 

URLにカテゴリを使用する場合、どのカテゴリを優先的に使用するかの優先順位を付けることができます。

 

使用方法も非常に簡単で、

「インストール」→「有効化」→サイドメニュー「設定」→「カテゴリーの優先度」

を選びます。

表示された画面の右カラムにカテゴリの一覧が表示されていますので、そこから優先したいカテゴリを左カラムに持って来て、設定を保存すれば完了です!

 

めちゃくちゃ便利なプラグインですねー^^

 

ちなみに、今回の「ドメイン/カテゴリ/投稿名」ってURLを使用する場合の、パーマリンク設定は、「/%category%/%postname%/」です!

 

Photoshopのブラシやパターンの保存場所

下記のURLへ引っ越しました。
http://hepocoder.com/
10秒後に移動しますm(__)m

Photoshopのブラシやパターンを追加するとき、操作画面上からでもできますが、そのファイルってどこに保存されてるの?ってことで、保存先を忘れないように書いておきます☆

C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Presets\

このフォルダの中に「Brushes」「Patterns」などのフォルダがあって、この中にブラシやパターンのファイルが保存されています。

ネットから拾ってきた、拡張子「.abr」(←ブラシ用)とか「.pat」(←パターン用)などのファイルを直接このフォルダに入れてやってもOKですね^^

phpで配列の要素をコンマで区切って取得する☆

下記のURLへ引っ越しました。
http://hepocoder.com/
10秒後に移動しますm(__)m

配列で保持しているデータを「,」で区切って取得してみました。

 

不動産サイトみたいな感じで、条件での絞り込みを使ったサイトを作っていたのですが、条件を選んでその結果を表示させたとき、「この条件で絞り込んでます」っていうのを表示したいってことになりました。

 

今回は、選んだ条件を地域や金額ごとの配列に入れて保持していたので、単純に各配列の中身を取得できたらいいかなと。あと、取得して表示するときに「,」で区切っておきたいなと。

 

で、この動作を一気にやってくれるのが、今回使用したimplode関数です。

 

使い方はこんな感じ。

 

条件として選ばれた地域が配列に入っているとします。

$area = array('東部','西部','南部');

 

この配列を「,」で区切って表示させる

echo implode(',', $area);

 

これでOKです。

implode関数の1つ目の引数が区切りに使う文字、2つ目の引数が対象の配列です。

上の出力結果は、

東部,西部,南部

と出力されます。

 

もちろん関数の1つ目の引数は何でも大丈夫なので、

echo implode('|', $area);

とすると、

東部|西部|南部

となります。

 

すごく便利な関数です^^

 

ちなみにこの逆で、文字列を、指定した区切りで分けて配列にしてくれるexplode関数もあります。

$area = explode('|', '東部|西部|南部');

としてやると、

$area = array('東部','西部','南部');

になっちゃいます。

 

併せて覚えておくと便利ですねー☆

 

PHPで部分ごとの処理時間を調べる

下記のURLへ引っ越しました。
http://hepocoder.com/
10秒後に移動しますm(__)m

DBからデータを取ってきたり、foreachでデータを処理したりしてたら、急にページの表示がめちゃくちゃ遅くなっちゃいました!

原因はデータ取得時に、JOINでテーブルをつないで大量のデータを取りまくってたことだったのですが、原因がわかるまでは、どこの表示が一番問題なのかがわからない。。。

なので、怪しい部分ごとに、処理時間を計測しようかなと思い、方法を調査しました。

で、使いやすい関数を作っていてくれた方がいらっしゃいましたので、それを使用させてもらいました☆

まず関数はこれ↓

function measure() {
  list($m, $s) = explode(' ', microtime());
  return ((float)$m + (float)$s);
}
 
この関数をPHPファイルに書いてやって、あとは処理時間を計りたい部分を以下のようなコードで囲んでやれば大丈夫です。
$start = measure();
-----------
処理時間を計りたい部分のコード
ーーーーーーーーーーー
echo (measure() - $start);
 
おかげさまで、各コンテンツの処理時間や問題部分が発見できました。
 
詳しくはこちら様のサイトに記載されております。

phpで処理時間を計測する | CoDE4U

SQL文のORDER BYで桁違いの数字がうまくならばない!!

下記のURLへ引っ越しました。
http://hepocoder.com/
10秒後に移動しますm(__)m

データを金額順にソートするときにうまくいかなくて困ったので、覚書き☆

 

やっていた作業は、以下のような値(今回は金額でした)の昇順への並べ替えです。

金額
2300
6450
1500
3500
12000

 

データベースから値を取得して昇順への並べ変えだから、単純に下記のコードを書いてみました。

SELECT * FROM table_name ORDER BY price ASC

結果はこんな並びに↓

金額
12000
1500
2300
3500
6450

 

なんかケタを無視して頭の数字の小さい順にならんでる!

検索するとCASTを使って文字列から数字に変えればいいよって書き込みが結構あったので試してもうまくいかない><

 

調査を進めると、どうやら今回の問題は数字の桁が違うところにある様子。

どういう状態にすれば都合がいいかというと、こんな感じに桁を揃える。

 

金額
002300
006450
001500
003500
012000

 

じゃぁ、桁を揃えるにはどうすればいいの!?ってことで行きついたのがLPAD関数です。
LPAD(カラム名,桁数,埋める値)
って感じでかくと、カラムの値を、指定した桁数まで、指定した値で埋めてくれるようです。

今回の場合だと、このように指定しました。

LPAD(price,6,0)

 

SQL文としてはこんな感じですね。

SELECT * FROM table_name ORDER BY LPAD(price,6,0) ASC

 

すると6ケタに満たない部分を0がうめてくれるので、数字が小さい順に並んでくれて、データの並び替えもうまくいきました。