20190302のPHPに関する記事は6件です。

【備忘録】laradockを使ったlaravel開発

概要

今更ながらそろそろdocker使えなきゃやばいなと感じ、Laravelの開発をめちゃめちゃ助けてくれるらしいLaraDockをようやく学習しました。

今回は、その時の備忘録です。

参考にさせていただいたページ

構築の仕方

今回は備忘録なので、ほんと簡単に手順を載せていきます。

  1. ディレクトリを作成する。
mkdir ディレクトリ名
  1. git cloneしてくる
git clone https://github.com/LaraDock/laradock.git
  1. envを設定する
cp env-example .env

からの

DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
  1. コンテナを起動する
docker-compose up -d nginx mysql redis beanstalkd
  1. コンテナにアクセスする
docker exec -it laradock_workspace_1 bash
  1. パッケージリストを更新する
apt-get update
  1. Laravelを構築する
composer create-project laravel/laravel MyProject
  1. /var/www/laradockのNginxの設定を変更する
vim nginx/sites/default.conf
root /var/www/public;

上から下のように変更

root /var/www/MyProject/public;
  1. 再起動
docker-compose restart

最後に

もうめちゃめちゃですね。。。
いろんな技術が今はどんどん出ているから波に乗り遅れないように勉強しようと思いました。(基本的なことは変わらないけど)

あと、markdownの番号のリストの使い方むずくない?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【情報整理④】PHPの頻出関数を整理して、画面遷移過多による眼病を予防 ~ 文字列・数値編 ~

  • Netflixによって世界中から人気を博している「こんまり」さんに、多大な影響を受けて情報整理をしていく記事第四弾。
  • 本来の「世界的潮流に乗っかって、几帳面技術者を堂々宣伝する」という見掛け倒し目的のこの記事が、「角膜損傷を防ぐための健康活動」という老化防止目的の記事へと大幅転換を図る、二十代前半執筆者。
  • 忘却癖が只者ではない私は、「検索・記録・復習」をしても、見事に消滅する滑稽な頭脳のため、常に画面は自分と見事に比例した「不安定な落ち着きの無さ」を発揮。
  • 今回は、PHPの頻出関数の「文字列・数値」を整理していくことにしよう。

PHP頻出関数

文字列,数値

printf(), sprintf()

<?php
// printf(フォーマット文字列,値,値);

printf('今日は%d月%d日です。',date('m'),date('d'));

// 実行結果
// 今日は3月2日です。
<?php
// sprintf(フォーマット文字列,値,値);

$number = sprintf('%04d',30);
echo $number;

// 実行結果
// 0030

preg_match(),preg_match_all()

  • 正規表現による一致・検索。

  • パターンに一致すれば「1」、一致しなければ「2」を返す。

  • preg_match_all() は一致したすべての値を変数に格納。

  • 公式マニュアル

  • 公式マニュアル

<?php
// 返り値 = preg_match(/正規表現パターン/,検索対象の文字列,[配列],[動作フラグ],[検索開始位置])

  if (preg_match('/経済/', '世界経済情勢')) {
    echo 'ある';
  } else {
    echo 'ない';
  }

// 実行結果
// ある
<?php
// 「PREG_OFFSET_CAPTURE」を指定して、一致文字列の登場位置(オフセット)をバイト数で取得
// ※半角は1バイト、全角は2バイト

  if (preg_match('/経済/', '世界経済情勢',$data,PREG_OFFSET_CAPTURE)) {
    echo "ある\n";
  } else {
    echo "ない";
  }
  print_r($data)

// 実行結果

/*
ある
Array
(
    [0] => Array
        (
            [0] => 経済
            [1] => 6
        )

)
*/

<?php
// 「PREG_OFFSET_CAPTURE」を指定して、一致文字列の登場位置(オフセット)をバイト数で取得

  if (preg_match_all('/経済/', '世界経済情勢における、日本の経済状況を、日本経済大学教授の経済学者が解説。',$data,PREG_OFFSET_CAPTURE)) {
    echo 'ある';
  } else {
    echo 'ない';
  }
  print_r($data)

// 実行結果

/*
ある
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => 経済
                    [1] => 6
                )

            [1] => Array
                (
                    [0] => 経済
                    [1] => 42
                )

            [2] => Array
                (
                    [0] => 経済
                    [1] => 66
                )

            [3] => Array
                (
                    [0] => 経済
                    [1] => 87
                )

        )

)
*/

