20210105のPHPに関する記事は9件です。

Laravelはじめました

Larave(ディレクトリ構成)

本日からLaravelを触り出したので自分の勉強記録として投稿していこうと思う。

簡単にディレクトリ構成から勉強。
(フレームワークを余り触ったことがないので混乱)

ディレクトリ構成

1 2
app アプリのメインとなるところ
bootstrap 初期処理やキャッシュ
config アプリの設定
database データベース(マイグレーション)
public 画像,JS,CSS
resources blade(HTML的な)
routes アプリのURL設定など
storage セッションやログ
tests テスト用
vendor Composerの依存内容

設定ファイル(隠しフォルダにあり)

  • codeフォルダの歯車マーク押して、show hidden filesをクリック
  • .envフォルダを開く
php
DB_CONNECTION=mysql
DB_HOST=localhost         // 編集
DB_PORT=3306
DB_DATABASE=laravel_todo  // 編集
DB_USERNAME=root
DB_PASSWORD=root          // 編集 環境によって異なる 現在はAWS


dbマイグレーションとは

  • SQLを直接使わなくても、データベースを管理できるLaravelの仕組み。

  • テーブル作成の流れ
    1.マイグレーションファイルを生成
    2.ファイルにテーブル定義を書く
    3.マイグレーションを実行し、DBに反映

※まず、1テーブル1ファイルと覚えよう

マイグレーションの生成

  • ファイルの場所とファイル名のルール database/migrations

2020_12_20_00000_todos_table.php
  生成時間     アクション名 テーブル名

- ファイル生成コマンド

tarminal
php artisan make:migration todos_table

カラム名:add_カラム名to_userstable

tarminal
php artisan migrate

全ファイルが実行される

マイグレーションの中身

  • upとdawnメソッドがある
    upが実行(作成)で、downが元に戻す(削除)

  • Schemaファザードを使っている
    例)Schema::create テーブルを作成

  • カラムの作成はBlueprintオブジェクトのtableメソッドを使う
    例)$table->string('name')名前カラムを作成!

実際にファイルを見てみる

```言語:php database/migrations/2020_12~

/**
ここでマイグレーションファイルを読み込む
*/
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTodosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
/
public function up()
{
/

Schemaファザードを使っている
if tableがなかったら作る
/
if(!Schema::hasTables('todos')){
Schema::create('todos', function (Blueprint $table) {
$table->id();
$table->string('todo');
$table->date('deadline');
$table->text('comment')->nullable();
/
 100文字制限の時は('comment',100) */
$table->timestamps();
});
}
}
}

マイグレーションを実行する

 ```言語:tarminal
php artisan migrate

結果

tarminal
Migration table created successfully.
Migrating: 2014_10_12_000000_todos_table
Migrated:  2014_10_12_000000_todos_table (31.23ms)

error
言語:tarminal
$ composer dump-autoload

からの再起動

とりあえずここまで。
次回に進む。

 

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

PHP 数値の3桁の区切りカンマを打つ

目的

  • PHPで数値の3桁の区切りカンマを打つ方法まとめる

情報

方法

  1. number_format関数を使用する。
  2. 例えば「1000」を「1,000」のようにカンマを打ってほしい場合、下記のようにする。実行すると「1,000」が出力される。

    echo number_format(1000);
    
  3. 変数$numに格納された数値の3桁区切りのカンマを打ち、再び変数$numに格納する場合は下記のようにする。

    $num = 1000;
    
    $num = number_format($num);
    
    echo $num;
    

参考文献

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

Laravelプロジェクトの構築メモ①

*使用するもの*
・Mac OS
・MAMP
・Visual Studio Code
・Laravel6
・phpMyAdmin

Laravelアプリケーションを立ち上げる手順

ターミナル操作

①MAMPのhtdocsに移動(ここでプロジェクトを作成するため)
Applications/MAMP/htdocs

②composerコマンドを使ってLaravelプロジェクトを作成する(今回は6系のものを使用する)(アプリ名はmyappとする)
composer create-project laravel/laravel myapp --prefer-dist "6.0.*"

