CakePHP2.0でDBに接続できない。いきなりすぎてちょっとムリ。


Windows+Apache+MySQL+PHP+CakePHP2.0(XAMPP環境+CakePHP2.0)でCakePHPからデータベースに接続しよーって時にいきなりつまずいた。

./[caleフォルダ]/app/Config/database.php

public $default = array(
‘datasource’ => ‘Database/Mysql’,
‘persistent’ => false,
‘host’ => ‘******’,
‘login’ => ‘username’,
‘password’ => ‘password’,
‘database’ => ‘mydatabase’,
‘prefix’ => ”,
‘encoding’ => ‘utf8’,
);

をシコシコと書いて、DBとテーブル用意して、いざポチッ!!

ど~ん。

Cake is NOT able to connect to the database.
Database connection “Mysql” is missing, or could not be created.

ああ~ん?

ふざけんなコラー!!

ほかのPHPアプリから問題なく接続できてるんじゃボケー!!

アホなんはお前じゃー!!

ってことでググってみたら、↓にズバリ答えを書いてくれているエロい人がいた。

しそうち寂聴 のブログ:CakePHP2.0⇒MySQLへの接続
http://sisomoti.blog76.fc2.com/blog-entry-27.html

ぶっちゃけると、「あんたのPHP環境にPHP Data Objects(PDO)がないよ~ん」ってことらしい。

さっそく「ごおgぇ先生」にお伺いしてみると・・・・

PHP Data Objects のインストール手順
http://www.php.net/manual/ja/pdo.installation.php

に↓しろカス。ってことがかいてあった。

「php.ini」の以下のコメントハズシテネ♪

;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll

おk。外した。Apache再起動。もいっかいポチッ!!

ど~ん。

Cake is able to connect to the database.

おしまい。

go-pear.phpでのインストールがエラーで失敗する件


PHPのリポジトリファイルがなくてgo-pear.phpでのインストールがエラーで失敗する件について。

ロリポップにPEARをインストールしてやろうと思い、gp-pear.phpでWEBインストールを試みた。

しかし・・・・

An Exception Has Occurred

Unknown location: /pear/pear-core/branches/PEAR_1_4/PEAR.php

HTTP Response Status

404 Not Found

ok

Bootstrapping Archive/Tar.php…………(remote)

Fatal error: Class ‘PEAR’ not found in /home/users/*/****/web/pear/temp/Archive/Tar.php on line 58

となりあえなく撃沈。

どうやら、114行目の

http://svn.php.net/viewvc/pear/pear-core/branches/PEAR_1_4/PEAR.php?view=co

が「404 Not Found」な様子。

このリポジトリをのぞいてみたら

You tell them where to go! (find pear-core @ github).

となってるじゃねぇか。

ふざけんな。

ん?「(find pear-core @ github)」とな?

githubにあるんかいな?と漁ってみたら↓にあった。

https://raw.github.com/pear/pear-core/master/PEAR.php

ついでに調べると

http://svn.php.net/viewvc/pear/pear-core/branches/PEAR_1_4/Console/Getopt.php?view=co

も「404 Not Found」。

ふざけんな。

こっちはもgithubにあるんか?

みあたらない・・・・

http://svn.php.net/を漁ってみたら、古いんだか新しいんだかしらんが、とりあえずあったのでぶち込んでみる。

http://svn.php.net/viewvc/pear/packages/Console_Getopt/tags/Console_Getopt-1.3.1/Console/Getopt.php?view=co

実行。

Bootstrapping Archive/Tar.php…………(remote)

Fatal error: Class ‘PEAR’ not found in /home/users/*/****/web/pear/temp/Archive/Tar.php on line 58

ふざけんなぁぁぁ~~~~っっっっっ