preg_replace()

  • 正規表現によるパターンに一致した、検索または置換を行う。

  • 公式マニュアル

// preg_replace(正規表現パターン ,置換後文字列 ,置換対象文字列)

$names = '佐藤 田中 鈴木 佐藤';
$names_grep = preg_replace('/(佐藤)/', '上野', $names);
echo $names_grep;

// 実行結果

// 上野 田中 鈴木 上野

preg_quote()

  • 正規表現特殊文字の前にバックスラッシュをつけてエスケープする。

  • オプション区切り文字は省略可能。「/」が一般的に使用されている。

  • 公式マニュアル

// preg_quote(文字列,オプション区切り文字)

$keywords = '$URL : /で始まる。';
$keywords = preg_quote($keywords, '/');
echo $keywords;

// 実行結果

// \$URL \: \/で始まる。

str_replace(), strtr()

// str_replace(検索文字列 ,置換後文字列 ,検索対象文字列,置換した回数)

$names = ['佐藤', '高橋', '鈴木', '高橋', '中村'];
$replace = str_replace('高橋', '小松', $names, $count);
print_r($replace);
echo '置換した回数: '.$count;

// 実行結果

/*
Array
(
    [0] => 佐藤
    [1] => 小松
    [2] => 鈴木
    [3] => 小松
    [4] => 中村
)
置換回数: 2
*/
// strtr(置換対象文字列, 文字列(配列))

$array = array("佐藤"=>"鈴木","田中"=>"田丸","高橋"=>"高峰");
print strtr("佐藤 田中 大川 大橋 高橋", $array);

// 実行結果

// 鈴木 田丸 大川 大橋 高峰

substr(), mb_substr()

// substr (文字列, 開始位置 ) 

echo substr('America', 1);
echo mb_substr('あいうえおかきくけこ', 3);

// 実行結果

// merica
// かきくけこ

strtolower(), strtoupper()

// strtolower(対象文字列)

$name = "JOHN,Bob,michaEl";
$result = strtolower($name);
echo $result;

// 実行結果

// john,bob,michael
// strtoupper(対象文字列)

$name = "JOhN,Bob,michaEl";
$result = strtoupper($name);
echo $result;

// 実行結果

// JOHN,BOB,MICHAEL

strlen(), mb_strlen()

// strlen(対象文字列)

$name = 'Michael';
echo strlen($message);

// 実行結果

// 7
// mb_strlen(対象文字列)

$message = '私は男です';
echo mb_strlen($message);

// 実行結果

// 5

strpos(), mb_strpos()

// strpos(検索対象文字列,指定文字列)

$name = 'michael';
$findword   = 'a';
$result = strpos($name, $findword);

if ($result === false) {
    echo "'$findword' は、'$name' の中で見つかりませんでした";
} else {
    echo "'$findword' が、'$name' の中で見つかりました\n";
    echo "位置 : $result";
}

// 実行結果

/*
'a' が、'michael' の中で見つかりました
位置 : 4
*/

mb_convert_encoding()

// mb_convert_encoding(対象文字列,変換文字コード,対象文字コード)

/* 内部文字エンコーディングからSJISへの変換 */
$name = mb_convert_encoding($name, "SJIS");

/* SJISからUTF-8に変換 */
$name = mb_convert_encoding($name, "UTF-8", "SJIS");

/* "auto" 指定で、"ASCII,JIS,UTF-8,EUC-JP,SJIS" に展開 */
$name = mb_convert_encoding($name, "EUC-JP", "auto");

mb_convert_kana()

  • ひらがな・カタカナ、全角・半角を相互に変換する。

  • 下記、オプション。

オプション 意味
r 「全角」英字を「半角」に変換
R 「半角」英字を「全角」に変換
n 「全角」数字を「半角」に変換
N 「半角」数字を「全角」に変換
a 「全角」英数字を「半角」に変換
A 「半角」英数字を「全角」に変換
s 「全角」スペースを「半角」に変換
S 「半角」スペースを「全角」に変換
k 「全角カタカナ」を「半角カタカナ」に変換
K 「半角カタカナ」を「全角カタカナ」に変換
h 「全角ひらがな」を「半角カタカナ」に変換
H 「半角カタカナ」を「全角ひらがな」に変換
c 「全角カタカナ」を「全角ひらがな」に変換
C 「全角ひらがな」を「全角カタカナ」に変換
V 濁点付きの文字を一文字に変換
// mb_convert_kana(対象文字列,オプション)

