toshieeeee
10/7/2016 - 8:55 AM

lib_db_function.php

<?php

//定数定義 → 変数定義 → 関数実行 → 関数定義 



/***********************************

▼DB Access INFO - 定数

************************************/

date_default_timezone_set('Asia/Tokyo');

define('DSN','mysql:dbname=vending_machine;host=localhost');
define('DB_USER','root');
define('DB_PASSWD','root');
define('HTML_CHARACTER_SET','UTF-8');  // HTML文字エンコーディング
define('DB_CHARACTER_SET','SET NAMES utf8'); 

$error = array();

/*************************************************************

▼関数を実行

**************************************************************/

$link = get_db_connect(); // DBに接続する関数 [返り値] : PDOオブジェクト

$data = get_goods_table_list($link); // SQLを実行して、結果セットを取得。連想配列として格納


if ($_SERVER['REQUEST_METHOD'] === 'POST'){

  $name = str_validation('pro_name'); // Name属性を引数に渡す
  $price = num_validation('pro_price');

  insert_table($link,$name,$price);
 
}


close_db_connect($link); // DBを切断




/*************************************************************

▼関数を定義

**************************************************************/


/***********************************
▼PDOインスタンス作成 + DBハンドル取得 
@return obj $link DBハンドル取得
************************************/

function get_db_connect(){

  try{
      
    $dbh = new PDO(DSN,DB_USER,DB_PASSWD);

      if(!$dbh->query('SET NAMES utf8')){

        throw new DBException;        

      };

      //PDO::query() は、PDOStatement オブジェクトを返します。
      //失敗した場合は FALSE を返します。

      return $dbh;

    }catch(DBException $e){

      echo 'Fatal Error : '.$e->getMessage().'<br>';
      echo $e->getFile().'<br>';
      echo $e->getLine().'<br>';
      
      exit();

  }
}

/***********************************
▼DBを切断
************************************/

function close_db_connect($link) {

    $link = null; // 接続を閉じる

}

/***********************************
* 商品の一覧を取得する
*
* @param obj $link DBハンドル
* @param obj $sql 実行するクエリ
* @return array $data 商品一覧、連想配列データ
************************************/

function get_as_array($link,$sql){
  
  $data = array(); // 返却用配列

  $stmt = $link->prepare($sql); //プリペアードステートメント

  try {

    if($stmt->execute()){ // 実行(判定) + 結果セットを格納 

      while($rec = $stmt->fetch(PDO::FETCH_ASSOC)){

      $data[] = $rec;

      }

    } else {

      throw new QueryException(); // クエリの記述が間違っていて、実行されなければ、スルーされる

    }

  } catch (QueryException $e){

      echo 'Fatal Error : '.$e->getMessage().'<br>';
      echo $e->getFile().'<br>';
      echo $e->getLine().'<br>';

  }

  return $data;

}


/***********************************
* SQLを定義して、get_as_arrayを実行する
*
* @param obj $link DBハンドル
* @return 商品一覧、連想配列データ
************************************/

function get_goods_table_list($link) {
  
  $sql = 'SELECT pro_id,pro_name,pro_price,pro_status FROM pro_info_table'; // SQL生成

  return get_as_array($link, $sql); //SQL実行 

}


/***********************************

▼文字列をバリデーション

* @param str name属性
* @return 成功 : 入力データ 失敗 : $errorに、入力した文字列を格納したデータ

************************************/

function str_validation($str){

  global $error;

  $temp = $str; // 属性名を受け取る
  $str = $_POST[$str]; //属性の値を受け取る
  $attr = $temp;

  if(isset($str) !== TRUE || mb_strlen($str) === 0){

    $error[$attr] = $attr.'を入力してください';

  } else if(mb_strlen($str) > 20){

    $error[$attr] = $attr.'は20文字以内で入力してください';

  } else if(preg_match ('/^\s*$|^ *$/',$str)){

    $error[$attr] = $attr.'は半角、または全角スペースだけでは登録できません';

  } else {

    return $str;

  }

}

/***********************************

▼整数をバリデーションする関数

* @param str name属性
* @return 成功 : 入力データ 失敗 : $errorに、入力した文字列を格納したデータ

************************************/

function num_validation($num){

  global $error;

  $temp = $num; // 属性名を受け取る
  $num = $_POST[$num]; //属性の値を受け取る
  $attr = $temp;

  if(isset($num) !== TRUE || mb_strlen($num) === 0){

    $error[$attr] = '価格を入力してください';

  } else if(mb_strlen($num) > 5){

    $error[$attr] = '価格は5桁以内で入力してください';

  } else if(preg_match('/^\s*$|^ *$/',$num)){ 

    $error[$attr] = '価格は半角、または全角スペースだけでは登録できません';

  } else if (!preg_match('/^[0-9]+$/',$num)){

    $error[$attr] = '価格は正数値のみ入力可能です';

  } else {

    return $num;

  }

}


/***********************************

▼INSERTを実行する

* @param1 - DBハンドラ
* @param2 ~  - プレースホルダーに入れる値

→ * @param2 を、SQLに変更する?

* @return 
***********************************/

function insert_table($link,$param1,$param2){

  try{

    $sql_info = 'INSERT INTO pro_info_table(pro_name,pro_price) VALUES (?,?)';
    $stmt = $link->prepare($sql_info); 

    $data[] = $param1;
    $data[] = $param2;

    if(!$stmt->execute($data)){ // SQLの判定 / 実行

      throw new QueryException();

    }

  } catch (QueryException $e){

    echo 'Fatal Error : '.$e->getMessage().'<br>';
    echo $e->getFile().'<br>';
    echo $e->getLine().'<br>';

  }
  
}


/***********************************
* サニタイズ
*
* @param str エスケープする文字列
* @return エスケープした文字列
************************************/


function sanitize($str) {

    return htmlspecialchars($str, ENT_QUOTES, HTML_CHARACTER_SET);

}


/*************************************************************

▼例外サブクラスの定義

**************************************************************/

//オブジェクトにしておいたほうが、後の更に強い。
//複雑なエラーを追加したいような場合にも対応できるから。

class DBException extends Exception{

  public function __construct(){ //メンバ変数の初期化

    $this->message = 'DBの接続に失敗しました';

  }

}

class QueryException extends Exception{

  public function __construct(){ //メンバ変数の初期化

    $this->message = 'クエリの実行に失敗しました';


  }

}

?>