本家(http://pear.php.net/manual/en/installation.getting.php)をみたら、

どうやら去年末からこの状態で放っておかれているようす。

ふざけんなぁぁぁ~~~~っっっっっ

_| ̄|○

追記:2012/3/29

エロい人が修正版go-pear.phpを作ってくれている模様。詳しくは↓を良く読み、平身低頭、禿げしく感謝して使用するように。

http://d.hatena.ne.jp/tdoi/20111228/1325054820

Gladinet Cloud Desktop が Dropbox的でイイ感じかもしれない。


窓の杜なんかで紹介されていたクラウドスペースやオンラインディスク、FTPなどを自分PCのローカルドライブとしてマウントできちゃうソフトです。

これが意外とDorpbox的でなかなかヨサゲ。

というのは、

まず一つ目は、PCを起動したら自動的にマウントしてくれる。

二つ目は、ファイルを変更したら自動的に同期をとってくれる。

三つ目は、FTPを含め色々なサービスをマウントできる。

インターネット環境には常時つながっているけど、WEBアプリの開発環境を用意できない、とかそういう場合にかなり便利。格安のレンタルサーバとか普通にapache+MySQL+PHPがインストールされているし、FTPも解放されている。だからGladinet Cloud DesktopでFTP接続してマウントしてしまえば、開発環境の出来上がり。デバッグしたければ xdebug をONにすればいい(ロリポップにはxdebugが入ってる)。わざわざコーディングしたファイルをFTPでアップする、なんて作業しなくていい。

う~ん、イイ感じ。

ダウンロードはここから↓。
http://www.gladinet.com/p/download_starter_direct.htm

インストールは・・・適当でおk・・不安ならここらへん↓みればおk。
http://freesoft-100.com/pasokon/gladinet-cloud-desktop.html

XDebugインストール&Eclipse(PDT)でPHPリモートデバッグを行う方法


今回の目的は、サーバOSでPHPコードを実行して、クライアントOS側でステップ実行等のデバッグ作業を行うところにある。

俺の開発環境は以下の通り。

  • Server OS: Windws XP Pro SP3
  • Apatch: 2.2.17.0
  • PHP: Version 5.3.4
  • MySQL: 5.5.10
  • Client OS: Windows 7 Home

ちなみに、サーバOSがWindwsサーバであってもXDebugはちゃんと動いてくれた。あたりまえか・・・

なお以下の作業を行う前提条件として、サーバOSには最低でも apache + PHP はインストール済みであることとする。

PDT(PHP Development Tools)の入手とインストール

PDTは以下のサイトより入手。

Pleiades All in One 日本語ディストリビューション

http://mergedoc.sourceforge.jp/index.html

ちなみに俺は

Eclipse 3.7.0 Indigo Windows 32bit ベース / Pleiades All in One 3.7.0.20110623 >> PHP >> JREなし

を選んだ。

PDTはインストールは不要。解答して任意のフォルダで実行するのみ。

ここらへんを詳しく知りたければ他のECRIPS系のサイトを参照のこと。

重要なポイントは以下の点。

  • 「ウィンドウ >> 設定 >> PHP >> PHPサーバ」でサーバ情報を入力すること。
  • 「ウィンドウ >> 設定 >> PHP >> PHP実行可能ファイル」でphp.exeとphp.iniを設定すること(※ネットワークドライブ上でもOK)。
  • 「ウィンドウ >> 設定 >> PHP >> デバッグ」で上記二つの設定を反映させること。

XDebug の入手とインストール

XDebug は以下のサイトより入手する。

俺は、

PHP 5.3 VC6 TS (32 bit)

を選択。

ちなみに、VC6 は Visual Studio 6系 でコンパイルされたもので、VC9 は Visual Studio 2008 でコンパイルされたものを指す。今回はサーバOSがそんなに新しいわけではないので、VC6を選択。おそらく、Windows Server 2008 とかお使いの場合には VC9 を使ったほうがよいのではなかろうか。

また、TSはスレッドセーフの略でマルチスレッド対応か否か、ということ。今回は・・・・べつにどっちでもいいんじゃね?開発環境だし、うごけばいいや・・・・ということで、スレッドセーフ版を選択した。

これらはお使いのOSやアナタのシュミに合わせて選択してほしい。

なお、LinuxへのXDebugインストールについては、他に腐るほど解説サイトが見つかったので、そちらを参考に。

このXDebugだが、DLL単体のソフトウェアなので、PHPにこのDLLを読み込ませるだけ。ということでphp.iniを編集する。

以下の行をphp.iniに追加する。

[Debugger]
zend_extension = "C:\php\Debugger\php_xdebug-2.1.1-5.3-vc6.dll"
xdebug.remote_enable=1
xdebug.remote_host = "192.168.21.1"
xdebug.remote_port = 9000
xdebug.remote_handler = "dbgp"
xdebug.remote_mode = "req"
xdebug.remote_log = "C:\php\xdebug_remote_log"
xdebug.profiler_enable = 1
xdebug.profiler_output_dir = "C:\php\xdebug_output"

各パスのあたりはお使いの環境に合わせて適宜修正のこと。

なんか、なくてもよい行もある気がするが、そこら辺は自分でしらべてくれたまへ。とりあえずこれで動くはず。

お約束通り、php.iniを編集したらapacheを再起動のこと。

正しくXDebugがインストールされたら以下のような箇所が表示される。

xdebugインストール成功_01

xdebugインストール成功_02

PDTでデバッグテスト

もうあとは説明する必要もないくらいだ。

プロジェクトを作成 >> 適当にPHPコードを書いて >> 当該行頭ダブルクリックでブレークポイントを設定して >> デバッグ >> F5でステップ実行

という感じである。

できない?

しらんがな (´・ω・`)y-~~

なぜ XDebug か?

世の中にはZend Debuggerなる同類のものもあるらしいのだが、こちらはPHP 5.3に対応しておらず、今後も対応する予定がないのだそうだ。したがって、XDebugを使用した。

もうひとつ、DBGなるものもあるらしいが、XDebugでできちゃったからもういいや~(´・ω・`)y-~~

「Windoes+Apache+MySQL+PHP」でのインストール設定手順メモ


「Windows + Apache + MySQL + PHP」の環境を構築する際に、いつも複数のサイトを見ながら設定していたのでまとめてみた。ただし、最低限のことしかしていない、且つ、開発環境を想定した設定になっているので、運用環境を構築する際には厳に注意されたし。なお、以下の手順は「apache2.2」、「php5.3」におけるインストール設定手順を記載している。

apacheの設定(httpd.confの設定)

標準ポートの変更

Listen 8080
↓
Listen 80

ドキュメントルートの変更

DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
↓
DocumentRoot "C:/www"

<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs">
↓
<Directory "C:/www">

日本語を優先的に表示

#Include conf/extra/httpd-languages.conf
↓
Include conf/extra/httpd-languages.conf

日本語を優先的に表示2

※C:¥[apacheインストールフォルダ]¥conf¥extra¥httpd-languages.confを修正

#DefaultLanguage nl
↓
DefaultLanguage ja

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz .....
↓
LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz .....

AddDefaultCharset utf-8 (※行追加)

CGIおよびPHPの実行許可

#AddHandler cgi-script .cgi
↓
AddHandler cgi-script .cgi

PHPモジュールの追加(※以下の行をすべて追加)

LoadModule php5_module "C:¥php¥php5apache2_2.dll"
PHPIniDir "C:¥php"
AddType application/x-httpd-php .php

PHPの設定(php.iniの設定)

環境変数へパスを追加

PHPインストールフォルダをWindowsの環境変数へ登録する。

php.iniの作成

php.ini-developmentかphp.ini-productionをリネームしてphp.iniを作成。

インクルードパスの修正(PEARのパスを追加)

※PEAR等のライブラリを使用しない場合は不要

※PEARのインストールは【ここらへん】をみながらやる

;include_path = ".;c:¥php¥includes"
↓
include_path = ".;c:¥php¥includes;c:¥php¥pear"

ドキュメントルートの指定

doc_root =
↓
doc_root = "c:¥www"

extensionディレクトリの指定

extension_dir = "./"
↓
extension_dir = "c:¥php¥ext"

タイムゾーンの指定

;date.timezone =
↓
date.timezone = "Asia/Tokyo"

mbstringの設定

;extension=php_mbstring.dll
↓
extension=php_mbstring.dll

MySQLへの接続

※MySQLを使わない場合は必要なし。
※他のDBを使用する時は別のサイトを参照の事。

;extension=php_mysql.dll
↓
extension=php_mysql.dll

;extension=php_mysqli.dll
↓
extension=php_mysqli.dll

default_charsetの設定

;default_charset = "iso-8859-1"
↓
default_charset = "UTF-8"

エラーを表示するように変更

※デフォルトでONになってる模様。

display_errors = Off
↓
display_errors = On

mbstringの設定

;mbstring.language = Japanese
↓
mbstring.language = Japanese

;mbstring.internal_encoding = EUC-JP
↓
mbstring.internal_encoding = UTF-8

;mbstring.http_input = auto
↓
mbstring.http_input = pass

;mbstring.http_output = SJIS
↓
mbstring.http_output = pass

;mbstring.encoding_translation = Off
↓
mbstring.encoding_translation = Off

;mbstring.detect_order = auto
↓
mbstring.detect_order = UTF-8,SJIS-win,eucJP-win

;mbstring.substitute_character = none;
↓
mbstring.substitute_character = none

以上

ロリポップでPHPを使って開発をしていて、とあるサブドメインのみセッション変数が使えない不具合


表題のとおり、ロリポップでPHPを使って開発をしていて、とあるサブドメインのみセッション変数に値がまったく入らない現象が起こり、かなりハマったので備忘録として書いておく。

結論から言うと・・・
[ロリポップ!ユーザ専用ページ] →[WEBツール] →[PHP設定]
で当該サブドメインのphp.iniの設定変更画面に入り、
「session.auto_start」を「1」にするッ!!

「え~session_start()をちゃんと書いてるからいらねぇじゃん」と思うでしょ?
おれもそう思ったよ!!
でもこれONにしないと動かないのよ、なぜか!!

コンチクショウ!!

[PHPエラー] failed to open stream: No such file or directory in~ とか Failed opening required ‘***.php’ とか


以下のようなエラーが出た場合の対処法について。
ロリポップを使っていて、ファイルパスとかすべて正しいハズなのにこのエラーが出る場合。

Warning: require_once(***.php) [function.require-once]: failed to open stream: No such file or directory in /home/users/0/***/web/***/******.php on line **

Fatal error: require_once() [function.require]: Failed opening required ‘***.php’ (include_path=’.:/usr/local/php5.2/php’) in /home/users/0/***/web/***/***.php on line **

おそらく、あなたはサブドメインを使っていると思う(ちがったらこの方法では解決できないかも)。

ロリポップってサブドメインごとにPHPのバージョンやらphp.iniの設定を変更できるのです。
そのバージョンやら設定やらを合わせてやってください。
そうすれば解決すると思う。

具体的な作業は・・・

[ロリポップ!ユーザ専用ページ] →[WEBツール] →[PHP設定]

で行う。]

