2013年2月13日水曜日

ドットインストール phpの基礎(応用編)




データベースへの接続


 今回はMySQLに接続する方法を紹介

 練習用のデータベースを作成
       $ mysql -u root -p

mysql> create database データベース名(今回はTable_in_blog_app)
mysql> use データベース名(今回はTable_in_blog_app) 
mysql> create table users(
  -> id int(11) not null auto_increment primary key,
  -> name varchar(50),
  -> email varchar(255),
  -> password varchar(16)
  -> );

 作業ユーザーも設定しておきましょう

mysql> grant all on データベース名(今回はTable_in_blog_app).* to 作業ユーザー名(今回はdbuser005)@localhost identified by 'パスワード'

 try - catch
  トライ以降の命令をやってみてダメだったらキャッチ以降の命令をやりなさいという意味

<?php

try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
                                  //dbhはデータベースハンドラのこと、
         //PDOはmysqlに接続する方法
         //ここの書き方はお決まりです。
         //ここでデータベースへの接続を試みている

}catch(PDOException $e){                         //エラーが発生した時には
            var_dump($e -> getMessage());   //エラーの内容を取得
            exit;                                                                            //処理を終了
}

echo "success";                     //うまく行ったらサクセスと表示
$dbh = null;              //接続を終了

MySQLに接続してデータを取ってくる方法


<?php

try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e -> getMessage());
            exit;
}

//処理
//全てのユーザーを取得して表示する
$sql = 'select * from users';
$stmt = $dbh->query($sql);//データベースハンドラにquery(sql文の変数)をいれると実行してくれる
foreach ($stmt ->fetchAll(PDO::FETCH_ASSOC) as $user){
            //実行した結果は$stmtのfetchAllでとってこれる
            //引数にPDO::FETCH_ASSOCとすると連想配列的にとってきてくれる
            //foreachで一つ一つをユーザーとしてまわしていく
            var_dump($user['name']);
}
            //件数を表示
echo $dbh -> query("select count(*) from users")->fetchColumn(). "records found";
            //fetchColumn()でqueryを表示
            //切断
            //countと()の間にスペースを入れると表示されないので注意
$dbh = null;


データを挿入してみよう!


== 例1 ==
<?php

try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e -> getMessage());
            exit;
}

//処理 プリペアードステートメントを使う
// prepare()の中にsql文を書く
//valueははてなにしておく、

$stmt= $dbh ->prepare("insert into users (name, email, password) values (?, ?, ?)");
//?にはいる値を配列でexecuteに与える
//プリペアードステートメントはエスケープ処理を自動でやってくれる
$stmt ->execute(array("n", "e", "p"));

echo "done";

            //切断
$dbh = null;

== 例2 value(?, ?, ?)じゃわかりにくいという場合==

<?php

try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e -> getMessage());
            exit;
}

//処理 プリペアードステートメントを使う
// prepare()の中にsql文を書く
//valueははてなにしておく、
$stmt= $dbh ->prepare("insert into users (name, email, password) values (:name, :email, :password)");
//(name, email, password)にはいる値を連想配列的にexecuteに与える
//プリペアードステートメントはエスケープ処理を自動でやってくれる
$stmt ->execute(array(":name" =>"n2", ":email"=>"e2", ":password"=>"p2"));

echo "done";

            //切断
$dbh = null;

プリペアードステートメントの違った書き方


<?php

//データベースへの接続
try{
            $dbh = new
            PDO('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e->getMessage());
            exit;
}

//処理
$stmt =$dbh->prepare("insert into テーブル名(フィールド名1, フィールド名2, フィールド名3) values(:フィールド名1, :フィールド名2, :フィールド名3)");
//フィールド名プレースフォルダーを変数に当てはめてる
$stmt ->bindParam(":フィールド名1", $変数1);
$stmt ->bindParam(":フィールド名2", $変数2);
$stmt ->bindParam(":フィールド名3", $変数3);

//変数に値を入れていく
$変数1 = "n10";
$変数2  = "e10";
$変数3  = "p10";
//変数を代入したプレースフォルダーが挿入される
//executeと引数なし
$stmt -> execute();

//変数1以外は変更なしに挿入される
$変数1  ="n10x";

$stmt ->execute();
//インサートされたレコードのIDを知りたい
echo $dbh->lastInsertID();

echo "dune";

//切断
$dbh = null;

データの更新と削除の仕方



<?php
try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e ->getMassate());
            exit;
}
//名前がnから始まる人たちのEメールアドレスをダミーに変える
$stmt = $dbh -> prepare("update users set email = :email where name like :name");
//"n%"はnから始まるという意味
//update users set email = :email were name like :nameこれはnameが:nameで指定した形の場合はemailを:emailで指定した値にしなさいということ

