PHP・MySQL

MySQLでデータを間引く簡単な方法

データ自体はかなり細かく保存されているが、欲しいのは大まかなデータで良い時、
select文で条件をいろいろつけて取り出すのもひとつの方法だが、まずは一気に取得してしまってから、出力する前に間引くというのもひとつの方法。

例えば、カラムにタイムスタンプがあれば、以下の方法で、同一分は一度だけ出力することができる。

$output = "";
while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
$update_jf = date("Hi", $col['time']);
if($update_jf != $sumi_jf){
$output .= $col['main'];
}
#出力済時分にセット
$sumi_jf = $update_jf;
}

さらに簡単にしたいなら、以下の方法(2分の1に間引き)

$output = "";
while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
if($n % 2 == 0){
$output .= $col['main'];
}
$n++;
}

3分の1に間引きたければ以下の方法

$output = "";
while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
if($n % 3 == 0){
$output .= $col['main'];
}
$n++;
}

PHPで呼び出し元(リファラー)をチェックしたい時はこの方法

リファラーの偽装は比較的簡単だが、何もしないよりは無駄なアクセスを防ぐことができるから、ひとつの方法として知っておくといいだろう。

リファラーをチェックして、他のドメイン等からの呼び出しを排除するサンプル

$referer = $_SERVER['HTTP_REFERER'];
$ref_url = split("/",$referer);
$my_url = 'www.digital-gate.com';
if(strcmp($ref_url[2],$my_url)!=0){die();}

簡単に説明すると、

$_SERVER['HTTP_REFERER']

でリファラーを取得

split("/",$referer);

「/」で分割

$ref_url[2]

にhttp://より後が入る

$my_url = 'www.digital-gate.com';

正しい呼び出し元を設定

if(strcmp($ref_url[2],$my_url)!=0){die();}

含まれなければ終わり

phpで呼び出し元のひとつ上の階層のディレクトリ名を取得したい時

例えば

http://www.digital-gate.com/apple/mac/okiniiri.php

の時

php「okiniiri.php」の中で二つ上のディレクトリ「apple」を取得するには以下のようにすればいい。

$callurl = $_SERVER[PHP_SELF];
$dname_arr = explode("/",$callurl);
$name = $dname_arr[2];

$nameには「apple」が入っている。

階層が例よりもさらに深い場合は、[2]を[3]や[4]にしていけばいい。

phpで呼び出し元のディレクトリ名を取得したい時

例えば

http://www.digital-gate.com/mac/okiniiri.php

の時

php「okiniiri.php」の中で上のディレクトリ「mac」を取得するには以下のようにすればいい。

$callurl = $_SERVER[PHP_SELF];
$name = basename(dirname($callurl));

$nameには「mac」が入っている。

さくらインターネットで空メール登録プログラムを使いたい場合の設定

その1(メールボックスのフィルター設定)
メールフィルターの設定は以下の手順で進めば簡単にできます。

まずは空メール用のアカウントを作成

メールアドレスの管理→メールアドレスの追加

Webメールを開く

メールアドレス毎の設定→ウェブメール

Webメールの上部メニューから転送設定

Webメール→メール→設定→メールの転送→新規作成→仮転送用メールアカウント(hogehoge@hoge.com)→OK

設定するとメールアカウントに.mailfilterが出来上がる

/home/アカウント名/MailBox/メールアカウント

を開き

.mailfilter

をダウンロード(ドットファイルが非表示の場合はサーバー上で先に「_mailfilter」等にリネームしておくといい)

cc “!hogehoge@hoge.com”

という一行を以下に変更

再びサーバーにアップロード(リネームした場合は.mailfilterに直すのを忘れずに)

to “| /usr/local/bin/php -q /home/アカウント名/www/karamail/kara_mail.php”

これで

http://アカウント名.sakura.ne.jp/karamail/kara_mail.php

にあるプログラムにサーバーにメールが届くとデータが渡されるようになった。

渡されたデータの処理については「その2」で説明します。

phpのcount()を使った時、バグに陥りやすい注意点

変数$a、$b、$c、$dがある。
それぞれに下のような値を与えたものをcountしたらどうなるか。

#何もセットしない→$a
$b = “”;
$c = null;
$d = array();