③htdocsからmyappに移動する
cd myapp

④いくつか権限を変える
chmod -R 777 storage
chmod -R 777 bootstrap/cache

MAMPの設定

①MAMPを立ち上げる

②preferencesの中のServerへ移動し、Document rootを変更する
 Document rootを先ほど作成したアプリの中のpublicフォルダを指定する
Applications/MAMP/htdocs/myapp/public

③MAMPのサーバーを起動する

④ブラウザでlocalhost:8888にアクセスすると、Laravelプロジェクトが表示される

Laravelフォルダの.envファイルの初期設定

①Visual Studio Codeで先ほど作成したmyapp(Laravelプロジェクト)というファイルを開く

②その中の.envファイルを編集する
・アプリ名を変更

APP_NAME=Laravel

・データベース設定
MAMPのトップページの下にMySQLの情報が記載されているから、
その通りにデーターベース設定を行う

DB_CONNECTION=mysql
DB_HOST=localhost ←変更
DB_PORT=8889 ←変更
DB_DATABASE=laravel ←あとで編集する
DB_USERNAME=root
DB_PASSWORD=root ←追加
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock ←追加

文字コードのエラーを防ぐ設定

MySQLのバージョンによって文字コードでエラーが発生する場合がある。

①Laravelフォルダにて、app/Providers/AppServiceProvider.phpへ移動

②use文を追加する

use Illuminate\Support\Facades\Schema;

を追加し、

public function boot()
    {
        Schema::defaultStringLength(191);
    }

細かい設定を行う

Laravelフォルダ内のconfig/app.phpを開く

'timezone' => 'Asia/Tokyo'
'locale' => 'ja'

以上がLaravelアプリケーション作成前準備です。

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

WordPressで管理画面のサイドメニューからカテゴリー、タグを削除する

ワードプレスのテーマtwentynineteenを基盤に、管理画面のサイドバーメニューからカテゴリーやタグを削除する実装を行ったので、備忘録的にこの記事を残す。

環境情報

PHP:version 5.3.3
WordPress:version 5.1.8
WPテーマ:twentynineteen

既存の投稿 と 既存のカテゴリー、タグ

functions.php
//サイドバーメニューからカテゴリー、タグを削除(既存の投稿と既存のカテゴリー、タグ)
function remove_menu() {
    remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=category');
    remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=post_tag');
}
add_action('admin_menu', 'remove_menu');

カスタム投稿 と 既存のカテゴリー、タグ

functions.php
//サイドバーメニューからカテゴリー、タグを削除(カスタム投稿と既存のカテゴリー、タグ)
function remove_menu() {
    remove_submenu_page('edit.php?post_type=カスタム投稿のスラッグ', 'edit-tags.php?taxonomy=category&post_type=カスタム投稿のスラッグ');
    remove_submenu_page('edit.php?post_type=カスタム投稿のスラッグ', 'edit-tags.php?taxonomy=post_tag&post_type=カスタム投稿のスラッグ');
}
add_action('admin_menu', 'remove_menu');

カスタム投稿 と カスタムタクソノミー

functions.php
//サイドバーメニューからカテゴリー、タグを削除(カスタム投稿とカスタムタクソノミー)
function remove_menu() {
    remove_submenu_page('edit.php?post_type=カスタム投稿のスラッグ', 'edit-tags.php?taxonomy=カスタムタクソノミーのスラッグ&post_type=カスタム投稿のスラッグ');
}
add_action('admin_menu', 'remove_menu');
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP: 通貨の表示

Ubuntu でライブラリーのインストール

sudo apt install intl
currency_yen.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//  currency_yen.php
//
//                  Jan/05/2021
// ------------------------------------------------------------------
//
fputs (STDERR,"*** 開始 ***\n");
#
$data = [500,4500,34500,234500,1234500];
$fmt = numfmt_create('ja_JP', NumberFormatter::CURRENCY);
#
foreach ($data as $value)
    {
    print numfmt_format_currency($fmt, $value, 'JPY') . "\n";
    } 
