QUOIT Blog

忙しい人のための「初めてのPHP」

この記事は5年以上前の記事です。情報が古い場合がありますのでお気を付け下さい。

説明は適度に、駆け足でお届けします。
言っておきますが、これを覚えたからと言って「PHP出来ます!(キリッ」とか言ったら鼻で笑われるレベルだということは認識しておいてくださいね。

<追記あり:2012/02/16>

大前提

HTML/CSSの基本的なところはわかってるものとします。FTPでアップロードするって意味さえわからない人はこのへんで勉強してください。つまり、出直してください。
あと、もっとちゃんと勉強したい人はこんな駄文を読まないほうがいいです。アシアルさんのコンテンツを読んでください。この文章の100倍素晴らしいコンテンツが満載です。

エディタ

Windowsユーザなら、標準で付いてるメモ帳を使うのはやめましょう。
PHPに限らず、プログラムを触るなら、あんなもん使わないでください。文字コードも変更できない、あんな見づらいエディタを使う意味など皆無です。
最低限、PHPのコードが色付けされる、文字コードが変更できるエディタがあったほうがいいです。
Windowsで無料なら例えば、

notepad++ ←僕はこれ使ってます。
PHPエディタ
サクラエディタ
TeraPad

あたりでしょうか。Macは使ってないのでよく知りません。
今回、基本的に文字コードは全て「UTF-8N」(ボム無しUTF-8)という前提で進めます。

環境を確認

エディタで、下記のコードを「info.php」とか適当な名前で保存します。

<?php
 phpinfo();
?>

作ったファイルをアップロードして、ブラウザでアクセスすると、ずらずらと情報が表示されます。
もしこれが表示されない場合は、そもそもそのサーバではPHPが使えません。別のサーバを使ってください。
[2011/03/30 11:00追記]→コメントにてご指摘頂きました。サーバによってはこの関数を使えない場合があります。PHPが使えるかどうかは、利用しているレンタルサーバにお問い合わせください。

細かいことは置いといて、このページを名前をつけてローカルに保存してください。保存したら、サーバから「info.php」は必ず削除してください

さて、ローカルに保存した「info.php」をブラウザで開いてみましょう。これにはサーバのいろんな情報が書かれています。

とりあえず「DOCUMENT_ROOT」だけ確認すればいいです。絶対パスと呼ばれるものです。
(「DOCUMENT_ROOT」で検索するといくつか引っかかりますが、同じ値だと思います。)

「え?絶対パスって知ってるのと違うよ?」と思った人はHTMLでの絶対パスを思い浮かべた人でしょう。
ここでの絶対パスとは、サーバのシステムルートからの絶対パスであり、Webサーバのルートからの絶対パスではありません。

FTPで見るより、もっと深い階層があるんだと思っておけばいいです。

準備はここまで。

基本的なこと

普通のチュートリアルだとここから丁寧に変数の説明とかするんですが、超ダッシュで一息にまとめます。
コーラでも一気飲みして勢いをつけたら、下記のコードを見てください。

<?php // ←phpを書くための約束。<html>と同じようなもの
# シャープがついたら、それより後ろはコメント。コメントは全部で3種類ある。
// スラッシュ2回。これもそれより後ろがコメント。
/* これもコメント。
これは囲まなきゃいけないけど、複数行コメントに出来る。 */

$hoge="test";
// ドルマークがついたら、「変数」。数値とか文字列とかを入れることが出来る。
// 変数は英数字とアンダーバーのみで、先頭は数字じゃだめよ。
// 値を入れるときには「=」を使う。
// 文字列は「""」(ダブルクオーテーション)か「''」(シングルクオーテーション)で囲まないとエラーになる。

echo $hoge; // ←脆弱なので、通常はこのようには書かない。
// 「echo」は出力して!って命令。
// HTMLみたいに、書けば表示されるもんじゃないので、表示してほしいものは命令しないといけない。
// ちなみに、$hogeには上で"test"って文字列を入れたのでブラウザでは「test」って表示されるはず

$arr=array();
$arr[0]=100;
$arr[1]=500;
$arr[2]=999;
// これは「配列」。変数のすごい版(嘘)で、値を複数入れることができる。
// array()っていうのが「これは配列だよ!」って宣言。
// [0]とか[1]とかが「キー」。中身が対応してる。

echo $arr[1];
// こうすると「500」が表示される。

// ちなみにこのように書くことも出来る。やってることは上と同じ。
$arr=array(100,500,999);

echo $arr[2];
// 何も書かないとキーは 0 から始まる。
// だから、上の中身は[0]=>100, [1]=>500, [2]=>999 ってなってる。
// これは999が表示される。

echo $arr[0]+$arr[1];
// これは100+500で600が表示される。計算できるんだね。だいたい察して。

$arr["aaa"] = "boke";
$arr["bbb"] = "aho";
// こんな感じで文字をキーにすることも出来る。

echo $arr["aaa"].$arr["bbb"];
// これは「bokeaho」と表示される。
// 2つ以上の文字列を連結するには「.」(ドット)を使う。ドットがないとエラーになる。

// 配列の中身を表示するのには、foreachが便利。
foreach($arr as $k=>$v){
  echo 'キー:'.$k.' 中身:'.$v;
}
// 中身とキーを表示する。

// 最初から決まってる特別な変数もある。
// とりあえず使うのは以下の2つ。
$_POST;
$_GET;
// ちなみにこんなふうにコードの中に変数が書いてあるだけだと何も起こらない。何も命令してないから当たり前だね。
// HTMLの<form>タグに<form method="post">って書いてあったら$_POST
// 何も書いてないか、<form method="get">って書いてあったら$_GET
// そこに、それぞれinputタグとかselectタグの中身が入ってくる。
// <input type="text" name="onamae" />ってタグの中身は
// $_POST['onamae']として入ってくる。
// $_GETはURLにくっついてくるので、直接アドレスバーに書いて、値を決めることも出来る。
// http://quoit.jp/hoge.php?aaa=99
// これは$_GET["aaa"]=99; として中身が入ってることになる。


if($hoge=="test"){
  echo $hoge;
}elseif($hoge=="piyo"){
  echo "(´ω`)";
}elseif($hoge!="ika"){
  echo "( ゚д゚)";
}else{
  echo "(´・ω・`)";
}
// if・・・は「もし・・・だったら」ってそのまんま。
// 「=」一個だけだと「値を入れる」って意味なので、「等しい」を表すには「==」って二個にする。
// だから、$hogeが「test」だったら、中身を表示。
// elseif・・・は「そうじゃなくてもし・・・だったら」なので、「test」じゃなくて「piyo」だったら「(´ω`)」を表示
// $hogeが「ika」以外だったら「( ゚д゚)」を表示。「!」は否定を表す。
// else「そうじゃなかったら」なので、上のどれにも当てはまらなかったら「(´・ω・`)」を表示

function foo($val){
  $ret=$val."オラオラオラオラ";
  return $ret;
}
// これは「関数」。
// 「機能をまとめておけるもの」かな。
// カッコ()の中が「引数(ひきすう)」と呼ばれるもので、関数に渡される値。
// 今回は関数の中で引数の中身に文字列をくっつけて、値を返してるので、次のようになる。

$hoge="WRYYYY!";
$hoge2=foo($hoge);
echo $hoge2;

// 表示されるのは「WRYYYY!オラオラオラオラ」。
// 最初に入ってる値が、関数で処理されることで内容が変わるんだよ、ってことですね。

// phpを書くための約束。</html>と同じようなもの↓
?>

ちょっとがっつりだけど、これ読んでなんとなく分かればいいです。
分からない方はコメントくださいな。

メールフォームを作る

使えるものを作りましょう。プログラムを作る時は、まず最初に処理の流れを考えます。
まぁ今回はシンプルに。

1) データを入力する
    ↓