「当然、全部中身が空だから0が返される」と思いがち。

echo count($a);
echo count($b);
echo count($c);
echo count($d);

結果は
「0」「1」「0」「0」

一回でPHPで文字をカットしつつ「…」等を追加したい時はこの方法

タイトルや紹介文、URLなど、様々な文字数が想定される場合、きちんと文字数での切り詰めをしておかないとレイアウトが崩れたりすることがある。

PHPで日本語の文字数カットには多くの場合mb_substrを使う方法が紹介されているが、文字を切り詰めた場合に「…」等を付加して元の文字が省略されていることを明示的にしたい場合、文字数のカウントをしておかないといけないためスマートとは言えない。

例)mb_substrを使う方法

最初にmb_strlenで文字数を数え、指定文字数よりも多い場合はmb_substrで切り詰める
そのまま使えるコードのサンプルは以下

$str = "ABCDEFG1023457890ABCDEFG1023457890";
$cut_num = 20;
if(mb_strlen($str) > $cut_num){
$str_cut = mb_substr($str,0,$cut_num,"UTF-8")."...";
}else{
$str_cut = $str;
}

省略した時の表示処理も含めたい場合はmb_strimwidthを使うといい。

そのまま使えるコードのサンプルは以下

$str = "ABCDEFG1023457890ABCDEFG1023457890";
$cut_num = 20;
$str_cut = mb_strimwidth($str,0,$cut_num,"...","UTF-8");

わずか一行で、指定文字数を越えた場合はカットして「…」を追加、指定文字内の場合はそのままとなる。

WordPress PDA & iPhoneをコメント対応にカスタマイズする方法

WordPressをスマートフォンに対応させるプラグイン「Wordpress PDA & iPhone」はスマートフォンからの閲覧時にコメントの表示や書き込みができない。
本格的なスマートフォンでの運用を考えた場合、コメントも重要。
一般的な方法としては、テンプレートに

<?php comments_template(); ?>

<?php comments_template('comments.php'); ?>

を追加するのだが、
上記の場合、呼び出されるcomments.phpは同階層のcomments.phpではなく

/wp-includes/theme-compat/comments.php

が呼び出されてしまう。

comments.phpの中身をカスタマイズしないのであればそれでも構わないが、例えばコメントフォームにある「ウェブサイト」を消したい場合やスタイルに手を入れたい場合、このファイルを修正してしまうと、バージョンアップの度に修正しなくてはならなくなる。

同階層のcomments.phpを呼び出す場合は、

<?php comments_template('/comments.php'); ?>

とファイル名の前に「/」を入れる。

なお、
元に入っているcomments.phpの中身は

<?php if ( have_comments() ) : ?>
<?php endif; ?>

だけなので、

/wp-includes/theme-compat/comments.php
のファイルをコピーして修正して、置き換えればいい。

具体的な、コメントを呼び出すための修正は以下の通り

page.php

ファイルの場所は
/wp-content/plugins/wp-pda/jqmobile-theme/page.php

ファイルを開き

<div><?php the_content(); ?></div>
<p>
<small>
<?php echo sprintf(__('This entry was posted on %1$s at %2$s and is filled under:','pda-theme'), the_date(__('l, F jS, Y','pda-theme'), '', '', FALSE),get_the_time()) . " "; the_category(', ');?>
</small>
</p>
</div>
<?php endwhile; else: ?>

の箇所に追加して

<div><?php the_content(); ?></div>
<p>
<small>
<?php echo sprintf(__('This entry was posted on %1$s at %2$s and is filled under:','pda-theme'), the_date(__('l, F jS, Y','pda-theme'), '', '', FALSE),get_the_time()) . " "; the_category(', ');?>
</small>
</p>
<?php comments_template('/comments.php'); ?>
</div>
<?php endwhile; else: ?>
</div><!-- /content -->

となるようにする。

————————————————————————————

single.php

ファイルの場所は
/wp-content/plugins/wp-pda/jqmobile-theme/single.php

ファイルを開き

<div><?php the_content(); ?></div>
<p>
<small>
<?php echo sprintf(__('This entry was posted on %1$s at %2$s and is filled under:','pda-theme'), the_date(__('l, F jS, Y','pda-theme'), '', '', FALSE),get_the_time()) . " "; the_category(', ');?>
</small>
</p>

