あなたの趣味を長く続けるために


あなたは「趣味が続かない」と思ったことはありませんか?

「時間が無い」「飽きた」「他のことをやりたくなった」
これらは当たり前のことです。人間は飽きますし、いろいろとやってみたくなるものです。

どうしても続けたい趣味があるなら、私から少しアドバイスできることがあります。

私は3年以上ブログを書き続けています。
趣味の一環として今でも楽しんでいます。

野球、サッカー、自転車、ミニ四駆、科学論文購読、ニュース購読、プログラミングなどすべて2年以上続いています。
プログラミングは15年も続いています。

なぜこんなに続くのか?
その方法を3点でシンプルにまとめました。

  • 完全を求めない
  • 定期的に
  • その時は本気で

「完全を求めない」は、やり込みすぎると自分や他人の悪い所が目につくようになってきます。
しかも技術は日進月歩。
完成することはありません。
「やりたい」から「やらなければならない」となる前に切り上げるのがコツです。

「定期的に」は、期間が空くと人間は面白かった、興奮した記憶を忘れてしまいます。
定期的に行うことで、「そういえばこうだったな」と思いだすことができます。
人が興味を失うのは多くの場合、その記憶を忘れてしまうことに起因しています。

「その時は本気で」は、手を抜いてやっても本当の面白さは見えてこないからです。
特にスポーツがそれに当てはまります。
自分が好きで、本気を出せるモノは必然的に面白くなります。

以上の3点、いかがでしたか?
どうしても嫌になったら離れるのも一つのコツです。

[PHP]まとめ読みをPSRで改良する(4)


まとめ読みをPSRで改良する(3)から約一週間。

こんがらがっていた頭の中がすっきりして、なんとなくですがオブジェクト指向がわかってきたような気がします。

オブジェクト指向で大事そうなのは、機構(機能の固まり)を分けること。
データベースへの通信ならそれだけで1つの変数に格納する。

たとえば「$dataBase->….;」という感じで。

これだと名前空間の汚染?が無くなる。自作の関数被りが無くなるって言った方がわかりやすいかな。

そしてPSR規則にのっとりつつ・・・って感じですね。

<?
require_once 'SplClassLoader.php';
require_once 'password.php';
require_once 'Mobile_Detect.php';

// クラスローダー
$classloaderBase = new SplClassLoader('ReiFarms', './lib');
$classloaderBase->register();

// 拡張
$dataBase = new ReiFarms\DataBase();
$config = new ReiFarms\Matomeyomi\Config();
$display = new ReiFarms\Matomeyomi\Display();

// MySql
$dataBase::setInfo($config->dbInfo);

携帯判定(mobile_detect)もそのまま使えました。

// 携帯判定
$detect = new Mobile_Detect;
if(empty($_SESSION['isMobile']))
{
    $_SESSION['isMobile'] = $detect->isMobile() ? true : false;
}

これは便利!

本題のプログラムはこんな感じで書いています。
今のところは問題はなさそう。

<?php
require_once './lib/Matomeyomi.php';

// DataBase
$dataBase->connectDb();

// Html
$html = null;

// 初期設定
$blogAll = [];
$blogWeekCount = [];
$blogAllCount = [];
$htmlArticleWeek = null;
$htmlArticleAll = null;
$htmlBlogWeek = null;
$htmlBlogAll = null;