/* 「半角カタカナ」を「全角カタカナ」に変換し、「全角」英数字を「半角」に変換。 */
$str = mb_convert_kana($str, "KVa");

trim(), ltrim(), rtrim()

// trim(対象文字列)
// rtrim(対象文字列)
// ltrim(対象文字列)

$name = ' satou ';
$job = ' engineer ';
$origin = ' japan ';

$new_name = trim($name);
$new_job = ltrim($job);
$new_origin = rtrim($origin);

var_dump($new_name);
var_dump($new_job);
var_dump($new_origin);

// 実行結果

/*
string(5) "satou"
string(9) "engineer "
string(6) " japan"
*/

mt_rand()

  • 指定された範囲でランダムな数値を返す。

  • rand()より高精度。

  • 公式マニュアル

// mt_rand(最小値,最大値)

// オプション指定なし。
echo mt_rand() . "\n";
// オプション指定あり。
echo mt_rand(10,20);

// 実行結果

/*
1458218741
13
*/

is_string()

// is_string(変数)

$name="佐藤";
if(is_string($name)){
    echo '文字列です。';
}else{
    echo '文字列ではありません。';
}

// 実行結果

// 文字列です。

is_int()

// is_int(対象変数)

$number=78.00;
if (is_int($number)) {
    echo '整数型です。';
}else {
    echo '整数型ではありません。';
}

// 実行結果

// 整数型ではありません。

is_float()

  • 与えられた値が float型(少数) であるかを返す。

  • is_double()も存在はするが、is_flostと同様。

  • 公式マニュアル

// is_float(対象変数)

$number=78.00;
if (is_float($number)) {
    echo '浮動小数型です。';
}else {
    echo '浮動小数型ではありません。';
}

// 実行結果

// 浮動小数型です。

is_numeric()

  • 与えられた値が数字として扱えるかを返す。文字列でも良い。

  • 公式マニュアル

// is_numeric(対象変数)

$str_number = '10';
$int_number = 10;

if(is_numeric($str_number)){
    echo 'これは数値として扱える。';
}else{
    echo '駄目です。';
}

// 実行結果

// これは数値として扱える。

round()

  • 小数部分を四捨五入して整形。

  • 桁数指定で、変更できる。

  • 第三引数での「オプションモード」を指定できる。

  • 下記、オプションモード

定数 意味
PHP_ROUND_HALF_UP 小数点を指定桁数に、0から離れる方向に整形
PHP_ROUND_HALF_DOWN 小数点を指定桁数に、0に近づく方向に整形
PHP_ROUND_HALF_EVEN 小数点を指定桁数に、次の偶数に整形
PHP_ROUND_HALF_ODD 小数点を指定桁数に、次の奇数に整形
// round(値,桁数,オプションモード)

// 通常指定
echo round(34.5) . "\n";
// 桁数指定
echo round(5.5555, 2) . "\n";
echo round(123456789, -3);
// モード指定
echo round(-1.55, 1, PHP_ROUND_HALF_UP) . "\n";
echo round(-1.55, 1, PHP_ROUND_HALF_DOWN) . "\n";
echo round(-1.55, 1, PHP_ROUND_HALF_EVEN) . "\n";
echo round(-1.55, 1, PHP_ROUND_HALF_ODD);

// 実行結果

/*
35
5.56
123457000
-1.6
-1.5
-1.6
-1.5
*/

floor()

  • 小数部分を、小数点以下切り捨てして整形。

  • ※値が小さい方へ小数点以下を切り捨てるため、マイナスの場合は注意

  • 公式マニュアル

// floor(値)

echo floor(3.14) . "\n";
echo floor(-3.14);

// 実行結果

/*
3
-4
*/

ceil()

// ceil(値)

echo ceil(3.14) . "\n";
echo ceil(-3.14);

// 実行結果

/*
4
-3
*/

まとめ

  • 今回は、PHP関数メモの第一回目ということで、眼病予防という崇高な目的で始まったはずが、おびただしい量による検索のため、自己傷害を加速させながら記事を書く。
  • 「この作業が完了したら、遷移激減を達成でき、やつれ目の卒業ができる」という考えを、同時に発生する整理のための検索によって、予防効果を帳消しにすることから逃避して、楽しい余生の妄想にはげむ。
  • 異常な長持ち性のため、今後も多くの情報を整理していくため、眼病予防は別の代替案を模索することにしよう。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php-master-changes 2019-03-01