の後ろに追加して

<div><?php the_content(); ?></div>
<p>
<small>
<?php echo sprintf(__('This entry was posted on %1$s at %2$s and is filled under:','pda-theme'), the_date(__('l, F jS, Y','pda-theme'), '', '', FALSE),get_the_time()) . " "; the_category(', ');?>
</small>
</p>
<?php comments_template('/comments.php'); ?>

となるようにする。

WordPressで記事抜粋のdescriptionと記事タグをkeywordsに自動挿入する方法

通常、ヘッダに入るmetaタグのdescriptionとkeywordsは全ページ共通のことが多いが、SEOに適したヘッダにするためには、各ページ毎に合わせたmetaタグでdescriptionとkeywordsを設定しておくのが好ましい。

WordPressのプラグイン、All in One SEO Packは各記事に対して個別のdescriptionとkeywordsを設定することができるが、WordPress PDA & iPhoneのような特殊なテンプレートでは反映されないケースが生じる。

そういった場合に対応し、descriptionには記事の抜粋、metaタグのkeywordsには記事で設定したタグが自動で入るようにする。

以下のコードを既存のメタタグ部分と差し替え、または挿入する。
なお、前半、descriptionの部分にある「160」は抜粋(カット)する文字数なので、160文字も必要ないという人は適宜変更してもらいたい。
また、キーワードに関してはgoogleは一切評価しないとも言われているが、SEO全体としてkeywordsもきちんと記載することが好ましいと考える。
下記のコードではタグに設定したものを半角カンマ区切りで書き出し、タグが未設定のものはデフォルトのキーワードを書き出す。

<meta name="description" content="<?php
$descrip = mb_substr(ereg_replace("(\r|\n|\r\n)","",strip_tags($post->post_content)),0,160)."...";
if(is_single()){echo $descrip;}else{bloginfo('description');}
?>" />
<meta name="keywords" content="<?php
$tags = get_the_tags();
if($tags){
$total = count($tags); $count = 1;
foreach($tags as $tag){
if($total == $count){echo $tag->name;}else{echo $tag->name . ', ';}
$count++;
}
}else{echo 'デフォルトのキーワード';}
?>" />

 

WordPressのスマホ用プラグインwp-pdaのカラーカスタマイズはこの方法

iPhone・Android等のスマートフォンに対応させるWordPress用のプラグインWordpress PDA & iPhone(wp-pda)はベースにJquery mobileを使用している。
そのためwp-pdaの配布ファイルでは、ウェブサイトを高速化するため、jquery、jquery mobileの各javascriptおよびスタイルシートcssはCDNで直接呼び出しており、CSSを使ったカスタマイズが分かりにくいという難点がある。
デフォルトでは黒いタイトルラインとブルー系のナビボタン、日付になっているが、これを変更したいと思うことは多いはず。
色の変更であれば、意外なほど簡単に配色をカスタマイズしてサイトのデザインを変えることが可能なので紹介。

修正するのは以下のファイル
wp-content/plugins/wp-pda/style.css

ファイルを開き、最後に以下のスタイルシートを追加する

.ui-btn-active,
.ui-bar-b,
.ui-bar-c {
background: #fff;
color: #fff;
font-weight: bold;
border: 1px solid #bf0059;
text-shadow: 0 -1px 1px #bf0059;
text-shadow: none;
background-image: -webkit-gradient(linear, left top, left bottom, from( #ffbbca), to( #ff90a7));
background-image: -webkit-linear-gradient(#ffbbca, #ff90a7);
background-image: -moz-linear-gradient(#ffbbca, #ff90a7);
background-image: -ms-linear-gradient(#ffbbca, #ff90a7);
background-image: -o-linear-gradient(#ffbbca, #ff90a7);
background-image: linear-gradient(#ffbbca, #ff90a7);
}

各項目の解説

background:
ヘッダ、タイトル、ナビ選択状態の背景色

color:
ヘッダ、タイトル、ナビ選択状態の文字色

border:
回りのラインの色(同系色の濃いめにすると良い)

text-shadow:
タイトル文字の影(同系色の濃いめにすると良い)

background-image:
複数あるが、多くのブラウザに対応させるためのもの(同じ色で指定していく)