2012年10月21日日曜日

PHPでプログラムがうまく動作しないときにどこが原因なのか確かめる簡単な方法

<スポンサードリンク>
これはあまりにも簡単すぎて誰も書いていないのではないかと思うのでちょっと書いておきます。

PHPでプログラムを書いているときにエラーは発生していないのに思った通りに表示されない時ってのがけっこうあります。

そんなときに何が原因なのかを探す簡単な方法です。


エラーが出ないのに想い通りに表示されない場合は私の場合は変数にうまく値が入っていないときがほとんどです。

なので、想い通りにならないときは変数に自分の思った値が入っているかを上から確認して行けば言いわけです。

その方法はとても簡単。

var_dump()

という物を使います。

var_dump()というのは

引数で指定された変数の構造化した情報を参照します。配列を指定した場合は、インデックス数と添字、及びキーとインデックスを示す形式で出力します。オブジェクトを指定した場合には、オブジェクト内部の変数やそれぞれの変数に関する情報も出力します。
print_r()関数 との違いは、変数の持つより詳細な情報を構造化して返される点にあります。 

簡単に言うと、変数の中にどういう値が入っているかを出しくれうる関数な訳です。

ほかにもこのような機能をもった関数はありますが、詳細な情報を構造化して出力してくれるというのがポイント。
今回の場合はそこまで必要ないですが、アマゾンとか楽天のAPIを利用したプログラムを作っている場合はこれの方が便利だと思うので、私はいつもvar_dumpを使っています。

以下に例を示します。

<?php
require('../dbconnect.php');
$isbn=$_GET['isbn'];
function db_check() {
    $sql = sprintf('SELECT * FROM book WHERE isbn="%s" LIMIT 1',
    mysql_real_escape_string($isbn));
    $record=mysql_query($sql) or die(mysql_error());
    while($check = mysql_fetch_assoc($record)){
    $sql_comment = sprintf('SELECT * FROM book_comment WHERE isbn="%s"',
    mysql_real_escape_string($isbn)
    );
    $record_comment=mysql_query($sql_comment) or die(mysql_error());

以下続く・・・


こちらをブラウザを表示させると、こんな感じ。
”詳細”の下にいろんな情報を表示させたいが、表示されていない。エラーも出ていない


これはまた何でだ?となりますが、上記のように変数にちゃんと値が入っているかを確かめます。そのときに使うのがvar_dump()。

以下のように使います。

<?php
require('../dbconnect.php');
$isbn=$_GET['isbn'];
function db_check() {

    var_dump($isbn);

    $sql = sprintf('SELECT * FROM book WHERE isbn="%s" LIMIT 1',
    mysql_real_escape_string($isbn));
    $record=mysql_query($sql) or die(mysql_error());
    while($check = mysql_fetch_assoc($record)){
    $sql_comment = sprintf('SELECT * FROM book_comment WHERE isbn="%s"',
    mysql_real_escape_string($isbn)
    );
    $record_comment=mysql_query($sql_comment) or die(mysql_error());
    

それでもう一回ブラウザで見てみると、

すると、今度は新しく”NULL”と出てきました。

NULLを新しくでてきたわけですが、要は$isbnの中に値が何も入っていませんよってことですね。

本来は入っていてほしかったものが入っていなかったと言う事でその原因を考えると、3行目でGETを使って値を取得していますが、これはfunctionの外側にあります。詳しくはわかりませんが、functionの外側と内側では同じ名前の変数があっても違うものだと見なされるらしく、GETで値を取得している部分をfunctionの中に移動したら思うように表示されるようになりました。

<?php
require('../dbconnect.php');

function db_check() {
    $isbn=$_GET['isbn'];
    var_dump($isbn);

    $sql = sprintf('SELECT * FROM book WHERE isbn="%s" LIMIT 1',
    mysql_real_escape_string($isbn));
    $record=mysql_query($sql) or die(mysql_error());
    while($check = mysql_fetch_assoc($record)){
    $sql_comment = sprintf('SELECT * FROM book_comment WHERE isbn="%s"',
    mysql_real_escape_string($isbn)
    );
    $record_comment=mysql_query($sql_comment) or die(mysql_error());
    

string(13)"  "と書かれた部分にしっかりと値が入っています。これはvar_dump()で記述された部分。

このようにvar_dumpを使って変数の中身を調べて行く事でうまく動作しない原因を調査する事が出来ます。

私の場合はこの方法で問題が解決する場合が多いです。(まだまだ新米なもので・・・。)

ちなみにvar_dumpの使い方ですが、括弧のなかに調べたい変数を入力する時、クオテーション("や')はいりません。

× : var_dump("$isbn")
○ : var_damp($isbn)

ただの文字列を入力する場合は必要ですが、昔この違いを知らずvar_dumpを使っていて、いろんな所に書いてあるように表示されないじゃないか!!とイライラした経験があります・・・・。

まあ、基本中の基本ですが、私はここでつまずいた事があったので、ほかにもこういう方がいたときのために書いておきました。参考にしていただけたら幸いです。

※私はまだまだプログラミング初心者のため今回の記事で間違った事などがありましたらご指摘いただけるとありがたいです。

アンテナの外側をリニューアルしました。URLも変えて、デザインも刷新!より見やすく、使いやすい形を目指しています。ぜひ新しくなったアンテナの外側をご覧ください!! 新しい「アンテナの外側から」へ


ぜひRSSでご購読ください


0 件のコメント:

コメントを投稿