// 初期読み込み
$sql = $dataBase->query("SELECT * FROM blog");
if($sql){
    while($Blog = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        $blogAll[$Blog['id']] = $Blog;
        $blogWeekCount[$Blog['id']] = $Blog['count'];
        $blogAllCount[$Blog['id']] = $Blog['count_all'];
    }
    
    // 記事ランキング
    $i = 1;
    $sql = $dataBase->query("SELECT id, blogid, title, count, count_all FROM article ORDER BY count DESC");
    while($Article = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        if(!$Article['count'])
        {
            break;
        }
        // 取得
        if(empty($blogWeekCount[$Article['blogid']]))
        {
            $blogWeekCount[$Article['blogid']] = 0;
        }
        $blogWeekCount[$Article['blogid']] += $Article['count'];
        if(empty($blogAllCount[$Article['blogid']]))
        {
            $blogAllCount[$Article['blogid']] = 0;
        }
        $blogAllCount[$Article['blogid']] += $Article['count_all'];
        // 表示
        if($i < 50)
        {
            if($htmlArticleWeek)
            {
                $htmlArticleWeek .= "<tr><th></th></tr>\n";
            }
            $htmlArticleWeek .= $config->rankArray('Article', $i, $Article['count'], $Article);
            $i++;
        }
    }
    if(!$htmlArticleWeek)
    {
        $htmlArticleWeek = "<tr><th>データがありません</th></tr>\n";
    }
    
    // 人気記事
    $i = 1;
    $sql = $dataBase->query("SELECT id, blogid, title, count_all FROM article ORDER BY count_all DESC");
    while($Article = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        if(!$Article['count_all'])
        {
            break;
        }
        // 表示
        if($i < 50)
        {
            if($htmlArticleAll)
            {
                $htmlArticleAll .= "<tr><th></th></tr>\n";
            }
            $htmlArticleAll .= $config->rankArray('Article', $i, $Article['count_all'], $Article);
            $i++;
        }else{
            break;
        }
    }
    if(!$htmlArticleAll)
    {
        $htmlArticleAll = "<tr><th>データがありません</th></tr>\n";
    }
    
    // ブログランキング
    if($blogWeekCount)
    {
        arsort($blogWeekCount);
        $i = 1;
        foreach($blogWeekCount as $blogId => $num)
        {
            if(!$num)
            {
                break;
            }
            $Blog = $blogAll[$blogId];
            if($Blog['status'] != 1)
            {
                continue;
            }
            if($i < 50)
            {
                if($htmlBlogWeek)
                {
                    $htmlBlogWeek .= "<tr><th></th></tr>\n";
                }
                $htmlBlogWeek .= $config->rankArray('Blog', $i, $num, $Blog);
                $i++;
            }else{
                break;
            }
        }
    }
    if(!$htmlBlogWeek)
    {
        $htmlBlogWeek = "<tr><th>データがありません</th></tr>\n";
    }
    
    // 人気ブログ
    if($blogAllCount)
    {
        arsort($blogAllCount);
        $i = 1;
        foreach($blogAllCount as $blogId => $num)
        {
            if(!$num)
            {
                break;
            }
            $Blog = $blogAll[$blogId];
            if($Blog['status'] != 1)
            {
                continue;
            }
            if($i < 50)
            {
                if($htmlBlogAll)
                {
                    $htmlBlogAll .= "<tr><th></th></tr>\n";
                }
                $htmlBlogAll .= $config->rankArray('Blog', $i, $num, $Blog);
                $i++;
            }else{
                break;
            }
        }
    }
    if(!$htmlBlogAll)
    {
        $htmlBlogAll = "<tr><th>データがありません</th></tr>\n";
    }
}else{
    $htmlArticleWeek = $htmlArticleAll = $htmlBlogWeek = $htmlBlogAll = "登録されていません";
}

$html = $config::readHtml('ranking.html');

// 置き換え
$html = str_replace('${htmlArticleWeek}', $htmlArticleWeek, $html);
$html = str_replace('${htmlArticleAll}', $htmlArticleAll, $html);
$html = str_replace('${htmlBlogWeek}', $htmlBlogWeek, $html);
$html = str_replace('${htmlBlogAll}', $htmlBlogAll, $html);

// Display
$display::setHtml($html);
$display->sub();

// アクセス解析
$config->access();

最後で置き換え。
これでHTML中の何処へでも入れ込むことができるようになってます。
「便利だけどこれでいいのか!」という気持ちはありますね。

やっぱり、まだまだ未熟者。

楽して儲けるなんてものはない

BLOG IDEAS
あなたは「ブログで月○万稼ぐ方法」という広告・宣伝を見たことがあるだろうか。

「そんなうまい話はない」、「儲かるならやりたい」、「興味が無い」などと感じる方が多いだろう。

そこで私から話がある。

私が思うに、あなたが「どうしても書きたい」と思わないなら、やめておいたほうがいい。
時間の無駄だ。
そんなことより好きなことをやった方がいい。

彼らも彼らで、儲けるために広告を出している。
彼らには他人を説得させる数多くの戦略がある。

例えば「○○をすべき100の理由」が典型的なパターンだ。
これは社会学ですでに研究されており、実は「100個もあるのか。それなら間違いない。」という心理を利用したモノだ。
100個すべてが正しい必要はないし、最初の項目以外間違っていても問題にはなりにくい。

