カテゴリー: PHP

  • 【PHP】MySQLとPDOとint型の取得について

    PHPでPDOを使いMySQLのテーブルにアクセスした場合、int型カラムに対しSELECT文を実行すると、サーバーの環境により、int型として返すケースとstring型として返すケースの二通りがあり、WEBアプリ開発において混乱を招きます。

    直感的には、int型カラムであるならば、int型を返して欲しいところなのですが、調べた限りでは、強制的にint型として返す手法は、無いようです。

    もっとも、PDO::setAttributeの設定で、PDO::ATTR_EMULATE_PREPARESをfalseにすると副作用的にint型を返すのでこの手法が紹介されていることが多いようです。

    //プレースホルダのエミュレート機能をオフにする。
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    しかし、この手法は本来、プリペアドステートメントのエミュレーションを有効または無効にするもので、int型を返すように強制するものではないと思います。

    これに対し、string型に強制するようにするメソッドは定められています。

    PDO::ATTR_STRINGIFY_FETCHES: フェッチする際、数値を文字列に変換する。boolを必要とする。

    これがそうで、trueに設定するとMySQLのカラムの型がint型であっても、string型に変換されて返ってきます。

    //int型カラムをstring型で返す
    $dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);

    ところで、サーバーによって、ATTR_EMULATE_PREPARESによるint型への強制ができるかに違いがでることがあります。sakuraレンタルサーバーのスタンダードでは、int型として取得できますが、コアサーバーでは、int型への強制はできませんでした。

    つまり、両サーバーで、このint型の扱いを統一しようとすると、ATTR_STRINGIFY_FETCHESの設定をtrueにして、string型で扱うのが最も簡単な方法のようです。int型に強制するメソッドが備えられていればそれが一番なのですが。

    (注意)
    その他の方法によってint型に統一できる可能性もあるので、必ずご自身でご確認ください。

  • 【MySQL】SQLSTATE[HY000]: General error: 1615 Prepared statement について【PHP】

    さて何から書こう。

    ある日、突然、PHPアプリケーションのエラーログに次のエラーが吐かれるようになった。

    PHP Warning: PDO::query(): SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared in …

    原因が分からないまま数日の間、観察していると、どうも毎日一定時刻になるとこのエラーを吐くことが判明した。その時間は、ちょうど0:00:00~0:00:45と日付の変わった数十秒に限られる。

    なぜ、この時間だけエラーが出るのか不明で散々アプリケーションのコードを確認したが日付の切り替え時にエラーが出るような処理は行っていなかった(たぶん)。

    もちろん、ネットでも検索して原因を調べていたのだが、検索結果はすべて英語ページばかりで読むのを躊躇していた。だって英語読むの面倒。。。

    とは言え、エラーが出続けるのも良くないので検索上位の数ページを読んでみた。どうやら原因は、MySQLのバックアップ、とりわけmysqldumpにあるようだ。どういうことかと言うと、サーバー上のあるmysqlプロセスがmysqldumpを使ってデータ量の多いバックアップを取ると、その間、PDOにバグが生じるというものらしい。それで、上記のようなエラーが吐かれてしまう。また、cronを使っている場合には、エラーが出現する時刻も一定となる。

    (参考)
    https://bugs.mysql.com/bug.php?id=42041

    解決策として挙げられているのが、table_definition_cache の値を大きくすること。しかし、これも完全な解決策にはなっていない模様。根本的な解決策は、どうやら見つかっていないようだ。

    もっとも、共有サーバーで、他のユーザーによるmysqldumpが原因であるならば、他のサーバーへ移れば解決するかもしれない。おそらくこれが現在有力な解決策だと思う。

    ただ、サーバーを移動するのも一苦労なので躊躇してしまう。

    この『General error: 1615 Prepared statement …』に悩まされている人は多そうなのだが日本では話題になっていないようだ。

    【後記】
    エラーが出る時間帯にsshログインしてtopコマンドで確認したところ、同時刻にmysqldumpを実行しているユーザーを確認。やはりmysqldumpしてgzipしてバックアップを取っているようだ。

  • 【書評】PHPとMySQLのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!

    PHPとMySQLのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに! [横山 達大 著]の書評です。

    結論から言うと、PHPとMySQLの連携に重点を置き、CRUDシステムを学習しながら「売り上げ管理システム」を実践的に作成していく入門書です。

    ■ 良い点
    ・ PHPとMySQLの連携を重点的に解説
    ・ CRUDを丁寧に解説
    ・ PDOを使用
    ・ サンプルコードの省略が少な目
    ・ 最後の作成アプリにもコードが全文有り
    ・ クラスの解説あり
    ・ 環境構築の解説も比較的厚い

    ■ 悪い点
    ・ セキュリティは範囲外
    ・ HTMLタグの属性がシングルクォート

    ■ 総評
    PHP及びMySQLを使って「売り上げ管理システム」WEBアプリを作成していく入門書です。対象は、プログラミング初心者となっており、だいぶ易しい演習書です。文法書ではなく、演習書です。できれば前提知識として、一通りのPHP文法の基礎知識があることが望ましいです。

    基礎的なことから順を追ってポイントを押さえながら解説が進んでいきます。カエルの挿絵を使い、先生役と生徒役の会話形式で話が進みます。

    形式面では、「サンプルコード」、「エディタ上のコード」、「ブラウザ画面」のそれぞれが逐一、大きめに表示されるのでとても読みやすく感じます。
    内容面では、HTMLとPHPコードの分離を意識して、またクラスを使用し重複コードを回避するなど、学ぶべき点も多いです。CRUDの解説にも厚いので、SQL初心者にも易しいと思います。

    まったくの初学者には、クラス等はきついかもしれないので、一通りPHP文法を学習した後に読んだ方が良いかもしれません。

    最後の章では、「売り上げ管理システム」を実際に作成していきます。ここでは、コードの省略がなく全文掲載されているのがとても良いと思います。ただ、クラスを使いオブジェクト指向的な内容になるので、少しハードルが高くなるかもしれません。OOPに取りかかりたい人にはお勧めです。

    なお、本書は2014年12月出版で比較的新しく、環境は、PHP5.5、MySQL5.6、XAMPP1.8.3となっており、phpMyAdminやエディタとしてNotepad++を使用しています。

    ちなみに、P199あたりで、GoodsIDをpタグにする箇所では、hiddenタグとして残すべきだと思ったのですが、自分の勘違いかもしれません。
    [後記]書籍の補足情報に当該記述がありました。

    PHPとMySQLのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!

  • 【書評】PHPによるデザインパターン入門

    PHPによるデザインパターン入門 [下岡 秀幸 著]の書評です。

    結論から言うと、PHPを用いて、デザインパターンを詳しく丁寧に解説した貴重な一冊。

    ■ 良い点
    ・ GoFの23パターンをすべて詳細に解説
    ・ PHP用にサンプルがカスタマイズされている
    ・ UMLに対応
    ・ PHP5.2に対応している
    ・ 構成が一貫している
    ・ オブジェクト指向プログラミング力が向上する

    ■ 悪い点
    ・ 誤字が多い

    ■ 総評

    PHP言語でデザインパターンを解説している貴重な一冊です。Javaによるデザインパターン本は比較的多いのですが、PHPではこの本くらいしか見当たりません。

    出版年は2006年と古いものの、PHP5.2には対応しており、内容的にそれほど古さを感じさせないものとなっています。そのため、現在でも、十分通用すると思います。

    内容的には、GoFの23パターンすべてを詳細に解説しており、本書を一通り読めば、デザインパターンの理解が深まります。また、サンプルコードを通して学習することで、オブジェクト指向プログラミングそのものの理解も深まります。OOPに興味が有るPHPerなら是非とも読んでおきたい書籍です。UMLの簡易説明もあるので、無理なく学習できると思います。

    個人的には、結城本では理解できなかったインタープリター・パターンを理解できたのが良かったです。

    もっとも、完全なオブジェクト指向言語であるJavaによるデザインパターンとは異なり、若干、PHPならではの修正がある部分もあります。PHPでは、型がゆるいので仕方ないのですが。

    本書の難点を一つだけ言うならば、誤字が多いことです。ところどころで間違いがあります。文脈から誤りは分かるので、自分で修正しながら読めばいいのですが、この点はやはりマイナスポイントです。

    PHPによるデザインパターン入門

  • 【書評】スラスラわかるPHP

    スラスラわかるPHP [志田 仁美 著] の書評です。

    結論から言うと、「スラスラわかるPHP」は、著者の熱意のこもった密度の濃いPHP入門書です。知識0から中級レベルに導いてくれる良書といえます。

    ■ 良い点
    ・ 入門レベルから丁寧に解説
    ・ 文章が女性的で読みやすい
    ・ 説明が詳しく細かくて丁寧
    ・ SNSアプリを作りながら各種機能を学べる
    ・ 本の体裁もよくブルーの2色刷りで読みやすい

    ■ 悪い点
    ・ 若干、前置きが長い気も

    ■ 総評

    コンパクトにまとまっていながら密度の濃い一冊です。

    水泳に例えるなら、バタ足から個人メドレーまで取り組めるような入門書。

    前半は、データ型、変数、制御構文、配列、関数等の文法を全くの初心者を想定して丁寧に解説。後半は、架空のサークルを想定して、具体的に、各種機能を実装したSNSアプリを作成していきます。

    なお、本書の最初では、開発環境の構築としてXAMPPの説明が詳しくされており、初心者でもPHPを実際に動かしながら学習することが可能です。

    内容的には、前半の文法部分は、初心者向けの易しい内容となっています。だいぶ噛み砕いており、説明も詳しいので理解しやすいと思います。

    後半からは実際に、Webアプリを設計し実装していくのですが、入門者には、少し難しい内容になっているかもしれません。

    具体的には、画像アップロードシステム、データベースを使った掲示板、ログイン機構等を作成していきます。

    逆に考えれば、盛りだくさんの内容でかなりお得です。わからなくても、繰り返し読むことにより、あるいは、他の入門書と併用しながら学習すると中級レベルまで短期にステップアップすることが可能といえそうです。

    本書では、データベース接続にはPDOを利用しており、最後の方では、オブジェクト指向についても、わかりやすく説明されています。また、セキュリティについても、XSS、SQLインジェクション、CSRF、セッションハイジャック等について触れられています。その他、中級者にも役立つ知識が結構出てきます。

    個人的には、データベースを扱うところで、もう少し詳しくSQLのCRUDについて解説があればいいのになと思いましたが、紙面の都合もあるので、そこは仕方ないかもしれません。

    全くの入門者なら、文法部分とWebアプリの理解できるところまで進んで、その後は他の入門書と併用して学習するのをお勧めします。

    ある程度、PHPを学習している人なら、PDOの扱いやログイン機構、オブジェクト指向の要点のまとめに読むことをお勧めします。

    以上です。

    スラスラわかるPHP (Beginner’s Best Guide to Programmin)