#
fputs (STDERR,"*** 終了 ***\n");
// ------------------------------------------------------------------
?>

実行結果

$ ./currency_yen.php 
*** 開始 ***
¥500
¥4,500
¥34,500
¥234,500
¥1,234,500
*** 終了 ***

次のバージョンで確認しました。

$ php --version
PHP 7.4.9 (cli) (built: Oct 26 2020 15:17:14) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】Laravelのデバッグ・変数の確認方法(var_export, dump, dd関数)

PHPのデバッグ方法がいくつかあるらしいので調べてみた。

PHPの場合

  1. var_export関数
  2. error_log関数

Laravelの場合

  1. dump関数
  2. dd関数


PHPの場合のデバッグ方法

1. var_export関数を使う

var_export関数で変数の中身を確認することができる。

よく使われるvar_dumpよりも有効性が高く、出力は有効なPHPコードになる。

var_export ( $expression [, bool $return = false ] )

php > $obj = array("a" => 1, "b" => 2, "c" => 3);
php > var_export($obj);
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

出力結果がarray('a' => 1, 'b' => 2, 'c' => 3)となっており、連想配列の定義そのものになっている。

var_dump, var_export, print_rの違いまとめ


2. error_log関数

エラーをログファイルに出力し、コンソールに表示する方法。

error_log($変数名);

ただし、使用にはコード冒頭でエラーログのオプションをONにし、ログの出力先ファイルを指定が必要。

冒頭への記述
ini_set("log_errors", "on")
ini_set("error_log", "ファイルパス&ファイル名")



また、変数が配列の場合は、以下のようにする必要がある。
error_log(print_r($変数名), true);


Laravelのデバッグ方法

Laravelの場合、dump関数やdd関数を使うと画面上に背景黒・文字色白で選択したデータを表示することができる。

dump関数とdd関数の違い

dump関数は通常の画面 + dump関数を記述した位置にその内容が表示される。つまり、そのページのコードをすべて読み込む。

一方で、dd関数はdd関数の内容のみの表示となる。


1. dump関数

.blade.php
@php
  dump($tdth);
@endphp

▼ブラウザの表示例

image.png

変数の内容以外のリソースも表示される。


2. dd関数

dd関数とは「dump and die」の略。

意味は、変数の内容を表示(dump)するが、それ以降は実行されない(die)。

.blade.php
@php
  dd($tdth);
@endphp

▼ブラウザの表示例

image.png

指定した変数の内容のみを表示する。

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

【PHP】mb_send_mailでうまく改行されないときに気をつけること

【PHP】mb_send_mailでうまく改行されないときに気をつけること

使用環境

  • XAMPP 8.0 (PHP 8.0)
  • windows 10

背景

websiteを制作していてお問い合わせページから送られてきたメールで改行コードがそのまま出力される、改行できていないという事態が発生。

原因

改行コード\r\n をシングルクォーテーションで囲んでいたため、文字として出力されていた。

文字列を指定する最も簡単な方法は、引用符 (文字 ') で括ることです。
引用符をリテラルとして指定するには、バックスラッシュ () でエスケープする必要があります。 バックスラッシュをリテラルとして指定するには、二重 (\) にします。 それ以外の場面で登場するバックスラッシュは、すべてバックスラッシュそのものとして扱われます。 つまり、\r や \n といったおなじみのエスケープシーケンスを書いても特別な効果は得られず、 書いたままの形式で出力されます。
PHP公式マニュアル

  $message = 'お問い合わせを受け付けました。\r\n'
    . '名前:' . $_SESSION['name'] . '\r\n'
    . 'tel:' . $_SESSION['tel'] . '\r\n'
    . 'お問い合わせ内容:' . '\r\n'
    . $_SESSION['message'];

  mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);

解決方法1:改行コードをダブルクオーテーションで囲む