特にphp.iniの設定を変更する場合には個々の値がどのような動作をするのかよく調べてから変更しよう。
ここらへんの設定を変更するとセキュリティ的にマズイことになるので、よくわからない人はちゃんと調べてから変更しよう。
ってか「わからないからデフォルトでいいよね~」もやめよう。
少なくともここを見ているということはPHPでWEBアプリを運用しようとしているはずで、
WEBアプリを運用するのだったら少なくとも最低限のセキュリティは勉強してから運用をスタートさせよう。

なぜcakePHPを使うのか?


143 名前:nobodyさん[sage] 投稿日:2011/07/28(木) 01:45:02.72 ID:???

フリーランスでWEBアプリを開発しています。
PG歴8年で、PHP歴は1年程度です。
フレームワークを使わないPHP開発は一通り経験しているつもりです。

まだcakeを紹介したサイトをいくつか読んだレベルなのですが、
「なぜcakeを使うのか?」がいまいちピンときていません。

開発スピードなら、既成ライブラリや私製ライブラリで十分な成果が出る気がします。
MVCがしたいなら、別にcakeをつかわなくてもできるんじゃ?と思います。
複数PGでの協業にcakeが威力を発揮するとも思えないのです。

みなさんはなぜcakeにかぎらず、PHPフレームワークをつかっているのでしょうか?
みなさんのご経験された案件でcakeなりPHPフレームワークを使うことを決定した理由は
なんなのでしょうか?差し支えなければ教えてください。

