- 投稿日:2019-03-02T22:04:45+09:00
【備忘録】laradockを使ったlaravel開発
概要
今更ながらそろそろdocker使えなきゃやばいなと感じ、Laravelの開発をめちゃめちゃ助けてくれるらしいLaraDockをようやく学習しました。
今回は、その時の備忘録です。
構築の仕方
今回は備忘録なので、ほんと簡単に手順を載せていきます。
- ディレクトリを作成する。
mkdir ディレクトリ名
- git cloneしてくる
git clone https://github.com/LaraDock/laradock.git
- envを設定する
cp env-example .envからの
DB_HOST=mysql REDIS_HOST=redis QUEUE_HOST=beanstalkd
- コンテナを起動する
docker-compose up -d nginx mysql redis beanstalkd
- コンテナにアクセスする
docker exec -it laradock_workspace_1 bash
- パッケージリストを更新する
apt-get update
- Laravelを構築する
composer create-project laravel/laravel MyProject
- /var/www/laradockのNginxの設定を変更する
vim nginx/sites/default.confroot /var/www/public;上から下のように変更
root /var/www/MyProject/public;
- 再起動
docker-compose restart最後に
もうめちゃめちゃですね。。。
いろんな技術が今はどんどん出ているから波に乗り遅れないように勉強しようと思いました。(基本的なことは変わらないけど)あと、markdownの番号のリストの使い方むずくない?
- 投稿日:2019-03-02T21:01:31+09:00
【情報整理④】PHPの頻出関数を整理して、画面遷移過多による眼病を予防 ~ 文字列・数値編 ~
- Netflixによって世界中から人気を博している「こんまり」さんに、多大な影響を受けて情報整理をしていく記事第四弾。
- 本来の「世界的潮流に乗っかって、几帳面技術者を堂々宣伝する」という見掛け倒し目的のこの記事が、「角膜損傷を防ぐための健康活動」という老化防止目的の記事へと大幅転換を図る、二十代前半執筆者。
- 忘却癖が只者ではない私は、「検索・記録・復習」をしても、見事に消滅する滑稽な頭脳のため、常に画面は自分と見事に比例した「不安定な落ち着きの無さ」を発揮。
- 今回は、PHPの頻出関数の「文字列・数値」を整理していくことにしよう。
PHP頻出関数
- PHP頻出関数
- 文字列,数値
- printf(), sprintf()
- preg_match(),preg_match_all()
- preg_replace()
- preg_quote()
- str_replace(), strtr()
- substr(), mb_substr()
- strtolower(), strtoupper()
- strlen(), mb_strlen()
- strpos(), mb_strpos()
- mb_convert_encoding()
- mb_convert_kana()
- trim(), ltrim(), rtrim()
- mt_rand()
- is_string()
- is_int()
- is_float()
- is_numeric()
- round()
- floor()
- ceil()
- まとめ
- 参考
文字列,数値
printf(), sprintf()
<?php // printf(フォーマット文字列,値,値); printf('今日は%d月%d日です。',date('m'),date('d')); // 実行結果 // 今日は3月2日です。<?php // sprintf(フォーマット文字列,値,値); $number = sprintf('%04d',30); echo $number; // 実行結果 // 0030preg_match(),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,MICHAELstrlen(), mb_strlen()
// strlen(対象文字列) $name = 'Michael'; echo strlen($message); // 実行結果 // 7// mb_strlen(対象文字列) $message = '私は男です'; echo mb_strlen($message); // 実行結果 // 5strpos(), 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() は前後から取り除き、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() は小数点以下切り上げでして整形。
// ceil(値) echo ceil(3.14) . "\n"; echo ceil(-3.14); // 実行結果 /* 4 -3 */まとめ
- 今回は、PHP関数メモの第一回目ということで、眼病予防という崇高な目的で始まったはずが、おびただしい量による検索のため、自己傷害を加速させながら記事を書く。
- 「この作業が完了したら、遷移激減を達成でき、やつれ目の卒業ができる」という考えを、同時に発生する整理のための検索によって、予防効果を帳消しにすることから逃避して、楽しい余生の妄想にはげむ。
- 異常な長持ち性のため、今後も多くの情報を整理していくため、眼病予防は別の代替案を模索することにしよう。
参考
- https://php-archive.net/php/essential-php-functions/
→今回もはこちらの記事を参考にしました。大変お世話になりました。
- 投稿日:2019-03-02T18:32:39+09:00
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
- https://github.com/php/php-src/commit/89a7b7cc9699fc16a2d1c8379c83d026bc8a9cc5
- [7.4~]
- zend_resolve_property_types() のメモリリークを修正
- これは内部クラスの型付きプロパティを post_startup 内でリンクするような処理かな
nikic: Remove unnecessary convert_to_string_safe macro
- https://github.com/php/php-src/commit/1b998bb9cb7385e060e1aa4ea8a8e7a9cd0c9eca
- 不要なマクロ convert_to_string_safe() を削除、convert_to_string() へ置き換え
nikic: Don't remove CONST CAST in CONCAT operand
- https://github.com/php/php-src/commit/105a04aaac1686cdd35cc777d806ebac6d57e2f3
- [7.4~]
- ext/opcache で、文字列連結演算子のオペランドが文字列キャストされる値である際にキャスト命令を潰す最適化があったが、潰してはいけないケース(文字列でない定数なケース)があったので修正
nikic: Free map_base_ptr during post_startup
- https://github.com/php/php-src/commit/ff315098f44cfe6483fd55eb434615c1f521eb10
- [7.4~]
- post_startup で map_base_ptr を free() するよう修正
petk: Remove PHP_DECLARED_TIMEZONE and HAVE_DECLARED_TIMEZONE
- https://github.com/php/php-src/commit/f64ae64f52caf602720cd87061673b378c0c4158
- [7.4~]
- 不要な m4 マクロ PHP_DECLARED_TIMEZONE を削除
petk: Fix file permissions
- https://github.com/php/php-src/commit/e763cc742505cbb4e85d161f5457bf711f85bd43
- [7.4~]
- リポジトリ内のファイルのパーミッションを修正
KalleZ: Removed pdo_odbc.db2_instance_name
- https://github.com/php/php-src/commit/fddc751024e850e068be1ab51e454a815a859ee2
- ext/pdo_odbc で、PHP 7.3 で非推奨化されていた pdo_odbc.db2_instance_name の ini 設定を削除
KalleZ: NEWS
royopa: Test for function posix_getpwnam() basic functionality
- https://github.com/php/php-src/commit/54ef8d13d8c91f2bdd3c9a65871918efad370571
- [7.4~]
- ext/posix で、posix_getpwnam() のテストを修正
- 先日追加した奴で、カバレッジ見たらカバーされてない部分があったから、ということらしい
nikic: Convert extract() prefix to string zpp arg
- https://github.com/php/php-src/commit/7f262edaf3e12f81dfa204d760139149b681dce1
- extra() の引数
$prefix
が文字列であることの処理を ZPP で行うよう修正dstogov: Enable Posix Shared Memory on Linux
- https://github.com/php/php-src/commit/7d5e2e532c2c3c1d5e249beced450bae7fa17fc3
- [7.4~]
- ext/opcache で、Linux でも POSIX 共有メモリを使うよう修正
dstogov: Keep original debug info
- https://github.com/php/php-src/commit/a1109b28f493a33b94d3bd1dddb0d0dfbb0f5d0d
- [7.4~]
- メモリアロケータの実装で、ラッパー的な関数でデバッグ情報を捨ててしまっていた箇所を引き回すよう修正
dstogov: Unused parameter
- https://github.com/php/php-src/commit/c896b3ea482d928aa9ca876fedfefda7bfb06565
- [7.4~]
- メモリアロケータの実装で、zend_mm_alloc_small() の不要な引数を削除
nikic: Check for NULL GC type in objects_store_del
- https://github.com/php/php-src/commit/4dc0662eca4d8bc79cb6f6fa0c62e1600efef78a
- [7.3~]
- zend_objects_store_del() での NULL GC タイプのチェックを修正
- ということなんだけどよく追えておらず、まず GC タイプってなんぞというところを見れてないな
kadler: Fix bug #77677: WCOREDUMP not available on all systems
- https://github.com/php/php-src/commit/006355c9fa0d1cd8aef86a97c162053e7d2d896e
- [7.2~]
- sapi/fpm、sapi/litespeed で、WCOREDUMP のマクロ定義がない AIX 等の環境でビルドに失敗する問題の修正
jay: curl_error: return an empty string if no error occurred
- https://github.com/php/php-src/commit/5025eb05bde83a0a51eb0668c45c240b366545bf
- [7.2~]
- ext/curl で、curl_error() がエラーなしの際に空文字列を確実に返すよう修正
- 元々 libcurl 側のエラーバッファをそのまま返していたが、これはエラー非発生時に空になる保証は特にないような奴だった
nikic: Use separate files for SplFileObject::setCsvControl() tests
- https://github.com/php/php-src/commit/51dacafc64336bc7fa02de1ec032d651b1d2b0e1
- [7.4~]
- ext/spl で、SplFileObject::setCsvControl() のテストケースでそれぞれ別の一時ファイルを使うよう修正
- テストの並列実行対策
- 投稿日:2019-03-02T17:19:09+09:00
docker-compose で PHP7.2 + Apache + MySQL + phpMyAdmin 環境を構築
Docker の学習メモです。
本記事でのコンテナ作成は全て Docker Hub の image を使用して行なっています。
Dockerfile からのイメージ作成はまた今度。ディレクトリ構造
. ├── docker-compose.yml └── html │ └── index.php └── php.inidocker-compose.yml
docker-compose.ymlversion: '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:/sessionsindex.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_1PHP の確認
ローカルの html/index.php の内容を変更すると反映される。
MySQL + phpMyAdmin の確認
サービスの停止
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
- 投稿日:2019-03-02T11:06:32+09:00
【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.phptime(); // 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.phpfunction 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.phpfunction 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.phpfunction 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から件数として取得する次はモバイルに直接お知らせをしてくれるような機能を実装したいと思います。
- 投稿日:2019-03-02T07:49:53+09:00
例外を使うときの条件についてまとめ
概要
例外と返り値でBoolean型を返すのとどう使い分けんの?が疑問だったので、まとめることにした。
前提
そもそも例外の方針にも種類があることを知っておくことが大切らしい。
検査例外。そもそも例外とは
外部的、または内部的な要因により、防ぎきれないエラーが発生する可能性がある
こういう箇所についてその状態になってしまった時の対処として生まれた概念である。
例外を用いるパターン
- 自分ではコントロールできない要素を持ってエラーが起こりうる場合
例えば
- DBの負荷が高くなりすぎてアクセスができない場合
- 通信ができない場合
- ブラウザ自体がうまく働いていない場合
などなど、プログラムの実装による原因だけでなく、外部的な要素も絡んでくる場合に
大体の場合は例外を用いることとなる。内容
例外は呼び出す側が契約を履行したが、呼び出される側が契約を履行できなかった場合に、投げるもの
#java_ja よりまた、もう一つ考慮すべき内容が技術的な例外とビジネスロジック的な例外である。
技術的な例外とは、ネットワーク障害、DBの接続不良などによるもの。ビジネスロジック的な例外とは、元々の考慮になかった状態、条件などが、
メソッドの処理に入ってきた場合などがそれに当たると言える。参考
参考にさせていただきました。ありがとうございました。
公式ドキュメント - php.net - 例外(exceptions)
SlideShare - 例外設計における大罪 - Takuto Wada さん
エラー設計についての参考 - @yodatake さん
PHPにおける例外クラスの設計考察
例外処理の指針 - @tassi-yuzukko さん
契約による設計から見た例外 - @Kokudori さん
例外 Advent Calendar 2014
PHPの例外 - @koriym さん