今日はエンジンのメモリリークの修正、不要コードの削除、opcache 最適化バグの修正、リポジトリ内のファイルのパーミッション修正、pdo_odbc.db2_instance_name の ini 設定削除、ドキュメントの更新、テストカバレジの向上、extra() の $prefix の引数処理の ZPP への移行、Linux でも opcache で POSIX 共有メモリを使うようにする修正、メモリアロケータでデバッグ情報を捨ててしまっていた箇所の修正、zend_objects_store_del() の修正、一部 SAPI モジュールが WCOREDUMP のマクロ定義がない環境でビルドに失敗する問題の修正、curl_error() がエラーなしの際に空文字列を返さない場合があった問題の修正、一部テストを並列実行に対応する修正があった!

2019-03-01

nikic: Fix leak in resolve_property_types

nikic: Remove unnecessary convert_to_string_safe macro

nikic: Don't remove CONST CAST in CONCAT operand

nikic: Free map_base_ptr during post_startup

petk: Remove PHP_DECLARED_TIMEZONE and HAVE_DECLARED_TIMEZONE

petk: Fix file permissions

KalleZ: Removed pdo_odbc.db2_instance_name

KalleZ: NEWS

royopa: Test for function posix_getpwnam() basic functionality

nikic: Convert extract() prefix to string zpp arg

dstogov: Enable Posix Shared Memory on Linux

dstogov: Keep original debug info

dstogov: Unused parameter

nikic: Check for NULL GC type in objects_store_del

kadler: Fix bug #77677: WCOREDUMP not available on all systems

jay: curl_error: return an empty string if no error occurred

nikic: Use separate files for SplFileObject::setCsvControl() tests

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-compose で PHP7.2 + Apache + MySQL + phpMyAdmin 環境を構築

Docker の学習メモです。

本記事でのコンテナ作成は全て Docker Hub の image を使用して行なっています。
Dockerfile からのイメージ作成はまた今度。

ディレクトリ構造

  .
  ├── docker-compose.yml
  └── html
  │    └── index.php
  └── php.ini

docker-compose.yml

docker-compose.yml
version: '3'

services:
  php:
    image: php:7.2-apache
    volumes:
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=test
      - PMA_PASSWORD=test
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions

index.php

html/index.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>php7.2-apache</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<?php phpinfo(); ?>
</body>
</html>

php.ini

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

現在のコンテナ稼働状況を確認

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

稼働中のコンテナが存在していないため、何も表示されない。

コンテナの作成と開始

$ docker-compose up -d
Creating network "php72-apache_default" with the default driver
Creating php72-apache_mysql_1 ... done
Creating php72-apache_php_1        ... done
Creating php72-apache_phpmyadmin_1 ... done

コンテナの稼働状況を確認する。

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED              STATUS              PORTS                            NAMES
120e4b86b987        phpmyadmin/phpmyadmin   "/run.sh supervisord…"   About a minute ago   Up About a minute   9000/tcp, 0.0.0.0:4040->80/tcp   php72-apache_phpmyadmin_1
bf42cd71d3d4        php:7.2-apache          "docker-php-entrypoi…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp             php72-apache_php_1
699f32a6424e        mysql:5.7               "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp              php72-apache_mysql_1

PHP の確認

http://localhost:8080/

ローカルの html/index.php の内容を変更すると反映される。

MySQL + phpMyAdmin の確認

http://localhost:4040/

サービスの停止

docker-compose.yml に記載されているサービスのコンテナが全て停止される。

$ docker-compose stop
Stopping php72-apache_phpmyadmin_1 ... done
Stopping php72-apache_php_1        ... done
Stopping php72-apache_mysql_1      ... done

コンテナの稼働状況を確認する。
停止しているコンテナを表示する為に -a オプションを使用します。

$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS               NAMES
120e4b86b987        phpmyadmin/phpmyadmin   "/run.sh supervisord…"   3 minutes ago       Exited (0) 11 seconds ago                       php72-apache_phpmyadmin_1
bf42cd71d3d4        php:7.2-apache          "docker-php-entrypoi…"   3 minutes ago       Exited (0) 11 seconds ago                       php72-apache_php_1
699f32a6424e        mysql:5.7               "docker-entrypoint.s…"   3 minutes ago       Exited (0) 11 seconds ago                       php72-apache_mysql_1