$stmt -> execute(array(":email" =>"dummy", ":name"=>"n%"));

//パスワードがp10のものを全て削除
//delete form users where password = :passwordとは:passwordが指定した値のもののユーザーを削除しなさい
$stmt = $dbh -> prepare("delete form users where password = :password");
$stmt -> execute(array(":password" =>"p10"));
//削除されたかを表示
echo $stmt ->rowCount() ."records deleted";
echo "done";


Cookieを設定してみよう!

<?php

//Cookie(ブラウザにデータを保存)
setcookie("クッキーの名前","クッキーの値","有効期限");

setcookie('userName', 'taguchi', time()+60*60*24*14);//2週間
setcookie('userName', '', time()-60)//有効期限マイナスにするとクッキーを削除するという命令

//このようにアクセスできる
//複数のページで使い回したいデータがあった場合に便利
echo $_COOKIE['userName'];

セッションを使ってみよう

<?php

//セッション(サーバー側にデータを保存するという仕組み)

session_start();//セッションを使うおまじない

$_SESSION['セッション変数'] = "セッションの値";//これでセッション変数に値をセット
unset($_SESSION['セッション変数']);//セッション変数を削除
echo $_SESSION['セッション変数'];// これでセッション変数の中身が表示される

クラスを使ってみよう


//オブジェクト指向
ユーザーに関するデータや関数をまとめて管理する為の考え方
/*

クラス : 設計図(どういった変数関数があるのかみたいな)
 - メンバー変数
 - メソッド(関数)(何らかの処理を行おう)
 - コンストラクタ(初期化処理、特殊なメドッド)

 インスタンス: クラスを実体化したもの(設計図を実体化)



*/
<?php
//userというクラスを作る
class User{
            //メンバー変数を定義
            public $name;//publicはどこからでもあくせすされてOK
            public $email;//publicではなくprivateにするとclassの外からはアクセスできない
           
            //実体化する時にnameとemailを渡されるとすると
            //コンストラクと
            //__constructで出てくるname, emailは上で出てきたname emailとは違う
           
public function __construct($name, $email){//インスタンスかされる時に呼ばれるn引数
                        $this->name = $name; //thisをつけるとclassないでその変数にアクセスできる
                        $this->email= $email;
}


//メソッドを作れる
public function sayHi(){
            echo "hi! my name is" .$this->name;
}
}
//実体化newを使う
//同じようなやり方でいくらでもインスタンスを作れる
//こうするとtomさんやbomさんに設定した変数や関数が使えるようになる
$tom = new User("tom", "dummy@dummy.com");
$bom = new User("bom", "dummy`dummybob.com");
//トムさんの名前を表示
echo $tom->name;
//tom,bomさんのsayHiを表示
echo $tom->sayHi();
echo $bom->sayHi();

クラスの継承

Userというクラスを拡張する

<?php

class User{
            public $name;
            public $email;
           
            public function __construct($name, $email){
                        $this->name = $name;
                        $this->email= $email;
            }
           
            public function sayHi(){
                        echo "Nice to meet you".$this->name;
            }
}
//Userを拡張してSuperUserを作る
//Userのメンバー変数ファンクションメソッドを引き継いで上書きしたり別のメソッドを作ったりできる
class SuperUser extends User{
           
            public function superSayHi(){
                        echo "Hiii! my name is".$this->name;
            }
}
           
            //bomさんはSuperUserを使えるようにする
            $tom = new User("tom", "tomutomu@tomu.org");
            $bom = new SuperUser("bom", "bombom@bommm.org");
           
//$bomさんはSuperUserなのでSupserSayHi()が使える

echo $bom->SuperSayHi();

長くなってきた時にファイルを分割する方法

同じフォルだにclass.phpというファイルを作って
ーーーーーここからーーーーーー
class User{
            public $user;
            public $name;
           
            public function __construct($user, $name){
                        $this->user = $user;
                        $this->name = $name;
            }
            public function sayHi(){
                        echo "Nice to meet you".$this->name;
            }
}
class SuperUser extends User{
            public function superSayHi(){
                        echo "Hiii! my name is".$this->name;
            }
}
ーーーーーここまでーーーーーー
はりつけて、頭に<?phpと書く
こうした外部ファイルはrequire_once('ファイル名')で読み込む
ちなみに

require('..');エラーで強制停止、その都度読み込む
require_once('...'); エラーで強制停止一回だけ読み込んでほしい時につかう

include('...');エラーで警告、その都度読み込む
include_once('...'); エラーで警告、一回だけ読み込む


で、index.phpには以下のようにかいておくと分割されたclassが読み込まれて実行される
<?php
require_once('class.php');


            $tom = new User("tom", "tomutomu@tomu.org");
            $bom = new SuperUser("bom", "bombom@bommm.org");
           