次に「東大教授が教える○○」などがある。
権威付けと呼ばれる手法で、「東大」と「教授」の権威を借りてその人の主張を正しいものに思わせる方法だ。
その問題点は「教授」であっても全く別分野であることが多々ある。その人自身が知っている範囲でなくても書けるのだ。
このことは他の分野の権威のある人にとっても応用可能だろう。

そして「バンドワゴン効果」を狙ったものがある。
これも研究されており、実は「3人」賛成(または反対)すれば、「集団心理を動かすことができる」ことがわかっている。
確かに100人、200人が賛同してるとすごく良い記事に見える。
しかし、「集団圧力」がある最低人数は3人だけで良いのである。

だが今、この戦略スキルを「形だけ」真似したサイトが非常に多い。
それらをお金を稼ぐ方法として利用している人が多い。
そして、その「プロ」を気取る輩すら居る。
そういう人たちに言いたい。
あなたたちのやっていることは表面的なもので「本物」ではない、と。

これらのテクニックを用いて「お金を稼ぐ」ことを目的としよう。
それはいつか破綻するに違いない。

なぜなら、人は「意識」と「行動」を合わせなければストレスを抱えてしまう弱い生物である。

その「意識」は外的要因ではなく、内的要因(心理欲求)で決定される。
内的要因は「何かをやりたい」という純粋な気持ちである。

「お金が欲しい」はあくまで外的要因であることに気づかなければならない。
外部に要求されてやることには気分が乗らない。
これは心理学的にも証明されている。

だが今、日本ではこの「意識」と「行動」が合致しない方向に社会が動いているのではないだろうか。
そうであれば、自殺やうつ、精神疾患などが減るはずもない。

そもそも、学校教育自体「成果を求めること」に終始している。
私は大学院まで進んだが、「欲求」を出すことを制止されたことはあるが、求められたことは全くない。
「人間は感情で動く」生物であることをさっぱり忘れているようだ。

人が最高のパフォーマンスを出せるのは「意識」と「行動」が合致した時であるのは間違いない。

だからこそ、あなたには「ブログを書くならお金を目的とするな」と言いたい。

現在、私は興味があることを何でもしている。
「そもそも大学院に進んで好きなことやってるの?馬鹿じゃないの?」と思われる方もいるかと思うが、そもそも大学院は「好きなこと」を究めるために行くものだ。
そこにある学歴なぞ付加物であり、目的ではないはずだ。

私は社会で揉まれたことがない。
私が知らない、あなた方の努力があるのは間違いない。
もし少しでも今を良くしたいのであれば、何かを始めるのもひとつの手である。

もし、「書きたい」という気持ちがあれば壁なんていくらでも超えられる。
だからこそ、あなたには納得して行動してほしいのだ。

知らなかった!「while」と「do while」の違い

amazing
Perl→PHPを独学でやって現在C言語をやってます。
「do{ ~ }while( ~ );」←ナニコレ状態でした。

「while」と「do while」の違いは、
「前」で条件判定をするか、「後ろ」でするかの違いだけでした。知らなかった・・・。

<?php
$i = 0;
while ($i > 0) {
    echo $i;
}
?>

実行結果は何も表示されません。

<?php
$i = 0;
do {
    echo $i;
} while ($i > 0);
?>

実行結果は「0」と表示されます。

何か使えそうだけど今は思いつかない\(^o^)/

Cで簡単プログラミング「二次関数の解」

C言語で簡単なプログラミングをしましょう!
今回は「二次関数の解」です。

↓Cはコンパイル(機械語に翻訳)が必要なので、以下でコンパイラの「MinGW」をインストールしてください。
C言語およびC++のコンパイラMinGWのインストールとテスト

二次関数の解を求める理由

理由は簡単です。
「物が落ちてくる秒数を予想できる」
「ある距離(高さ)まで飛ばすのにいくら力が必要かわかる」

「200mの高さから物体を落とすと何秒後に落ちる」がわかります!
暗算でできたらすごい!

コード

ファイル名は「2ji.c」にします。
コピー&ペーストではなく、自分で書くとGood!

/*--------------------------------------*/
// 2次方程式の解
/*--------------------------------------*/
#include <stdio.h>
#include <math.h>