サービスの開始

docker-compose.yml に記載されているサービスのコンテナが稼働する。
あらかじめ、コンテナが作成されている必要がある。

$ docker-compose start
Starting php        ... done
Starting mysql      ... done
Starting phpmyadmin ... done
$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                            NAMES
120e4b86b987        phpmyadmin/phpmyadmin   "/run.sh supervisord…"   8 minutes ago       Up 10 seconds       9000/tcp, 0.0.0.0:4040->80/tcp   php72-apache_phpmyadmin_1
bf42cd71d3d4        php:7.2-apache          "docker-php-entrypoi…"   8 minutes ago       Up 11 seconds       0.0.0.0:8080->80/tcp             php72-apache_php_1
699f32a6424e        mysql:5.7               "docker-entrypoint.s…"   8 minutes ago       Up 12 seconds       3306/tcp, 33060/tcp              php72-apache_mysql_1

コンテナの削除

docker-compose.yml に記載されているサービスのコンテナを停止、コンテナとネットワークが削除される。

$ docker-compose down
Stopping php72-apache_phpmyadmin_1 ... done
Stopping php72-apache_php_1        ... done
Stopping php72-apache_mysql_1      ... done
Removing php72-apache_phpmyadmin_1 ... done
Removing php72-apache_php_1        ... done
Removing php72-apache_mysql_1      ... done
Removing network php72-apache_default
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】Webサービス上で行うお知らせ機能の実装

Webサービス上で行うお知らせ機能の実装

今回はwebサービス内でお知らせ機能を実装する方法をアウトプットして書き残します。

考え方

1,logintimeテーブルに接続し前回のログイン時間があるかどうか確認する。
2,ログイン時間がなければログイン時間を保存
3,ログイン時間があれば取得
4,そのログイン時間を変数に格納する
5,ログイン時間の更新
6,4で取得したログイン時間以降の投稿をDBから件数として取得する

ログイン時間はtime()関数を使う

時間を表示させる関数は他にdate()関数があるのですが、今回はtime()関数を使いました。
理由は、考え方3番の【3,1のログイン時間を参照して、その時間以降の投稿を取得する】この時にif文を使用するのですが、time()関数はint型で取得してくれて投稿時間と比較がしやすいためです。

因みに投稿時間にもtime()関数を使用しております。

time()関数とは

PHPリファレンス time()
1970年1月1日を「0秒」とし、現時刻までを秒すうに換算したものです。
使い方はシンプル。

index.php
time(); // 1551371976

これだけです。

実装方法

まずログイン時間を保存するlogintimeテーブルを作りました。
ブラウザでの流れはこんな感じです。

ブラウザでの流れ

index.php
$user_id = $_SESSION['user_id'];
//お知らせ機能処理====================================================================
$time = time();
//logintimeテーブルのuser_idの登録件数を取り出す
$timeCount = timeCount($user_id);

if($timeCount['count(*)'] == 0){ //もし$timeCountが「0」なら・・つまり何も登録されてなければ

  //ログイン時間を挿入
  timeInsert($user_id,$time);

}else{ //登録されていれば

  //user_idのloginTimeを取り出す
  $loginTime = timeSelect($user_id);
  $beforeTime = $loginTime['loginTime'];

  //ログイン時間をアップデートする
  timeUpdate($user_id,$time);

}

time()関数を変数$timeに格納します。

その後[timeCount()]という関数を作り$_SESSION['user_id']を元にユーザーがlogintimeテーブルに登録されているかどうかを判断します。

timeCount()

function.php
//user_idの登録件数を取り出す
function timeCount($user_id){
  debug('ユーザー情報を取得します。');
  //例外処理
  try {
    //DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'SELECT count(*) FROM logintime WHERE user_id = :user_id';
    $data = array(':user_id' => $user_id);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果のデータを1レコード返却
    if($stmt){
      return $stmt->fetch(PDO::FETCH_ASSOC);
    } else {
      return false;
    }
  } catch (Exception $e) {
    error_log('エラー発生:' . $e->getMessage());
  }
}

ここでreturnで返ってきたtimeCount()の値を条件にif文を使います。この値が0ならまだlogintimeテーブルにはそのユーザー情報が入っていないので、変数$timeを使用しINSERTします。