ダブルクオーテーションで囲むことで二重引用符として扱われ、改行できる。

二重引用符
文字列が二重引用符 (") で括られた場合、 PHP は、以下のエスケープシーケンスを特殊な文字として解釈します。
PHP公式マニュアル

  $message = 'お問い合わせを受け付けました。'."\r\n"
    . '名前:' . $_SESSION['name'] . "\r\n"
    . 'tel:' . $_SESSION['tel'] . "\r\n"
    . 'お問い合わせ内容:' . "\r\n"
    . $_SESSION['message'];

  mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);

解決方法2:実行環境のOSに対応する改行コードを出力する定数PHP_EOLを使用する

PHP_EOLは実行環境のOSに対応する改行コードを出力する定数になります。
例えば、Windows環境の改行コードは 「\r\n(CRLF)」 Linux/Unix系、MacOS等の改行コードは「\n(LF)」になります。
そのため、この定数を文字列と結合することでコンソールに改行された状態で出力することができます。
ただ注意しておきたいのが、ブラウザで見た際にはPHP_EOLでは改行されません。
理由としては、php/HTMLファイルを表示する際はHTMLと認識されるため、改行コードではく「
」で改行されます。
PHPでphp_eolを使う方法【初心者向け】

  $message = 'お問い合わせを受け付けました。' . PHP_EOL
    . '名前:' . $_SESSION['name'] . PHP_EOL
    . 'tel:' . $_SESSION['tel'] . PHP_EOL
    . 'お問い合わせ内容:' . PHP_EOL
    . $_SESSION['message'];

  mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ポートフォリオのアプリを公開したらイタズラされまくった話

はじめに

私は過去にLaravel等の技術を使用して「朝活SNS」アプリを個人開発し、
AWSのEC2上で、一般公開していました。(転職活動時)

アプリの紹介記事をQiitaにも投稿したところ、
AWS, Docker, CircleCI, Laravelでポートフォリオを作成してみた【参考リンク付き】
有難いことに300LGTMもいただくことができ、多くの方に
実際にポートフォリオアプリを触ってもらえたものの、結構いろんなイタズラもされしまっておりました。^^;

実装の詰めが甘かったところもあり、その脆弱性を突かれたイタズラ等もあったので、
アプリはデプロイして終わりなのではなく、運用フェーズに入ってからも気を抜いてはいけないのだと実感しましたね。。

こちらの記事では、そんなイタズラの数々や、それに対策できた部分について簡単にご紹介できればと思います。

1.下ネタ投稿をされまくる

これは予想はしていました・・笑
投稿機能のあるアプリなら、ありがちなイタズラかもしれませんね。
ちなみに次のような下ネタ投稿をされていました↓

スクリーンショット 2020-11-24 23.54.42.png

スクリーンショット 2020-11-25 23.33.27.png

スクリーンショット 2020-11-25 23.35.18.png