145 名前:nobodyさん[sage] 投稿日:2011/07/28(木) 09:25:36.36 ID:???

>>143
デザイナがいなくて画面を自分で作らなければいけない仕事をやってるんで、
scaffoldを吐き出してくれるのが一番助かってるかなあ。
あとはクエリパラメータを関数の引数にマップしてくれるので
どこでどのパラメータを使っているかわかりやすいとか。
フォームヘルパーみたいのも自作しなくてすむし。
ページングも楽だ。

まあ、単体で見るとたいしたことなくても、Railsがフルスタックフレームワーク
と言われていたように、オールインワンでそろってるのが楽なわけよ。

146 名前:nobodyさん[sage] 投稿日:2011/07/28(木) 09:31:09.08 ID:???

>>143
俺は単に「ネット上の情報が一番多い」事が理由だな

cakeに限らない場合、命名規則や開発方法が決められていると、
開発時の迷いが少なくなるというメリットがある。俺にはこれがでかい。

147 名前:nobodyさん[] 投稿日:2011/07/28(木) 09:35:44.21 ID:???

なんとなく使ってる感じですかね、別にこれじゃなくてもなんでもいいです。
あと情報が多いのも理由ですね、ここもそうですが他のプログラマーの意見を
見るのも参考になりいますし。