int main()
{
	double a, b, c, d, x, x1, x2;
	
	// 係数読み込み
	printf("二次関数の係数a,b,cは?");
	scanf("%lf %lf %lf", &a, &b, &c);
	
	// 1次方程式の場合
	if(fabs(a) <= 1.0e-10)
	{
		if(fabs(b) <= 1.0e-10)
		{
			printf(" 解を求めることができません");
		}else{
			x = -c/b;
			printf(" x=%f\n", x);
		}
		
	}
	// 2次方程式の場合
	else{
		d = b*b-4.0*a*c;
		// 2実数
		if(d >= 0.0)
		{
			d = sqrt(d);
			x1 = 0.5*(-b-d)/a;
			x2 = 0.5*(-b+d)/a;
			printf(" x=%f %f\n", x1, x2);
		}
		// 虚数
		else{
			d = sqrt(-d);
			x1 = -0.5*b/a;
			x2 = 0.5*d/a;
			printf(" x=%f ± i%f", x1, x2);
		}
	}
	return 0;
}

結果、動き

コンパイルが成功すると以下のように表示されます。
コンパイル成功

いろいろと計算してみます。
適当になんでも好きなように!
計算してみる

「200mの高さから物体を落とすと何秒後に落ちる」答え
答え
約6.4秒後だそうです。
エレベーターが自由落下した時に使えるかもしれない無駄知識!

予想できるエラー

エラー1
In function main ”main”関数の中で、
12: error: stray ‘\129’ in program 12行目に”stray”(全角文字)があるよ!’\129’とかいう
12: error: syntax error before “G” “syntax”(構文)にエラーがあるよ!”G”の前に

文字コードエラー
文字コードエラーです。
「ShiftJis」に文字コードを変えてね!
文字コードって何?という方は→文字コードの基本と応用

ニッチで十分だ – ミニ四駆ブログまとめアクセス解析より

2011 Esri International User Conference
ミニ四駆ブログまとめのアクセス解析をしました。
いろいろ大切にしたいことを思いついたので書いておきます。

アクセス解析

ミニ四駆ブログまとめ
ユーザー数は「862」、少ない部類だと思います。
訪問数は「2692」、ユーザー数に比べて「異常な」数です。
ページビュー数は「8823」、ユーザー数から考えるととても「異常な」数ではないでしょうか?
これでまだ2~3ヶ月です。オソロシイ。

競合が居ないところを目指す

プラモデル → ミニ四駆
これで十分ニッチです。
でも、もっとニッチなところでも別にいい事に気づきました。

ミニ四駆 → (プログラミングが必要な)ブログまとめ
これなら1人だ!誰にも負けない!

競合を知る

競合相手となりそうなのは「ブログランキング」です。

あちらは「被アクセス数」で順位を決めています。
こちらは「最新情報」で順位を決めています。
どちらが公平でしょうか?

順位の操作もしようがありません。
あくまで公平に情報を伝えることができます。

機能は最低限でいい

ブログまとめサイトに必要なものは何?と考えた機能の最低限だけ入れました。

「最新記事が読める」「アクセスランキング」「人気記事・ブログ」「アーカイブ」「検索」

全部「私が欲しい」と思ったモノです。

ユーザーとして使うものを作る

「ある程度やり込んだ人なら何が欲しいのか?」の答えは「ある程度やり込んだ人」に聞くか、「ある程度やり込んだ人」になればいいのです。
そうなれば小難しいマーケティングは必要ありません。
自分の中に答えのほとんどは存在します。

「ユーザー」であって「製作者」であることはすごく幸せだと思います。
「本当に欲しいものは自分でしか作れない」とも思ってます。
だからこそ「プログラミングって面白いよ!」と言いたいわけです。

確かにGoogleや今の「爆速」Yahoo!はすごい。
自分で出来ないものが作られています。
でも、誰かができるなら自分でできるんじゃないの?と反抗的に思ってるのでありました。

ミニ四駆ブログまとめの成り立ち

あなたは何かに興味を持ってますか?

例えば釣りに興味があるなら、
場所、天気、エサの種類、使う器具の種類、オモリ、ポイント、リール自体、巻き方 ・・・などなど
を知りたいですよね?

私の場合釣りもそうなんですが、ミニ四駆が好きです。
ブログをずーっと読んでるとあまりにも数が多すぎるので「お気に入り」に入れるのが面倒になりました。

だから「ブログまとめ」という形を作ろうと思いました。