ザ・下ネタの帝王!ばりの単語が連呼されていますが、1日平均3回くらいは書き込まれていたので、毎日ちょいちょいパトロールを実施。。
書き込みを見つけては、トイレ掃除をするような心境でDBから投稿を削除していました。(´・_・`)笑

LaravelでNGワード機能を実装してみようと試みたものの、不具合があったため現在この辺は検討中です。

2.クロスサイトスクリプティングを狙われる(XSS)

Webアプリ等の脆弱性を狙って、悪意のあるスクリプトを実行させたりする攻撃としても有名なXSS。
今回はそれに近いような投稿も見られました。

スクリーンショット 2020-11-26 17.14.23.png

思いっきりJavaScriptらしきメッセージが投稿されていますね。^^;
コードの内容としては、「Test」という文字列をダイアログボックスに表示するだけのものですが、
投稿したメッセージの「<」や「>」を無害化する処理を実装済みであるため
特に何も実行はされませんでした。

3.ゲストログイン機能のゲストユーザー情報を書き換えられる

今回作ったアプリには、「かんたんログイン」ボタンを押すと、予め用意されている
「ゲストユーザー」としてログインできるような機能があります。
(ユーザー名、メールアドレス等を入力しなくても簡単にログインできる)

イメージはこちらです↓

guestlogin_image.gif

この機能の使用上、ゲストユーザーのユーザー名メールアドレスを変更されると、ゲストログイン機能が動かなくなってしまいます。

そこで、ユーザープロフィール編集機能では、ゲストユーザーでログインしている時だけ
ユーザー名メールアドレスを変更できないように工夫しました。

スクリーンショット 2021-01-03 15.45.11.png

仕組みとしては、ゲストユーザーでログインしている時だけ、Viewの
< input >タグにreadonly属性が付与されたものが表示され、テキストボックスが灰色になって入力できなくなるようにしていました。

しかし、この対策だけでは結構マズくて、いとも簡単にゲストユーザーのユーザー名やメールアドレスを書き換えられてしまいました。
ある日ゲストログインしたら、ユーザー名が突然「にゃ〜ん」というものに変えられていて、めちゃめちゃ焦りました!!!^^;  笑

おそらくChrome等のデベロッパーツールを使ってHTMLを改ざんされてしまったのだと考えられます。
スクリーンショット 2021-01-03 15.56.19.png

デベロッパーツールで< input >タグのreadonly="readonly"を削除すると、ただのテキストボックスになり
ユーザー名やメールアドレスが普通に変更できるようになってしまいます↓
スクリーンショット 2021-01-03 15.59.09.png

デベロッパーツールって万能ですね・・
この時フロントエンド側だけでの対策がいかにマズイのかを学びました^^;
バックエンド側でも、ゲストユーザーのメールアドレス等を変更できないように対策することにしたところ
今回の問題は無事に解決しました。
その時の対策方法は、こちらの記事にまとめています。
 Laravel6系でゲストログイン機能(かんたんログイン)の実装

最後に

今回はざっと、公開したポートフォリオアプリへのイタズラをまとめてみましたが、
この経験を通して学びも多かったです。
セキュリティ面の実装の甘さに気付けたり、NGワード機能を追加してみようかな?と新たなアイディアが浮かんだり等々。。
今後はセキュリティ面を強化した実装等をより心がけていきたく思います!

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

PHP Debug + Xdebug Ver3.X系 はphp.iniに追記する設定項目が違うよって話

はじめに

Mac PHP Visual Studio Code Xdebugを用いたローカル開発環境でデバッグをできるようにする
↑の記事を参考にXdebug + PHP Debug環境を構築していたら、

  • phpInfoではXdebugの存在を確認できる
  • var_dump()もそれっぽい挙動をしてくれる
  • でもブレークポイントで止まってくれない

といった状況で少々「むむむ・・・」となった。

解決方法

Xdebugは正常挙動っぽいのでおそらくVSCode側の何かしらが原因だろうと思い、
ひとまずVSCodeのPHP DebugのDetailsを確認

スクリーンショット 2021-01-05 6.19.00.png

めちゃくちゃ丁寧に案内されてた

というわけで

touch ~user/Desktop/php_info.txt
php -i >> ~user/Desktop/php_info.txt 

でphpInfoの内容を書き出して、

php_info.txt
Configuration File (php.ini) Path => /Applications/MAMP/bin/php/php7.4.9/conf
Loaded Configuration File => /Applications/MAMP/bin/php/php7.4.9/conf/php.ini

php.iniのパスを確認して、

Ver2.X系

php.ini
[xdebug]
zend_extension="/Applications/MAMP/bin/php/php7.4.9/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"
xdebug.remote_enable = 1
xdebug.remote_autostart = 1

と記載していたのを、

Ver3.X系

php.ini
[xdebug]
zend_extension="/Applications/MAMP/bin/php/php7.4.9/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_port = 9000

に修正したらブレークポイントでしっかり止まってくれるようになった。

終わりに

そもそも作業前にまず一次情報のInstllationを確認しようねって脳内の自分に怒られました。

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