148 名前:nobodyさん[sage] 投稿日:2011/07/28(木) 10:55:09.01 ID:???

>>143
チーム開発してると合意というか統制がとりやすい。デザインパターンみたいなもん。
保守面でもFWのバグやセキュリティフィックスの作業が軽減できる。
Cake1.x自体は構造が古くてクソだけど。

[PHPエラー] Content-type not specified assuming application/x-www-form-urlencoded の対処法


Notice: file_get_contents() [function.file-get-contents]: Content-type not specified assuming application/x-www-form-urlencoded in ******************.php on line ***

とエラーメッセージが出た場合、file_get_contents の第三引数の”context”にヘッダ情報が足りていません。具体的には↓のヘッダを追加しましょう。

“Content-Type: application/x-www-form-urlencoded”,

“Content-Length: “.strlen(http_build_query($POTED_DATA))

ヘッダの追加方法は、↓などを参考にしてください。

とても簡単にPHPからPOSTリクエストを送信する方法【PHP】 – Programming Magic

http://www.programming-magic.com/20080226023511/



追記:

file_get_contents()でPOT送信しても画面遷移はしてくれないんだよなぁ。

だから

echo file_get_contents(~~~);

die();

とせにゃいかん・・・

POSTしつつリダイレクトしてくれる関数はないもんかなぁ・・・




PHP で select タグの multiple オプションを POST で受ける方法とその応用


select タグのオプションに multiple を付けた場合、selectタグのnameオプションを「name=”select[]”」のように書く。

<form method="post" action="******.php">
  <select name="select[]" multiple>
    <option value="opt_1">option1</option>
    <option value="opt_2">option2</option>
    <option value="opt_3">option3</option>
    <option value="opt_4">option4</option>
    <option value="opt_5">option5</option>
    <option value="opt_6">option6</option>
  </select>
</form>

そして受け側で

print_r($_POST);

としてみると以下のような配列で受け取れる。

Array
(
  [select] => Array
    (
      [1] => option1
      [2] => option2
      [3] => option3
    )
)

さらにこれはselectタグに限らず、ほかのinputタグなどでも応用できる。

<form method="post" action="******.php">
  <input type="text" name="hoge" value="ほげほげ" />

  <input type="text" name="hoge1[u]" value="うがうが" />
  <input type="text" name="hoge1[d]" value="どんどん" />
  <input type="text" name="hoge1[p]" value="ぴよぴよ" />

  <input type="text" name="hoge2[]" value="もげもげ" />
  <input type="text" name="hoge2[]" value="うらうら" />
  <input type="text" name="hoge2[]" value="むだむだ" />
</form>

とすると、、、

Array
(
  [hoge] => ほげほげ
  [hoge1] => Array
    (
      [u] => うがうが
      [d] => どんどん
      [p] => ぴよぴよ
    )

  [hoge2] => Array
    (
      [0] => もげもげ
      [1] => うらうら
      [2] => むだむだ
    )
)

となる。

う~ん。PHPさん、、、、、ちょっと無理矢理感が・・・・・

あれ?あれ?これは、はいぱ~・てきすと・とらんすふぁ・ぷろとこる の仕様ってこと???