確かに「RSSリーダー」もあります。
「それでいいんじゃないの?」と思う方も多いかと。
でも、私はものぐさです。
「新しいのを探していちいち追加するのがめんどくさい・・・」
あなたにもこういった気持ちはありませんか?

ブログまとめを作ればメリットがいろいろあります。
「最新記事が読める」
「どういう記事が好まれるかわかる」→流行がわかる
「自動的にサイトが追加される」→うれしい(公募型でブログ登録をする必要あり)
「アクセスするだけでいい」→どこでも、どの機器でも、いつでも使える

「RSSリーダー」に足りない、客観的・流動的な情報が手に入ります!

これから気をつけること

大事なのは自分自身が「ユーザー」であること。
「ユーザービリティ?まず聞きたいのは、自分で使いたいと思うか?」を忘れずに更新していきたいと思います。

[PHP]まとめ読みをPSRで改良する(3)

Cord
(2)の記事から「PDO」を使い、データの通信をオブジェクト化しました。
password_hashを使い、パスワード処理の暗号化も行いました。

PDOを導入する一番の理由は「mysql_query」などは近い内に使えなくなるようです!

ネイティブドライバについては、もうひとつ注意すべきことがある。 PHP 用の mysql 拡張モジュールの開発はすでに終了しており、PHP 5.4.0 の時点での公式発表によると 「長期的には廃止予定」だ。つまり、近い将来に削除されるということであり、 PHP 5.6 (になるかどうかわからないけど、5.5 の次にくるやつ) の頃には使えなくなるだろう。
(PHP The Right Way.より)

PDOは「PHP Data Objects」の略で、どのデータベースを使っているかを隠蔽してくれるもの(のよう)です。
使えるのはMySQL、PostgreSQL、SQLiteなど。

PDOの接続方法

PDOの利用の方が詳しいですが、どう使うのかは載っていません・・・。

Class内の関数に入れるのなら

    // DBに接続
    public function connectDb()
    {
        $dsn = 'mysql:dbname=' . self::$dbInfo['name'] . ';host=' . self::$dbInfo['host'];
        try{
            self::$db = new PDO($dsn, self::$dbInfo['user'], self::$dbInfo['pass']);
        }catch (PDOException $e){
            print('Connection failed:'.$e->getMessage());
            die();
        }
    }

設定の書き方

public $dbInfo = [
        'host' => 'localhost', 'name' => 'database', 'user' => 'root', 'pass' => ''
    ];

設定を導入する関数と必要なものを記述すること!
これはDBに接続すると同じ所で使うといいかも?
(そもそも使い方がおかしいかもしれない)

    private static $dbInfo;
    private static $db;
    // DBの情報を設定
    public static function setInfo($dbInfo)
    {
        self::$dbInfo = $dbInfo;
    }
    // DBの接続切断
    public function disconnectDb()
    {
        self::$db = null;
    }

暗号化方法password_hash(password_compact)の使い方

さくらサーバーはPHP 5.4までしか使えない問題があります。
PHP5.5で導入された「password_hash」が使えない・・・。

↓解決策
PHP5.5から使える暗号化「password_hash」を「password_compact」を使って以前のバージョンで利用する
すごく簡単です。

現状

ミニ四駆ブログまとめ

  • 表示
  • PC、スマートフォン両方利用可能です。
    > PC表示
    PC
    > スマートフォン表示
    スマホ

  • PDOでのDB通信で安全化の強化
  • 「?id=1%3BDELETE+FROM+users」のようなデータを受け取らないようにしました。
    以前のバージョンではできます/(^o^)\

  • password_compactで管理パスワード比較の安全化
  • パスワード自体の変換(保存用)は「crypt」を使っています。

  • 読み込み速度の向上
  • 「使っていた関数を見直す」
    「更新されていないRSSを読まない」
    「RSS情報は受け取るが、日付がある程度過去の場合更新しない」
    「無駄な読み込みはなくす」

    まとめ

    現在、サイトの動作をテストしています。
    特に問題はなさそう。
    一週間行って問題がなさそうなら公開・配布しますね!

    でもオブジェクト指向の書き方、MVCの書き方にそぐわなさそうなので少しずつ改良していきます!

PHP5.5から使える暗号化「password_hash」を「password_compact」を使って以前のバージョンで利用する

Passwords, Logins
PHP最高の暗号化法としてPHP5.5から使える「password_hash」があります。