//$bomさんはSuperUserなのでSupserSayHi()が使える


echo $bom->SuperSayHi();

2013年2月10日日曜日

ドットインストール MySQLの基礎 4

  1. レコードの総件数を調べる
    select count(*) from users;

    チームというフィールドにはどのような値が入っているのか、重複なしで調べる
    select distinct team from users;

    数値に関しては最大値もとれる
    select max(score) from users;

    平均を取る時はこれ
    select avg(score) from users;

    合計はこれ
    select sum(score) from users;

    ある項目で指定した値に一致するもの同士の他のフィールド値の合計
    select round();
    乱数を表示 ランダムに抽出する

    select * from users orders by round() limit1;
    適当に並び替えてそのうち一人だけ持ってきなさい

    型を明示的に表示する→typeof(フィールド名)
    select name, typeof(name) from users

    select email, length(email) from users;
    選んだフィールドのある各項目の長さ

    select concat(name, '(',team,')') from users;
    文字や項目を連結して表示できる

    select concat(name, '(',team,')') as label from users;
    とすると項目名がlabelと表示される

    select name, substring(team, 1,1) from users;
    ここではチーム名の一文字目から一文字だけ引っ張ってくるように指示している

    現在時刻を求めたい時は
    select now();

    select name, month(created) from users; dagediff
    日付の差分を日数で求める

    select name, datediff(now(), created) from users;
    で現在と作られた日の差分が求められる

    selsect!!!!!!!!!!!!!!!!!!!!!!!
    リファレンスの関数と演算しというところに情報があるのでみてください
  2.  

ドットインストール PHPの基礎③


三項演算子(条件演算子)

まず普通に条件分岐を書くと

$age = 20;

if ($age > 20) {
    $massage = “大人”;
} else {
    $massage = “子供”;
}
   となるのですが

   同じことを三項演算子を用いて書くと

    $message = ($age > 20) ? “大人” : “子供” ;
   となるので便利です

条件分岐(switch)
 選択肢があらかじめ決まっていて条件に応じて振り分けたい場合に使う

 〜書き方〜
case 条件:
 命令文
break;

 因にdefaultは例外処理

 〜例〜
 $signal(ここでは信号の色)が
 赤だったら「止まれ」
 緑なら「進め」
 黄色なら「注意」
 を表示する命令を書いている。
 caseの後ろに変数の値の条件を書き、
 コロンからbreakまでを実行する。
 
  $signal = "green";
   switch($signal){
               case "red" :
               echo "止まれ";
               break;
               case "blue" :
               case "green":  //条件が二つある時はcaseを二つ並べてから命令
               echo "進め";
               break;
               case "yellow" :
               echo "注意";
               break;   default :
               echo "わからない";
               break;
  }               


文字列に関する関数
 printf() -> フォーマット化された文字列を返す

  〜例〜
  we have 40 bananas for $5.23と表示させたい場合

   $s = "banana";
   $n = 40;
   $p = 5.30;

  printf("we have %d %ss for $%f", $n, $s, $p);
  “%”+”オプション“で変数を代入できる

  オプションの意味は

   %d -> 整数値
   %ss -> 文字列
   %f -> 小数値

  さらにオプションと%の間に数字を入れることで桁数を指定できる
   %.2f 小数点以下に桁
   %5d  五桁
   %05d 5桁だけれども5桁に見た無い場合は0で埋めてくれる
 関数sprintf() -> 機能はprintf()と同じだけど、値を返してくれる
                 $変数名 = sprintf()
                 という風に変数に格納することもできる