ログイン時間INSERT

function.php
function timeInsert($user_id,$time){
  debug('ユーザー情報を取得します。');
  //例外処理
  try {
    //DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'INSERT INTO logintime (user_id,loginTime) VALUES(:user_id,:loginTime)';
    $data = array(':user_id' => $user_id,
                  ':loginTime' => $time);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果のデータを1レコード返却
  } catch (Exception $e) {
    error_log('エラー発生:' . $e->getMessage());
  }
}

もしreturnの値が0じゃなければ、logintimeテーブルに保存されているので、保存されているログイン時間を取得します。

ログイン時間取得

function.php
function timeSelect($user_id){
  debug('ユーザー情報を取得します。');
  //例外処理
  try {
    //DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'SELECT loginTime FROM logintime WHERE user_id = :user_id';
    $data = array(':user_id' => $user_id);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果のデータを1レコード返却
    if($stmt){
      return $stmt->fetch(PDO::FETCH_ASSOC);
    } else {
      return false;
    }
  } catch (Exception $e) {
    error_log('エラー発生:' . $e->getMessage());
  }
}

取得したログイン時間以降の投稿をあとで取得するので変数に格納します。
その後ログイン時間をアップデートします。

ログイン時間アップデート

function.php
function timeUpdate($user_id,$time){
  debug('ユーザー情報を取得します。');
  //例外処理
  try {
    //DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'UPDATE logintime SET loginTime = :loginTime WHERE user_id = :user_id';
    $data = array(':user_id' => $user_id,
                  ':loginTime' => $time);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果のデータを1レコード返却
    if($stmt){
      return $stmt->fetch(PDO::FETCH_ASSOC);
    } else {
      return false;
    }
  } catch (Exception $e) {
    error_log('エラー発生:' . $e->getMessage());
  }
}

これで前回のログイン時間の取得とログイン時間の更新が終わりました。
次は、取得した前回のログイン時間を使ってpostsテーブルからこの時間以降の投稿を取得し件数としてブラウザに表示するだけです。
なのでcount(*)でSQL文を書いてください。

以上がPHPによるお知らせ機能実装方法です。

再度流れをまとめます。
1,logintimeテーブルに接続し前回のログイン時間があるかどうか確認する。
2,ログイン時間がなければログイン時間を保存
3,ログイン時間があれば取得
4,そのログイン時間を変数に格納する
5,ログイン時間の更新
6,4で取得したログイン時間以降の投稿をDBから件数として取得する

次はモバイルに直接お知らせをしてくれるような機能を実装したいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

例外を使うときの条件についてまとめ

概要

例外と返り値でBoolean型を返すのとどう使い分けんの?が疑問だったので、まとめることにした。

前提

そもそも例外の方針にも種類があることを知っておくことが大切らしい。
検査例外。

そもそも例外とは

外部的、または内部的な要因により、防ぎきれないエラーが発生する可能性がある

こういう箇所についてその状態になってしまった時の対処として生まれた概念である。

例外を用いるパターン

  • 自分ではコントロールできない要素を持ってエラーが起こりうる場合

例えば

  1. DBの負荷が高くなりすぎてアクセスができない場合
  2. 通信ができない場合
  3. ブラウザ自体がうまく働いていない場合

などなど、プログラムの実装による原因だけでなく、外部的な要素も絡んでくる場合に
大体の場合は例外を用いることとなる。

内容

例外は呼び出す側が契約を履行したが、呼び出される側が契約を履行できなかった場合に、投げるもの
#java_ja より

また、もう一つ考慮すべき内容が技術的な例外とビジネスロジック的な例外である。
技術的な例外とは、ネットワーク障害、DBの接続不良などによるもの。

ビジネスロジック的な例外とは、元々の考慮になかった状態、条件などが、
メソッドの処理に入ってきた場合などがそれに当たると言える。

参考

参考にさせていただきました。ありがとうございました。

公式ドキュメント - php.net - 例外(exceptions)
SlideShare - 例外設計における大罪 - Takuto Wada さん
エラー設計についての参考 - @yodatake さん
PHPにおける例外クラスの設計考察
例外処理の指針 - @tassi-yuzukko さん
契約による設計から見た例外 - @Kokudori さん
例外 Advent Calendar 2014
PHPの例外 - @koriym さん

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む