[PHP]PDO:windowsからlinuxにアップロードすると、bindParamでうまくバインドされない場合

掲題の問い合わせがあったので、調査してみました。
○症状
・windowsからlinuxにアップロードすると、bindParamがうまくバインドされてない
・windows環境では動いていた
・bindParamはtrueを返している
・bindParamを使わずにSQL文を直書きすると動く。
○環境
開発言語:PHP 5.1
DB:MySQL 5.0
・windowsでxamppを使用して開発
・PDO使用
・アップロードするサーバはlinux
○対処
bindParamの型指定(第3引数)をする。
例)

$age = 30;
$name = 'tanaka';
$sql = '';
$sql .= 'SELECT * FROM test';
$sql .= ' WHERE age < :age AND name = :name ';
$sth = $dbh->prepare($sql);
$sth->bindParam(':age', $age, PDO::PARAM_INT);
$sth->bindParam(':name', $name, PDO::PARAM_STR, 12);
$sth->execute();

そもそも、PDOStatement::bindParamは自動的に型を判定してはくれないので
プログラマ側が明示的に記す必要があります。
bindParamについて型指定までしないサンプルが初心者向けに多いので、
気づかずにここで悩む方結構いるのかも知れません。
PDO::PARAM_STRの場合、これだけを指定しても動いたりしますが
長さ(第4引数)も一応付けた方がいいでしょう。
bindParamは第3引数のデフォルトはPDO::PARAM_STRになってます。
windowsでなぜ動くのかは不明ですが、多分どこかの設定なのかなぁ。
その他の定数については下記を参照してください。
・PDO定義済み定数
http://php.net/manual/ja/pdo.constants.php
日付型に関しては、また次の機会に
○参考
・PHP: PDOStatement::bindParam – Manual
http://php.net/manual/ja/pdostatement.bindparam.php
※注意
掲載している内容についてはご自身の責任で参考にされてください。