Webサービスをつくりたいという思いで、最近読んだ書籍”よくわかるPHPの教科書”についてのメモをまとめようかと。内容は大きく、PHPの基礎、データベース操作、掲示板の作成から成り、実践型で自分にはあってて良かったです。環境はMAMPのローカル。
PHPの基礎
- php.iniの場所変わってる:/Applications/MAMP/bin/php/php5.3.6/conf/php.ini→display_errorsをOnに変更(p40)
- シングルクオーテーションとダブルクオーテーション両方使えるというけど、使い方の指針が自分の中でまとまってない。一般的な使い方はあるのかな。
- 月の末日はdate(“t”)で取れる(p68)
- 配列 $prefs = array(“北海道”, “青森”, “秋田”);
- 要素数取得 count($prefs)
- foreach ($prefs as $pref) { $pref… }
- 配列に値追加 $prefs[] = “岩手”;
- 配列に値追加 array_push($prefs, “岩手”);
- 配列末尾から値削除 array_pop($prefs);
- 連想配列 $items = array(‘a-1′=>’gum’, ‘b-1′=>’choco’, ‘c-1′=>’cookie’);
- foreach ($items as $itemKey => $itemValue) {…}
- 配列 関連リファレンス http://www.php.net/manual/ja/ref.array.php
- フォームの空チェック if (empty($_REQUEST['my_name'])) {…} else {…}
- チェックボックスなど複数項目を渡す場合
- name属性に[]を付けて配列として渡す input id=”reserve_1″ type=”checkbox” name=”reserve[]” value=”1/1″
- 受け側は二次元配列で参照する foreach ($_REQUEST['reserve'] as $reserve) {…}
- 全角文字を半角文字に変換する mb_convert_kana($_REQUEST['age'], ‘n’, ‘UTF-8′)
- パラメータリファレンス http://jp.php.net/manual/ja/function.mb-convert-kana.php
- 数字かどうか判定する is_numeric($age)
- 正規表現でチェックする preg_match(“/^d{3}-d{4}$/”, $zip)
- 最初と最後は/を付けてまとめる
- 先頭は^
- 末尾は$
- 数字はd
- 複数回続くのは{回数}
- ハイフンは-
- ヘッダ情報を出力する
- 別のページにジャンプする header(‘Location: http://d.hatena.ne.jp/yamashina/’);
- ヘッダ情報はページの最初に出す。途中だとエラーになる。
- リファレンス http://www.php.net/manual/ja/function.header.php
- Cookieで入力情報を記憶する
- setcookie(‘my_id’, $my_id, time() + 60*60*24*14);
- リファレンス http://www.php.net/manual/ja/function.setcookie.php
- $_COOKIE配列で参照できる
- Cookieに保存されているか確認する isset($_COOKIE['my_id'])
- Cookieには大切な情報を保存しない
- FirefoxのCookie保存場所 /Users/”username”/Library/Application Support/Firefox/Profiles/”xxxxx”.default
- セッションでWebブラウザを閉じるまでデータを保持する
- セッションを使うページでsession_start()が必要
- $_SESSIONに保存する
- リファレンス http://www.php.net/manual/ja/book.session.php
- セッション情報を消すときはsession_unset
- Webサーバにセッション情報が保存される
- phpinfoに保存場所が記載している
- インストールしたMAMPだと、/Applications/MAMP/tmp/php
- クライアントにはセッションIDを発行し、Cookieに保存される
- セキュリティリスクにセッションハイジャックというのがあるみたい。
- ファイルアップロード
- フォームの属性にenctypeを付ける。enctype=”multipart/form-data”
- methodは必ずpost
- データは$_FILES['フォームのname属性値']に格納される
- ファイル名:$_FILES['フォームのname属性値']['name']
- アップロードしたファイル:$_FILES['フォームのname属性値']['tmp_name']
- 上記テンポラリファイルを移動する move_uploaded_file($_FILES['フォームのname属性値']['tmp_name'], $filepath);
- 部分文字列を取得する $ext = substr($file['name'], -3);
- ファイルに書き込む $success = file_put_contents(‘./news_data/news.txt’, ’2012-01-08 Hello, world!’);
- ディレクトリが無かったらwarning出る
- ファイルが無かったら新規作成する
- 通常はドキュメントルートよりも外に保存する。ブラウザでアクセス可能なので。
- ファイルから読み込む $news = file_get_contents(‘./news_data/news.txt’);
- xmlを読み込む $xmlTree = simplexml_load_file(‘http://d.hatena.ne.jp/yamashina/rss’);
- 要素の出力 foreach ($xmlTree->item as $item) { print(” . $item->title . ”);}
データベース操作
- MAMPのphpMyAdminでデータベース操作する
- オートインクリメントはプライマリキーに設定したフィールドにのみ利用可能
- レコードを削除し、再度挿入した際、オートインクリメントでは新しい値が設定される(値の使い回しはされない)
- 不等号は:SELECT * FROM `my_items` WHERE id1;
- 文章の部分検索はLIKE:SELECT * FROM `my_items` WHERE keyword LIKE ‘%甘い%’;
- データの並び替えはORDER BY:SELECT * FROM `my_items` ORDER BY id ASC;
- フィールドは相対情報よりも絶対情報でつくるようにする
- “ランキング”より、”売上数”や”点数”といったフィールドをつくる
- 参照時にORDER BYで並び替える→相対情報がわかる
- 時間を表す型にDATETIME型とTIMESTAMP型がある
- XX毎に集計するのはGROUP BY:SELECT item_id, SUM(count) FROM carts GROUP BY item_id;
- 内部結合は両方のテーブルにデータが存在しないと結合されずデータが表示されない。
- 外部結合は一方のテーブルにデータが存在すればデータが表示される。SELECT i.item_name, SUM(c.count) FROM my_items i LEFT JOIN carts c ON i.id=c.item_id GROUP BY i.id;
- 重複をなくすにはDISTINCT:SELECT DISTINCT item_id FROM carts;
- 間を示すにはBETWEEN
- 複数の値を示すにはIN
- 件数を制限するにはLIMIT
- フィールドに別名を付けるにはAS
- バックアップ:データベーススペース選択→エクスポートタブ選択→Save as fileにチェックしてGo→.sqlファイルがDownloadフォルダに出来る
掲示板の作成
PHPとDBの連携について学習(Part5 practice1)
PHPでDBへのデータ追加・読み込み・更新・削除(CRUD)をひと通りやった。
- DB接続でやる最初の処理セット
- mysql_connect(‘localhost’, ‘root’, ‘root’) or die(mysql_error());
- mysql_select_db(‘mydb’) or die(mysql_error());
- mysql_query(‘SET NAMES UTF8′);
- レコードセットを取得する:$recordSet = mysql_query(‘SELECT * FROM my_items’);
- レコードセットから1レコード取り出す:$data = mysql_fetch_assoc($recordSet);
- mysql_fetch_assocは最後までデータを取り出し終わるとfalseを返す
- その他レコード取得関数のリファレンス:http://php.net/manual/ja/book.mysql.php
- フォームのデータを使用するときは直接使用せず、mysql_real_escape_stringを使う:mysql_real_escape_string($_POST['maker_id'])
- SQLインジェクション対策。不正な文字列のサニタイズ(sanitize):無害化をやってくれる。
- 共通処理はくくりだして読み込む:require(‘dbconnect.php’);
ひとこと掲示板の作成(Part5 practice2)
- 機能はユーザ登録とつぶやき投稿
- phpMyAdminでデータベーススペース作成→mini_bbs。テーブルはmembers,postsの2つ
- ユーザ登録のスクリプトはhtdocs/mini_bbs/join配下に格納
- セッション使う
- ユーザ登録で、DBにパスワードを入れる際、mysql_real_escape_string関数で無害化した結果を、sha1関数で暗号化している:sha1(mysql_real_escape_string($_SESSION['join']['password']))
- ログイン状態でのみ表示したいページ(投稿画面)へのアクセスでは、チェックしている:if (isset($_SESSION['id']) && $_SESSION['time']+3600 > time()) {…}
- idがセッションに記録されている
- 最後の行動から1時間以内である
- 共通処理は関数にまとめる
- function h($value) { return htmlspecialchars($value, ENT_QUOTES, ‘UTF-8′); }
- 正規表現で、URLが含まれる投稿にリンクを張る(関数を作る)
- function makeLink($value) { return mb_ereg_replace(“URLパターン(正規表現)”, “リンク貼った置換後の文字列”, $value); }
- ログアウトで、「セッションを破棄する」「ログイン情報を記憶しているCookieを削除する」ことをやっている
- セッションの破棄:http://www.php.net/manual/ja/function.session-destroy.php
- Cookieの削除は空の内容追加&有効期限を過去に設定することで実現:http://www.php.net/manual/ja/function.setcookie.php
ライブラリ:PEARとフレームワーク:CakePHPについて(Part5 practice3)
PEAR
- PHP Extension and Application Repositoryの略
- 入れたパッケージ
- PEAR Base System ver.1.9.4
- Net_UserAgent_Mobile ver.1.0.0
- PEARパッケージのパスを追加:set_include_path(get_include_path() . PATH_SEPARATOR . ‘./PEAR’);
- Net_UserAgent_Mobileをインクルード:require(‘Net/UserAgent/Mobile.php’);
- Firefoxでケータイ端末をシミュレートするアドオン:FireMobileMisulator
CakePHP
- ダウンロードしたのは、2.0.5 安定版
- 解凍したフォルダを”cake”にリネームして、htdocsに移動させる
- http://localhost:8888/cake/にアクセスすると、リリースノート&設定指示が表示される
- /cake/app/Config/core.phpのSecurity.saltとSecurity.cipherSeedを編集する
- /cake/app/Config/database.php.defaultをdatabase.phpにリネームし、$default配列を変更する
- まだないURLにアクセスすると、次にやること(Error)が表示される:http://localhost:8888/cake/posts
- Controllerをつくる:/cake/app/Controller/PostsController.php
- Viewをつくる:/cake/app/View/Posts/index.ctp
- 見栄えを変える場合はレイアウトファイルを作る:/cake/app/View/Layouts/default.ctp
- URLを変更する場合はルーティングファイルを変更する:/cake/app/Config/routes.php
- CakePHPは、データベースのフィールド名に決まりがあったり、テーブル名は英単語の複数形にするなどの決まりがある
よくわかるPHPの教科書
posted with amazlet at 12.01.20
たにぐち まこと
毎日コミュニケーションズ
売り上げランキング: 1299
毎日コミュニケーションズ
売り上げランキング: 1299
関連エントリー