phpのバージョンを5.2.4に上げたときにmysqlを使用しているサイトでsymfonyのエラーがでるようになった。
内容は次のようなもの。
Unable to convert value at column * to timestamp: 0000-00-00 00:00:00
調べてみると「Warning about PHP 5.2.4 and Creole」という記事が見つかった。
どうやら、php 5.2.3以前のバグを5.2.4で修正したのが原因らしい。strtotime で’0000-00-00 00:00:00’を指定したときに、今まではなぜか、「943905600」が返されていたが、5.2.4以降はFALSEが返されるようになったため。
そこで、symfonyのディレクトリで(うちの場合は、/usr/share/pear/symfony)
grep -rn 'Unable to convert value at column' *
で調べると
vendor/creole/common/ResultSetCommon.php
vendor/creole/drivers/mysqli/MySQLiResultSet.php
vendor/creole/drivers/mysql/MySQLResultSet.php
vendor/creole/drivers/mssql/MSSQLCallableStatement.php
が該当した。
ここでは、mysqlが問題になるので、上の3つのファイルの
if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE throw new SQLException("Unable to convert value at column " . (is_int($column) ? $column + 1 : $column) . " to timestamp: " . $this->fields[$idx]); }
という個所(ファイルによっては2か所以上ある)を
if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE //throw new SQLException("Unable to convert value at column " . (is_int($column) ? $column + 1 : $column) . " to timestamp: " . $this->fields[$idx]); return '943916400'; }
とした。
一応これで動くようになったがこれはあくまでも仮の処理。おそらくsymfony側でも対応するだろう。とおもっていたら、既に修正されていた。 そして、昨日symfony 1.0.9がリリースされていた。
さっそくアップデートしてみよう。