CakePHP:CakePHPで静的ページを追加

CakePHP静的ページを追加する場合、「app/views/pages」か「app/webroot」の下にフォルダやファイルを配置すると思います。

今回、「app/webroot」の下に静的コンテンツを追加した時に困ったことがあったのでメモします。


CakePHPで静的ページを追加「app/webroot」

「app/webroot」の下に追加したいコンテンツを設置します。

/app/webroot/hoge/index.html

下記のようにアクセスした場合は正常にページが表示されます。

http://ドメイン/hoge/index.html
http://ドメイン/hoge/

しかし、最後の「/」をなしの状態でアクセスすると、
下記のように「app/webroot」が付いたURLにリダイレクトされてしまいました。

http://ドメイン/hoge

↓(リダイレクトされてしまう)

http://ドメイン/app/webroot/hoge/

上記のように「app/webroot」がついたURLにリダイレクトされたくなかったので、
ドキュメントルートの直下に置いてる「.htaccess」を変更して下記のように対処しました。

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^hoge$ /hoge/index.html [R=301,L]
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

下記の一行を追加しました。
「hoge」でアクセスした場合、「hoge/index.html」にリダイレクトするようにしています。

   RewriteRule    ^hoge$ /hoge/index.html [R=301,L]

ただ、これだと「http://ドメイン/app/webroot/hoge/」でアクセスした時にページが表示されてしまいます。

色々調べていて下記のサイトを発見しました。
参考になりました。ありがとうございます。

CakePHP 静的コンテンツのURLについて | Fusic Developers Weblog

「app/webroot」の直下にある「.htaccess」を下記のように変更しています。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
    RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]
</IfModule>

下記の二行を追加しています。

    RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
    RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]

「app/webroot」がある場合、「app/webroot」を省いたものでリダイレクトするようです。

上記の設定をすると「app/webroot」がついたURLでアクセスした際に、
リダイレクトされてアクセスすることができました。


上記以外にも他に良い方法があれば知りたいです。

php:文字列の出力でechoとprintの違い

php文字列を出力する際は、echoprintを使用すると思います。

php初心者の方から

echoとprintをどちらを使えばいいのか?
echoとprintの違いはなんなのか?
どちらを使用するのが正しいのか?

などを聞かれたことがあります。

私はphpを覚えた時から文字列の出力はechoを使用していたので、
あまり気にしたことがありませんでした。

echo」と「print」を比較して、違いを調べてみたので下記にメモします。


「echo」と「print」の違い

○ 引数が違う

echoの場合は引数を「,」区切りで複数指定できます。

echo 'aaa', 'bbb';

出力結果

aaabbb

printの場合は引数は一つのみです。

print 'aaabbb';

下記の場合、エラーになります。

print 'aaa', 'bbb';

○ 戻り値が違う

echoの場合は戻り値がないです。
下記の場合、エラーになります。

$val = echo 'aaa';

printの場合は戻り値があり、1を返します。

$val = print 'aaa';
print $val;

出力結果

aaa1

文字列ではなく「1」が返ります。


私なりの結論ですが、phpで文字列を出力するのは、echoとprintのどちらも正しいです。

どちらでも文字列を出力するのは変わらないので、
その時の環境やルールに合わせるのがいいと思います。

また、printは戻り値があるから、echoの方が処理速度が速いようです。

CakePHP:CakePHPでBasic認証を簡単に設定

CakePHPコントローラーごとにベーシック認証をかけたい場合、
Securityコンポーネントを使用すると簡単に設定することができます。

通常、Basic認証は「.htaccess」で設定しますが、
「.htaccess」を使用しないで設定できるのでとても楽です。

サイト全体に設定せずにコントローラーごとに設定したい場合などは良いと思います。

下記にCakePHPSecurityコンポーネントを使用してコントローラーごとにベーシック認証を設定する方法をメモします。


CakePHPでBasic認証を設定