2) 送信する

というだけにしましょう。
確認画面は入れない。面倒だから。

言い忘れてたけど、PHPはHTMLと同居出来る。
つまり、こういう書き方が出来る。

<html>
<head><title>テスト</title></head>
<body>
<?php
echo "hoge";
?>
</body>
</html>

ただこれだと見づらくなるから、PHPでHTMLをテンプレートとして読み込んだりすることもあります。(例:Smarty

今回は上のように同居させます。

さて、画面としては2つ必要です。

1)内容入力画面
2)送信完了画面

送信完了画面を表示する前に、送信処理をしなきゃいけない。
ただ、送信完了画面=送信処理とすると、完了画面を更新(F5)したときに二重送信になってしまう。
それを避ける方法はいくつかあるのですが、今回は送信後に完了画面にリダイレクトさせる、という方法を使います。

ということで、処理の流れは、

1) データを入力する
    ↓
2) 入力内容を確認 →エラーがあったら入力画面に戻る
    ↓
3) エラーがなければ送信する
    ↓
4) 送信完了画面を表示する

という流れになります。

さて、いよいよ実際のコーディングへ。
まずは1)の内容入力画面。
入力できる項目は「お問い合わせ内容」だけにします。


<?php
// 先にHTMLを書いちゃうと、処理をする前に内容が表示されちゃうので、処理内容を先に書く。
// まずは何か変更があったら書き換えやすいように、設定を書きましょう。

// 宛先
$to="info@quoit.jp";
// From欄の中身
$from="info@quoit.jp";
// メールのタイトル
$title="【お問い合わせがありました】";
// [2011/03/30 11:00追記]完了画面のURL
$url="http://quoit.jp/finish.html";


// 次にデータが送られてきた場合の処理を書く。