配列に関する関数
 array(“要素”,”要素”,”要素”) -> 配列を格納する
 count(変数名) -> 配列の要素数を返してくれる
 sort(変数名) -> 配列をアルファベット順に並べてくれる
 in_array("要素", "配列を格納した変数名”) -> 配列に要素があるか判定
 implode(“区切り文字”, 配列変数名) -> 配列を区切り文字を使って表示
  explode("区切り文字", 文字列変数名) -> 文字列を特定の文字で区切って配列に変換

 〜例〜
  $members = array("tanaka", "Sasaki", "kuma", "yoshida", "uchida");

  //count 要素の数を返してくれる
  echo count($members);

  //sort アルファベット順に並べてくれる
  sort($members);
  var_dump($members);

  //in_array 配列にはいっているかどうか調べる
  if (in_array("tanaka", "$members)){
                echo "Bingo!"
  };

  //implode 配列の中身を何らかの区切り文字を使って表示したい
  //explode何かの文字で区切って配列にする
  $atstr = implode("@", $members);
  var_dump(explode("@", $atstra));

日付や時間に関する関数
  unixタイムスタンプ
  (1970/1/1 00:00:00からの経過秒数)

  time() -> 現在時刻のユニックスタイムスタンプ
   mktime(時,分,秒,月,日,年) ->特定日付のユニックスタイムスタンプ
   strtotime() ->日付っぽい文字列からタイムスタンプを作ってくれる
              例 strtotime("last Sunday")
   echo date("フォーマット", タイムスタンプ") ->タイムスタンプを特定のフォーマットに直す
 

ファイルの読み書き

 test.dat
 パーミッション 
 読み書く×3
 <?php


 $testFile = "test.dat";
 $contents = "こんにちは";

 if(is_writable($testFile)){ //書き込み可能かチェック
 //ファイルをオープンできたか? fopenでopen aは今あるファイルの末尾にデータを加える
 //ファイルポインタリソースが帰ってくる
 //整理券みたいなもの
 if(!$fp= fopen($testFile, "a")){//fpがフォルスだったら
 echo "could not open";
 exit;
 }
 //書き込めたか??

 if(fwrite($fp, $contents)===false){//===は型も値も同じ
 echo "could not write";
 exit;
 }
 echo "success";
 fclose($fp);
 }else{
 echo "could not writable";//書き込み可能でなければexit

 exit;
 }

ファイルからデータを読み出そう
 $testFile = "test.dat";

 if(!$fp = fopen($testFile, "r")){
                echo "could not open";
                exit;
 }

 $contents = fread($fp, filesize($testFile));

 var_dump($contents);

 fclose($fp);


もっと簡単にできる

 $testFile = "test.dat";

 $contents = file_get_contents(ファイル名); //ファイルの中身を読み込む
 $contents = file_get_contents("URL");//ソースコードをとってくる
 $contents = file($testFile);//ファイルの中身をよみこんで一行ごとに入れに突っ込む
 var_dump($contents);

フォームからのデータを受け取ろう

 <?php

 $birthday =$_POST['birthday']

 $youbi = date("l", strtotime($birthday));

 ?>

 <!DOCTYPE html>
 <html lang="ja">
 <head>
 <meta charset="UTF-8" />
 <title>PHPの練習</title>
 </head>
 <body>
 <h1>PHPの練習</h1>
 <p><?php echo htmlspecialchars($youbi); ?></p>
 </body>
 </html>

 index.htmlソース
 <!DOCTYPE html>
 <html lang="ja">
 <head>
 <meta charset="UTF-8" />
 <title>PHPの練習</title>
 </head>
 <body>
 <h1>phpの練習</h1>
 <form action ="get_info.php" method = "post">
 <input type="text" name="birthday" value ="">
 <input type="submit" value="送信">
 </form>
 </body> 
 </html>

2013年2月2日土曜日

ドットインストール PHPの基礎②


ループの抜け方


break,←ループを終了
continue.←ループをスキップ

for ($i = 0; $i < 10; $i++) {
                if ($i > 5) {
                break;
                }
                echo $i;
}

for ($i = 0; $i < 10; $i++) {
                if ($i % 2 == 0 ) {
                continue;
                }
                echo $i;
}


配列


似たようなデータをグループ化できる

$youbi = array(“Sun”, “Mon”, “Tue”);
echo $youbi[0];

$配列名[番号];で呼び出せる

追加の仕方
$配列名[] = “追加したい値”;
で配列の末尾 追加したい値が追加される

var_dump($配列名);←全ての配列を表示する関数

$変数名[番号] = “更新後の値”;
で更新できる

要素を削除したい場合
unset($配列名[削除したい要素番号]);


連想配列


要素のラベルを番号ではなく文字にすることもできる
$sales = array (“tanaka”=>150, “tagichi”=>200);

echo $sales[“tanaka”];

配列をループさせる
$youbi = array (“sun”, “mon”, “tue”);
$sales = array (“tanaka”=>150, “taguchi” => 500);

foreach ( $youbi as $y){
                echo $y;
}

foreach ($sales as $name => $amount){
                echo $name, $amount;
}


関数


function sayHi(){
echo “hi”;
}

sayHi();

function 関数名($引数名=初期値){
命令 $引数名
}

関数名(引数)
で引数を含んだ命令を実行できる

関数名()とすると
初期値で命令を実行してくれる

命令中にreturnとすると値を返してくれる


ローカル変数


ローカル変数とは関数内でのみ有効な変数

function sayHi($引数 = 初期値){
                $ローカル変数 =”php”;
                return “hi! $引数 from $ローカル変数”;
}

echo sayHi();
echo $ローカル変数;←これはエラーが返される

 

あらかじめ用意されている関数を使ってみよう



$x = 5.2
echo ceil($x).””;
echo floor($x);
echo round($x);
echo pi($x);
echo rand(1, 100);
echo mt_rand(1, 100);