Basic認証を使用したいコントローラーに下記の設定をします。

コントローラー(Controller)

Securityコンポーネントを使用するよう呼び出します。

class SampleController extends AppController {
	// Securityコンポーネント
	var $components = array('Security');

}

共通処理のbeforeFilter()にBasic認証の設定をします。

	function beforeFilter() {
		parent::beforeFilter();

		// Basic認証の設定
		$this->Security->loginOptions = array('type' => 'basic');

		// ユーザー名、パスワードの設定(複数可能)
		$this->Security->loginUsers = array('hoge' => 'password');

		// 全てのアクションに設定
		$this->Security->requireLogin('*');
	}

上記の設定をするだけなので簡単にBasic認証を設定することができます。
また、アクションごとにも設定することができるので便利です。

MySQL:ORDER BY句でデータを昇順、降順にソート

MySQLでデータをソートして取得したい場合があります。

ORDER BY句を使用すると取得するデータを指定したフィールドで
昇順降順ソートしながら取得することができます。
昇順でソートする場合は「ASC」を指定し、降順でソートする場合は「DESC」を指定します。

データベースのデータを取得してからプログラムでソートするよりは、
データ取得時にソートして処理する方がいいと思います。

下記にSELECT文ORDER BY句を使用しデータを昇順降順ソートして取得する時の使用方法をメモします。


ORDER BY句でデータをソート(昇順・降順)

※データが下記の場合

MySQL_ORDER_BY_1

・昇順でソートする場合(ASC)

昇順でソートするフィールドにASCを指定します。

SELECT * FROM sample ORDER BY name ASC;

「ASC」を指定しない場合は昇順でソートされます。

SELECT * FROM sample ORDER BY name;

MySQL_ORDER_BY_2

・降順でソートする場合(DESC)

降順でソートするフィールドにDESCを指定します。

SELECT * FROM sample ORDER BY name DESC;

MySQL_ORDER_BY_3


ORDER BYを複数指定してソートする場合

ORDER BYを複数指定する場合は、優先順位の高いものから順番に「,」で区切って指定します。
下記は「name」を昇順ソートし、「id」を降順ソートした場合です。

SELECT * FROM sample ORDER BY name ASC, id DESC;

MySQL_ORDER_BY_4


ORDER BYとLIMITを使用する場合

ORDER BYとLIMITを組み合わせた場合は下記のように記述します。
ORDER BYはLIMITよりも前に記述しないとエラーが起きるので注意です。

SELECT * FROM sample ORDER BY id DESC LIMIT 5;

MySQL_ORDER_BY_5

MySQL:LIMIT句で取得件数を指定してデータ取得

MySQLSELECT文でデータを取得する際に取得する件数指定してデータを取得したい場合があります。

取得する件数を指定する場合はLIMIT句を使用すると件数を指定することができます。
また、OFFSET句を組み合わせるとデータを取得する開始位置を指定することが可能です。

MySQLでデータを取得する時にLIMIT句OFFSET句を使用して、
取得件数開始位置を指定してデータを取得する方法をメモします。


LIMIT句、OFFSET句を使用してデータを取得

※データが下記の場合

mysql_limit_1

LIMIT句で取得する件数を指定します。

SELECT * FROM sample LIMIT 5;

実行すると下記のように指定した件数でデータを取得できます。

mysql_limit_2

次にOFFSET句を使用するとデータを取得する開始位置を指定できます。

SELECT * FROM sample LIMIT 10 OFFSET 5;

実行すると下記のように開始位置から指定した件数のデータを取得できます。

mysql_limit_3

また、OFFSET句は省略して記述することも可能です。

SELECT * FROM sample LIMIT 5, 10;

取得件数と開始位置の記述する順番が逆になるので注意が必要です。


ページネーションを使用しているページのデータを取得・表示する時など、
LIMIT句とOFFSET句を使用すると便利です。