if(isset($_POST["send"])){// データが送信されていた場合
  if(!isset($_POST["contact"])){// 本文が空だった場合はエラー文を設定 [2011/03/30 11:00修正]empty関数→isset関数に変更
    $error="本文を入力してください。";
  }else{
    // 本文の入力内容を変数に入れる
    $contact=$_POST["contact"];
    // メール送信時の日本語設定。UTF8にします。
    mb_language("japanese");
    mb_internal_encoding("utf-8");
    // ここからメール送信処理
    // PHPに初めから用意されている関数を使う。(mb_send_mail関数について詳しくはググってください)
    // この関数は、「エラーだとFALSE(否定)を返す」。
    // こういう場合、if(!mb_send_mail()){ ??; } と書くと、「??;」はエラーだった場合に実行される。
    if(!mb_send_mail(
      $to,// 宛先。
      $title,// タイトル
      $contact,// 本文(受け取った値)
      'From: '.$from."\r\n".
      'Reply-To: '.$from."\r\n".
      'X-Mailer: PHP/' . phpversion(),
      "-f ".$from
    )){
      // エラーだった場合にエラー文を設定
      $error="メールを送信できませんでした。";
    }else{
      // 問題なければ、送信完了画面(finish.html)に飛ばす
      header("Location: ".$url);
    }
  }
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>メールフォームの入力画面</title>
</head>
<body>

メールフォーム

<form method="post">

お問い合わせ内容

<p style="color:red;"> <?php echo $error; ?> </p> <input type="submit" name="send" value="送信する" /> </form> </body> </html>

このファイル以外に、「送信ありがとうございました」的な内容を書いたfinish.htmlを用意しておけば完了。

どうでしょうか?簡単でしたか?

これを読んで、何となく分かった気になったら、ちなみにそれは勘違いです!

ご質問、ツッコミなどはコメントやTwitterでください。

どうぞ素敵なプログラミングライフを。

2011/03/30 11:00追記

コメントで頂いたご指摘と、はてなブックマークでご指摘頂いた部分を追記/修正しました。

2011/03/30 12:20追記

はてなブックマークでご指摘頂いた部分をちょこっと修正。

2011/03/30 15:00修正

「メール本文に対してhtmlspecialcharsをかけるべきではない」の意味がよく分かってなかったのですが、ご指摘頂いてようやく分かりました…ご指摘頂いた皆様ありがとうございます。一部修正しました。

2011/03/30 19:00修正

はてなブックマークでご指摘頂いた部分をちょこっと修正。コメントを追加。

2011/03/31 19:30修正

コメントで頂いたご指摘を元に、一部文言を修正。

2012/02/16 15:00追記

以前、セキュリティについてツッコミ頂いてたのですが、はまちちゃんがためになるエントリーを公開されてたので、追記としておきます。これは一度読んでおくべき。

5分でできるPHPセキュリティ対策 – ぼくはまちちゃん!(Hatena)

7 comments for “忙しい人のための「初めてのPHP」

  1. 2011年3月29日 at 5:44 PM

    とても分かりやすい文章で楽しく拝見致しました。

    > もしこれ(phpinfo)が表示されない場合は、
    > そもそもそのサーバではPHPが使えません。

    この部分、説明としてはとても分かりやすいのですが、
    ホスティング環境によってはphpinfoの実行を
    禁止している所もあるので、一概には言えないかもしれません。

    先日、クライアントが使っているレンタルサーバ
    (大○商会が提供している、未だにPHP4なサーバ)
    でphpinfoを実行しようとした所、
    真っ白な画面でソースも空白になったので・・・

    ちなみに、上記サーバではphpversion関数を使って
    バージョンを確認する事ができました。

    この様な素敵な記事でPHPを使う人が増えてくれると
    嬉しいですね。

  2. yakumo
    2011年3月30日 at 11:00 AM

    ヒルさん>
    ありがとうございます!
    仰る通りですね…すっかり失念しておりました。
    一部文章を修正致しました。ご指摘ありがとうございました!

  3. Pingback: wired raven
  4. pochi-p
    2011年3月31日 at 2:52 PM

    『基本的なこと』がプレーンテキスト、他のがhtmlを返すサンプルだと読む方も混乱するでしょうから、
    (主に利用される)htmlを常に返すサンプルで統一した方が良いと思います。

    初心者向け解説でhtmlspecialcharsは後回しにされるという事ならば、

    echo hoge$;
    などは全て

    echo hoge$; //←脆弱脆弱ゥ!
    と記載してみてはいかがでしょうか?

    「難しくてまだ分からないけど何か要注意なんだ」って頭にいれておくだけでも意味はあるかと思います。

    それと細かい事ですがhtmlspecialcharsは「※ブラウザに表示される文字列はセキュリティ上…」と言うより「きちんと表示させる為」が正解ですよ。
    当たり前がおろそかだとセキュリティの問題にもなるという結果論であって、文字をきちんと表示する必須事項と理解しないと他で同じミスをします。

  5. yakumo
    2011年3月31日 at 7:38 PM

    pochi-pさん>
    ありがとうございます。

    > (主に利用される)htmlを常に返すサンプルで統一した方が良いと思います。

    仰る通り、前提をどこに置くかによって読み方を変える必要があるのは、混乱の元になりますね。。
    頂いたご指摘を元に一部文言を修正しました。ありがとうございます。