でもそれを、5.5未満のバージョンで使いたい!
特に私が使っている、さくらインターネットのサーバーはPHP 5.4までしか使えない問題があります。orz

書き方はすごく簡単なのに・・・

<?php
$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // パスワードが一致した
} else {
    // パスワードが一致しなかった
}

なんと!
「PHP5.3.7以降」なら同名のユーザー関数が使えるようにする「password_compact」があります。

password_compat

使い方はいたって簡単。

  • 「password_compat」にアクセスして右側にある「Download Zip」でファイルをダウンロード
  • 「lib/password.php」を置きたい場所にセットする
  • require ‘password.php’;でOK!
<?php                     
require 'password.php';

$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // パスワードが一致した
} else {
    // パスワードが一致しなかった
}

すごく簡単ですね!

※実際にソフトウェアで使用する場合はライセンス内容を確認してください。著作権内容とライセンス表示が必要です。(2018.09.24追記)

PHPでPC・スマホ・タブレット・携帯を判別するおすすめの方法

Smartphone
今まさにスマートフォン時代になってきています。
PHPでPCやスマートフォン、タブレット、携帯を判別してみましょう。
※この内容は2013年当時の方法です。

普通の判別法

$_SERVER['HTTP_USER_AGENT']

ユーザーエージェントで対応される方も多いかもしれません。

$UA = $_SERVER['HTTP_USER_AGENT'];
if (ereg("iPhone|iPod|Android.*Mobile|Windows.*Phone", $UA)) {
    // スマートフォン
}else{
}

これだと追加や削除が必要なので面倒です。

良い判別法

php-mobile-detectのライブラリ(MITライセンス)を使いましょう。
更新は最新版をダウンロード→インストールするだけ!

携帯・スマホ判定

function isMobile(){
    require_once('Mobile_Detect.php');
    $detect = new Mobile_Detect;
    $_SESSION['isMobile'] = $detect->isMobile() ? true : false;
    return $_SESSION['isMobile'];
}

PSR+オートローダーを使用する場合の判定法
「MobileDetect.php」にファイル名を変更します。
そして「MobileDetect.php」の2行目にnamespaceを設定します。

呼び出しする関数は以下のように設定します。

    private function isMobile()
    {
        $delect = new MobileDetect;
        $_SESSION['isMobile'] = $delect->isMobile() ? true : false;
        return $_SESSION['isMobile'];
    }

判別法

if($_SESSION['isMobile'] || isMobile()){
    // 携帯・スマホ
} else {
    // それ以外
}

簡単ですね!

[PHP]PDO、2つ以上の項目からLIKE検索

Book
データベースからPDOを使ってデータを抜き出したい!
そして「bindParam」で安全に検索しよう。そうしよう。

しかし、見事にハマりました。/(^o^)\

解決方法はこちら!

$pdo = new PDO('sqlite:users.db'); // DBを設定
// クエリ設定
$q = htmlspecialchars($_POST['q']); //クエリを入力
$q = str_replace(&quot; &quot;, &quot; &quot;, trim($q));
$words = explode(&quot; &quot;,$q);

// 解析
$tmp = [];
$tmp2 = [];
$wd = [];
$i = 0;
foreach($words as $word)
{
if(!empty($word))
    {
        $tmp[] = &quot; content LIKE :word&quot;.$i.&quot; &quot;;
        $tmp2[] = &quot; title LIKE :word&quot;.$i.&quot; &quot;;
        $wd[] = '%'.$word.'%';
        $i++;
    }
}

// SQL
if(count($tmp) &gt; 0)
{
    $sql = &quot;SELECT * FROM article WHERE (&quot;.implode(&quot;AND&quot;,$tmp).&quot;) OR (&quot;.implode(&quot;AND&quot;,$tmp2).&quot;) ORDER BY count DESC&quot;;
    $search_sql = $pdo-&gt;prepare($sql);
    foreach($wd as $key =&gt; $word){
        $search_sql-&gt;bindParam(':word'.$key, $word);
    }
    $search_sql-&gt;execute();
    // while
    while($Article = $search_sql-&gt;fetch(PDO::FETCH_ASSOC))
    {
        // 表示
    }
}

これの重要な点は18行目の「%検索文字%」にしているところです。

$wd[] = '%'.$word.'%';

そうすれば簡単に解決可能でした!