20200310のPHPに関する記事は16件です。

PHPのPDOで外部のデータベースサーバーを利用したいときの注意点と選択肢

PHPのPDOで外部のデータベースを利用するときに躓いたところをまとめました。

データベースサーバーの話

レンタルサーバー付属のDBサーバーは無理
レンタルサーバー付属のDBサーバーを最初使おうとしたのですが、基本的にどのレンタルサーバーもリモートSQLには対応していません。
リモートSQLとは、そのDBサーバーが運用されているIPとは異なるIPやグローバルネットワーク経由でのSQL操作のことです。

セキュリティ的な理由で、多くのレンタルサーバー付属のDBサーバーはできません。

DBサーバーの選択肢

月額固定費での運用を考えると、日本語環境だと以下の2つのDBサーバーがありました。

DBサーバー|VPSならConoHa
https://www.conoha.jp/database/

データベースサーバー|レンタルサーバーのカゴヤ・ジャパン
https://www.kagoya.jp/multi-plan/database/

どちらも、初期費用0円・月額500円です。

Conohaだと、VPSの契約も必須なようなことを書いてあるサイトもありましたが、データベースサーバーだけで利用可能です。

固定IPからの利用だと問題なし

リモートSQLをするクライアントが固定IPアドレスであれば、どちらのDBサーバーを利用しても問題ありません。

動的IPからの利用は大問題

カゴヤのDBサーバーは、リモートSQLのクライアントのIPアドレスを必ず指定する必要があります。
そのため、動的IPから利用する予定がある人は色々問題が発生します。

そのため、動的IPアドレスからの利用を予定している人はConohaのDBサーバーをおすすめします。

PHPを動かすサーバーの問題

PHPからSQLを操作するときに、外部のデータベースを操作できるレンタルサーバーとできないレンタルサーバーがあります。

私が利用しているMixhostとXserverは、どちらもダメでした。

最終的に、海外のレンタルサーバーであるBluehostを利用しました。

いろいろセキュリティと利便性の案配が大変なんですね。

以上
おわおわり。

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

DVWA(XXS:stored)全レベルの脆弱性について

前提

目標

  • 脆弱性の理解を深める。

手順概要

  • 大まかな挙動を把握する
  • コードを見て脆弱性をみつける
  • コードの脆弱性を攻撃する

内容

挙動の把握

  • ボタンを押すとPOSTリクエストが飛ぶ
  • 文字列がDBに保存され、下部に転写される

コードを確認

low

  • 入力値がそのまま格納される。
<?php
$name    = trim( $_POST[ 'txtName' ] ); 
?> 

medium

  • str_replace(a,b,c)は、cの中にaが入っていればbに置換する
  • 今回の場合、<script>が入っていれば、"空"へ置換される
<?php
$name = trim( $_POST[ 'txtName' ] );  
$name = str_replace( '<script>', '', $name ); 
?> 

high

  • mediumロジックは同じ
  • ここでは正規表現を使ってさらに厳格にチェックしている。
<?php
$name = trim( $_POST[ 'txtName' ] );  
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name ); 
?>

impossible

  • htmlspecialcharsはhtmlにとっての特殊文字をエスケープさせるので、タグの入力がエスケープされる。
<?php
$name = stripslashes( $name ); 
name = htmlspecialchars( $name ); 
?>

脆弱性を攻撃する

nameに入力するが、htmlで文字制限かかっているので、maxlengthを増やせば入力可能になる。

low

  • 防御無しのため、ストレートに攻撃する。
  • <script>alert("low")</script>
  • 見づらいがscriptが埋め込まれている(下図)

image.png

medium

  • 制限されているのは<script>という文字列だけなので一部変更すれば突破できる
  • <script >alert("medium")</script >
  • messageはエスケープされている。

image.png

high

  • mediumみたいに空白を開けても並びが"script"ならブロックされる。なので、script以外を使う。
  • <img src="#" onerror=alert("high")>
  • messageはエスケープされている。

image.png

impossible

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

PHPで多次元連想配列を高速に検索する

はじめに

データベースから取得した多次元連想配列に対して検索を行うとき、どのように処理するのが一番いいのか分からなかったので調べてみました。
ざっくり調べた限りだとarray_search + array_columnで実装するのが多かったんですが、計算量が O(n^2) になってしまうのでパフォーマンス的にどうなんだろうと思い、実際に測定してみました。

今回は以下の2パターンについて検証を行います。
1. array_search + array_column で検索する
2. 検索したいキーで連想配列を作り直してから検索する

バージョン

PHP 7.2

検証コード

1. array_search + array_column で検索する

上述の通り計算量がO(n^2)になってしまうのでパフォーマンス的に不安がありますが、比較的シンプルに記述することができます。

$size = 100;

// 検証用の配列を作成する
$array = [];
foreach(range(0, $size) as $i) {
    $part['hoge'] = 'key' . $i;
    foreach(range(1, 9) as $j) {
        $part[$j] = 'fuga';
    }
    $array[] = $part;
}

$time_start = microtime(true);

foreach (range(0, $size) as $i) {
    array_search('key' . $i, array_column($array, 'hoge'));
}

$time = microtime(true) - $time_start;
print($time * 1000 . 'ms');

2. 検索したいキーで連想配列を作り直してから検索する

こちらは計算量がO(n)になるのでパフォーマンスが良くなると考えられますが、配列を作り直す処理が必要なのと検索したいキーが重複している場合に使えないというデメリットがあります。

$size = 100;

// 検証用の配列を作成する
$array = [];
foreach(range(0, $size) as $i) {
    $part['hoge'] = 'key' . $i;
    foreach(range(1, 9) as $j) {
        $part[$j] = 'fuga';
    }
    $array[] = $part;
}

$time_start = microtime(true);

// 検索したいキーで配列を再生成する
$mapping = [];
foreach($array as $a) {
    $mapping[$a['hoge']] = $a;
}

foreach (range(0, $size) as $i) {
    $mapping['key' . $i];
}

$time = microtime(true) - $time_start;
print($time * 1000 . 'ms');

測定結果

上のコードの$sizeを変えながら実行速度を測定しました。

$size 100 1,000 10,000
1. array_search + array_column で検索する 0.14ms 16ms 1886ms
2. 検索したいキーで連想配列を作り直してから検索する 0.02ms 0.19ms 4.54ms

結論

  • 1,000レコード程度までならどちらを使ってもパフォーマンスに大きな差はない
  • 10,000レコード以上なら速度がかなり低下するので、検索したいキーで連想配列を作り直して検索した方が良さそう
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DVWA(XXS:Reflected)全レベルの脆弱性について

前提

目標

  • 脆弱性の理解を深める。

手順概要

  • 大まかな挙動を把握する
  • コードを見て脆弱性をみつける
  • コードの脆弱性を攻撃する

内容

挙動の把握

  • ボタンを押すとGETリクエストが飛ぶ
  • クエリにname=hogeが乗っかる
  • そのクエリがpreタグへ転写される(下図)

image.png

コードを確認

low

  • 特に設定なし。
  • scriptを差し込めば、そのまま転写される。
<?php
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; 
?> 

medium

  • str_replace(a,b,c)は、cの中にaが入っていればbに置換する
  • 今回の場合、<script>が入っていれば、"空"へ置換される
<?php
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>"; 
?> 

high

  • mediumロジックは同じ
  • ここでは正規表現を使ってさらに厳格にチェックしている。
<?php
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>"; 
?>

impossible

  • sessionを拿捕する必要がある
  • htmlspecialcharsはhtmlにとっての特殊文字をエスケープさせるので、タグの入力が不可能。
<?php
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken(); 
?>

脆弱性を攻撃する

low

  • 防御無しのため、ストレートに攻撃する。
  • <script>alert("low")</script>

image.png

medium

  • 制限されているのは<script>という文字列だけなので一部変更すれば突破できる
  • <script >alert("medium")</script >

image.png

high

  • mediumみたいに空白を開けても並びが"script"ならブロックされる。なので、script以外を使う。
  • <img src="#" onerror=alert("high")>

image.png

impossible

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

Win10 + PHP + Laravel 開発環境構築メモ

概要

  • Windows10にPHP開発環境を構築したときのメモです
  • 後で見返す用に書きだしたレベルなので、内容は適宜修正します。

PHP(XAMMP)

  • Apache, MariaDB, PHP, Perl などがパッケージ化されたもの
  • https://www.apachefriends.org/jp/index.html
    • 特定バージョンを入れる場合は「その他のバージョン~」から
  • インストールした後はPATHを追加する
    • 例) C:\xampp\php

composer


xdebug

  • PHPでデバッグするための拡張モジュール
  • https://xdebug.org/download
    • 色々試行錯誤したけどうまくいかなかったので、最終的に以下の手順で導入した。
  1. コマンドプロンプトで $ php -i をたたく
  2. https://xdebug.org/wizard に[1]の内容を貼り付けて「Analyse my phpinfo() output」を押下
  3. 画面下部に表示される手順に従って操作していく
  4. [1]に戻り、再度 Analyze して Xdebug installed のところにバージョンが出てきたらOK
  5. $ php -v の出力でも確認できる
$ php -v
PHP 7.4.3 (cli) (built: Feb 18 2020 17:29:46) ( ZTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans ★ここが出力されたらOK
php.ini(参考)
zend_extension = C:\xampp\php\ext\php_xdebug-2.9.2-7.4-vc15-x86_64.dll

[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
  • vscodeで php -i したとき色々エラーが出る場合は、
    エラー箇所の extension= の後ろをフルパスにしていくとよい?

npm (node.js)


VisualStudioCode

setting.json(追記する)
"php.validate.executablePath": "C:\\xampp\\php\\php.exe",
"php.suggest.basic": false,
  • Extensions として以下を追加した。
    • PHP Debug
    • PHP IntelliSense
    • PHP Class Generator
    • PHP DocBlocker
    • PHP import checker
    • phpcs
    • PHP Intelephense
    • PHP Namespace Resolver
    • Bracket Pair Colorizer
    • VS Code Counter

サンプルプロジェクトで動作確認

  1. $ composer create-project "laravel/laravel=6.*" sample
  2. $ cd sample
  3. $ php artisan -V
  4. $ composer install
  5. $ npm install
  6. $ php artisan serve
  7. 任意の場所 (routes/web.php あたり?) にブレークポイントを置いて、デバッグ起動
launch.json(参考)
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "stopOnEntry": true,
            "log": true
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000,
        }
    ]
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「3分で理解するWEBプログラミングセキュリティ 02」クロスサイトスクリプティングとは?

3分で理解するWEBプログラミングセキュリティ 02

3分で理解するWEBプログラミングセキュリティ
↓↓記事が出来次第Link貼って行きます↓↓
No.01 SQLインジェクションとは?
No.02 クロスサイトスクリプティングとは?
No.03 クロスサイトリクエストフォージェリとは?
No.04 ディレクトリトラバーサルとは?

1.クロスサイトスクリプティングとは?
・概要
2.クロスサイトスクリプティング対策(PHPでの実装例)
・対策方法
・実装例

1.クロスサイトスクリプティングとは

概要
攻撃者は、まずターゲットとなる企業を見つけ、その企業に興味を持ちそうなユーザーが訪れる掲示板サイト上で罠(スクリプト付リンクを貼るなど)を仕掛けます。ターゲットの企業に興味を持ったユーザーが、掲示板サイト上で仕掛けられた罠にかかると、攻撃者が掲示板サイト内でスクリプトを実行します。
ユーザーはスクリプト情報を持ったままターゲット企業のページに移動することになるのですが、実は、ジャンプ先はターゲット企業を装った偽サイトで、だまされたユーザーがうっかり個人情報やクレジットカード情報などを入力してしまうと、PCがマルウェアに感染したり、攻撃者に情報が漏れてしまうわけです。
通称XSSと呼ばれます。

2.クロスサイトスクリプティング対策(PHPでの実装例)

対策方法
簡単な話スクリプトとして認識させなければ良いのです。
例えば、
・< → &lt;
・> → &gt;
・& → &amp;
・" → &quot;
これでスクリプトはスクリプトではなく、ただの文字列として扱われます。
これを「エスケープ」と言います。

実装例
掲示板に以下のスクリプトが投稿されたとします

<script>alert('XSS');</script>

掲示板の投稿するソースが

echo <script>alert('XSS');</script>

となっていた場合、スクリプトとして実行され、アラートが出てしまいます。

ではエスケープしてみます。
エスケープするには「htmlspecialchars」を使用します。

echo htmlspecialchars(<script>alert('XSS');</script>, ENT_QUOTES, "UTF-8");

これでただの文字列として扱われ、アラートは出ません。

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

PHPでポートフォリオ作成

記事の概要

私が作成したポートフォリオ解説をします
作った背景、工夫したところ、機能、などをまとめました
Udemy PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門
を参照に作成しています

背景

簡単な掲示板のようなものを作ろうと思いましたが、掲示板なので盛り上がったり、人がもう一度来たくなる要素のある掲示板を作ろうと思いました。

目的

・PHPを用いてwebアプリケーションを作成する
・webアプリの基本的な構成、動作を知る
・就活目的なので、自分の技術のレベルを知ってもらう

スペック

言語
PHP 7.4.2
データーベース
MariaDB 10.4.11
開発環境
Apache 2.4.41

ビジュアルスタジオコード使用

主な機能

会員登録した人がログインしたら掲示板メッセージを送信できます。

・会員登録
会員のお名前、メールアドレス、パスワード、画像を選択することで会員登録ができます。

・会員登録におけるエラー表示
名前に関しては空のときにエラー、メールアドレスに関しては空の時とすでに登録済みの時はエラー、パスワードに関しては空の時と4文字以下の時はエラー

・ログイン機能
メールアドレス、パスワードを入力します。
データベースにある情報と一致したらログインして、一致しなければログインできないという機能です
次回からログインの欄にチェックをすると、cookieに2週間の間情報が保存されます。

・メッセージ送信機能
メッセージを入力するとデーターベースにメッセージが保存されて、それを作成日の新しい順に表示しています。

・削除機能
そのメッセージを投稿した人だけが削除したメッセージを削除できるようにしました

・返信機能
返信したいメッセージに対して返信が可能です

・いいね機能
いいねは一人の会員に対して1回可能で、もう一度いいねしようとすると、いいねを削除します

開発手順

1、要件定義
2、環境選定
3、データベース設計
4、設計
5、コーディング

1、要件定義

今回作成するアプリに必要な機能は
・会員登録
・ログイン機能
・メッセージ表示機能

そのために情報が保存できるデーターベースが必要です

また、メッセージに関しては
・メッセージ送信者がメッセージを削除できる
・すべての会員がどんなメッセージに対しても返信できる
・すべての会員がどんなメッセージに対しても1回だけ「いいね」ができ、その「いいね」が削除できる

環境選定

PHPを使用。

「PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門」に従って、環境選定したのでPHP,MySQL,apacheに関してその教材の流れに従い使用

上記環境はWindowsローカル上に構築しました。

データーベース設計

どんな情報が必要かを考えてデータベースの設計しました。

データベース設計のやり方は「PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門」に従い設計をすすめました

正規化に関しても、一応理解しているつもりです。

「いいね」機能をつけるときに、追加でテーブルが必要になり付け加えました。

※画像追加

設計

設計に関してはノートに書きました。

会員登録→ログイン→掲示板→ログアウト→ログイン

の順に移動するように設計しました

5.コーディング

設計が固まったところで、コーディングをスタート。

※しかし設計とおりにコーディングいかず、設計を変更しながらコーディングしました。いいねの機能は、コーディング中に追加したので、最初の設計通りには行きませんでした。

htmlはその都度記入

5.1データーベース作成

ローカル環境のMysqlサーバーに
専用ユーザーを作成して、データーベースを作成。そのあと、テーブルを作成。

5.2データーベース接続確認

PDOを用いて、データーベースの接続。
try~catchを用いて、成功しているか判断

5.3・会員登録機能

入力した値をmemberテーブルに保存。

GIF 2020-03-10 16-04-37.gif

また、入力欄が空、すでに登録済みメールアドレスを入力したなどの場合、error[]という配列に値を代入します。そして、error[]があるばあいは同じページに、error[]が空ばあいは確認画面に飛びます。また、error[]の要素とその値によってメッセージを赤字でページ内に表現します。

GIF 2020-03-10 16-20-53.gif

5.4ログイン機能

入力したemailとpasswordがmemberテーブルに保存されている値と一致した場合には、ログインします。エラーが発生した場合は赤字でメッセージをだします。
自動的にログインするをチェックした場合はcookieに値を2週間保存します。

5.5メッセージの送信、削除、返信機能

メッセージを送信してデータベースに保存。そして、メッセージを新しい順に写真、名前、日付をつけて表示しました。

GIF 2020-03-10 19-40-46.gif

また、削除の機能を追加して、返信機能も追加しました。
返信機能では「RE」を押すことで、そのメッセージとそのメッセージを送信主の名前をメッセージの入力欄に記載

GIF 2020-03-10 19-43-14.gif

5.6いいね機能

いいね追加、削除機能
データーベースに、coutsテーブルを作成。もしそのメッセージにいいねをしていない場合にいいねをクリックしたら、countデータベースにユーザーのidとメッセージのid、時間を保存する。逆に、そのメッセージにいいねをしている状態でいいねをクリックしたら、countデータベースから登録あったしてカラム(ユーザーのidとメッセージのid、時間を保存したもの)を削除する。

いいね表示機能
そして、countsテーブルから、メッセージのidの数だけいいねの数を表示する

GIF 2020-03-10 19-54-12.gif

5.7

htmlspecialcharsでセキュリティ対策をしました

課題点

・全体のレイアウトのいびつさ
htmlをその都度に入力していたので、いびつなレイアウトになりました。設計をしっかりしてその通りに形を整えることができなかったのが原因と思われます

・ユーザーに配慮した設計
ユーザーの使いやすいような、見た目や機能にできてない。スマートフォンに対応したりしていない。

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

nginxとphp-fpmを使ってLaravelのhome画面を表示する

前書き

初めての投稿ですので、わかりにくい箇所があるかもしれません。改善案などございましたら、教えてください。

nginxとphpのインストール

自分はMacを使っているので、今回はHomebrewを利用してインストールしていきます。

Homebrew

brew install php@(バージョンは各自指定してください)
brew install nginx

php-fpmはbrewでphpをインストールすると同時にインストールされます。

インストールできたか確認

php -v
nginx -v

nginxとはなにか

nginxとはフリーでオープンなウェブサーバーで、主に静的なコンテンツを高速に配信するように設計されている

php-fpmとは

php-fpmとは、phpのFastCGI 実装のひとつで、主に高負荷のサイトで用意されている機能です。
そもそも、CGIとはwebサーバーで、PHPなどのプログラムを動かすための仕組みです。

なぜnginxを使う時にphp-fpmが必要か?

上記にも書いた通り、nginxは静的ファイル(html/css/js)処理できません。なのでphp-fpmを利用します。

nginxを起動する

nginx (起動)
nginx -s stop (停止)
nginx -s reload (再読み込み)

https://localhost:8080
にアクセスしてみて

こんな画面がでたら成功です。
Welcome-to-nginx-Mozilla-Firefox_001.png

nginxの設定

nginxの編集は基本的にnginx.confに記述していきます。
nginx.confはどこにあるのか、/usr/local/etc/nginxにあリます。
nginx.confを開いて

location / {
            root   html;
            index  index.html index.htm;
        }



 #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

主にlocationというところを編集していきます。
自分の場合はDesktopに新たにindexディレクトリを作成し、その中にindex.phpを作成し、それを表示させました。

nginx -t

このコマンドで、編集したnginx.confのシンタックスチェックしてみてください。
nginx.confの中身を編集した場合は、必ずnginxを再起動してください。

location / {
            root   /Users/username/Desktop/index/;
            index  index.php index.html index.htm;
        }

location ~ \.php$ {
           root          /Users/username/Desktop/index/;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME /Users/username/Desktop/index/index.php$fastcgi_script_name;
           include        fastcgi_params;
        }

こんな感じで編集しました。
困ったことはnginxとDesktopの管理者権限が異なり、中々表示できませんでした。

$chown 

このコマンドでnginxのerror.logとaccess.logの実行者を変更しました。

php-fpmの編集

$brew info php@(自分のバージョン)

これで、brewでインストールした、phpの情報が分かります。
php-fpmの編集ファイルはwww.confなので、その中身を

user = nginx
group = nginx

このように編集しました。

$brew services start php

このコマンドも忘れずに実行してください。

ちなみにDesktopのindexディレクトリのindex.phpの中身は

<?php phpinfo(); ?>

としておきました。

こんな画面が表示されたら成功です。
download.png

Laravelを表示するには

nginx.confのrootを編集するだけです。
Laravelの処理の起点となるのは、publicディレクトリです。
Laravelで扱うWebページのルート部分はpublic/ディレクトリになります。このことを理解していれば簡単です。

root          /Users/username/Desktop/projectname/public/;

あとは
https://localhost:8080

download-2.png

この画面が出れば完了です。

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

PHPフレームワーク「Nette」で最初のアプリ(簡易ブログ)を作成する(1)

簡単なブログを作成する

前回はNette Frameworkの概要について紹介しました。
今回も公式ページに記載されているサンプルを参考に、コメントが投稿できる簡単なブログを作成しながら、Nette Frameworkの開発手順を紹介します。

今回の内容を最後まで進めると、簡単なブログの一覧表示と、個別の投稿を表示するページが作成できます。
記事の投稿やコメントの投稿の処理については次回に解説します。
なお、この内容を動作させるには、Nette Framework 3.0とPHP 7.1以降が必要です。

Nette Frameworkは手動でダウンロードすることもできますが、ここではComposerの使用を推奨します。
Composerを使ったことがない人は、まずはComposerの導入からはじめてください。
Qiita上にもいくつも記事がありますし、「Composerの教科書」を読んでいただいても構いません。
Nette Frameworkも含め、フレームワークを使ってWebアプリケーションを開発する場合は、Composerを使って始めると簡単な環境を構築できます。

初期設定

Composerがインストールできていれば、次のコマンドを実行すると、「nette-blog」というディレクトリが作成され、その中に必要なファイルがダウンロードされます。

$ composer create-project nette/web-project nette-blog

この時点で、Webプロジェクトの初期ページが生成されているはずです。
Webサーバー上で上記の「nette-blog/www」にアクセスするか、手元でPHPのビルトインWebサーバーを実行して、アクセスしてみましょう。

「nette-blog/www」ディレクトリに移動し、ビルトインWebサーバーを起動します。

$ cd nette-blog/www
$ php -S localhost:8000

この場合、Webブラウザから次のURLにアクセスします。
http://localhost:8000/

これで、Nette Frameworkのウェルカムページが表示されます。
Netteのウェルカムページ

Nette Frameworkの構成

Nette FrameworkでWeb Projectを作成すると、次のような構成で作成されます。

www/                      ← ルートディレクトリ
└── nette-blog/
    ├── app/              ← アプリケーションディレクトリ
    │   ├── config/       ← 設定ファイル
    │   ├── presenters/   ← プレゼンター
    │   │   └── templates/← テンプレート
    │   ├── router/       ← ルーター(URLの設定)
    │   └── Bootstrap.php ← 起動ファイル
    ├── log/              ← ログ
    ├── temp/             ← キャッシュやセッションなどの一時ファイル
    │
    ├── vendor/           ← アプリケーションのライブラリ
    │   └── nette/        ← フレームワーク 
    │
    └── www/              ← Webルート

wwwディレクトリに、画像やJavaScript、CSSなどの公開ファイルを保存します。
重要なディレクトリは「app/」で、ここにアプリケーションの実行に必要なファイルを格納していきます。

Webプロジェクトのウェルカムページは、以下のファイルに格納されています。

app/Presenters/templates/Homepage/default.latte

デバッガー「Tracy」

Nette Frameworkには「Tracy」と呼ばれるデバッガーが用意されており、エラーが発生した場合、その詳細を表示できます。
例えば、次のファイルに対してエラーを作り込んでみます。

app/Presenters/HomepagePresenter.php
<?php

declare(strict_types=1);

namespace App\Presenters;

use Nette;


final class HomepagePresenter extends Nette\Application\UI\Presenter
{
}

このファイルの最後の括弧を削除してみます。
すると、次のようにエラーの詳細が表示された赤い画面のページが表示されます。

Nette Framework Tracy.png

Tracyを使うと、エラーの原因を調べるのに非常に役立ちます。
上記の右下に表示されている「TRACY」というフローティングバーにマウスを合わせると、詳しい情報を表示することもできます。

もちろん、公開モードではTracyが無効になっているため、ソースコードやパスワードなどの機密情報は公開されません。
エラーは「log/」ディレクトリに保存されます。

公開モードに設定するには、Bootstrapファイルでコメントアウトされている部分を以下のように変更します。

app/Bootstrap.php
$configurator->setDebugMode(false); 

これにより、エラー画面はユーザー向けの内容になります。
Nette Framework エラー画面

「log/」ディレクトリにはエラーログ(exception.log)が作成されています。
なお、Tracyはlocalhost環境ではデバッグモードを自動的に有効にし、その他の環境では無効にします。

MVPに沿って作成する

今回はブログなので、最近の投稿から順に表示するページを作成してみます。
Nette Frameworkでは、MVC(Model-View-Controller)に似たMVP(Model-View-Presenter)に沿って開発します。

ブログのような単純なアプリケーションでは、Modelはデータベースへのクエリのみで構成されます。
このため、追加のPHPコードは必要なく、PresenterとViewを作成するだけです。
Netteでは、PresenterごとにViewが存在するため、両方を同時に開発します。

データベースへの保存

データを保存するデータベースとして、ここではMySQLを使います(好きなDBMSを使えます)。
まずはブログの投稿を保存するデータベースを作成します。

「posts」というテーブルを、以下のデータ項目で作成します。

カラム名 サイズ その他
id int 11 AUTO INCREMENT
title varchar 255
content text
created_at timestamp CURRENT_TIMESTAMP

SQLで書くと、次のような内容になります。

CREATE TABLE `posts` (
    `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `title` varchar(255) NOT NULL,
    `content` text NOT NULL,
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB CHARSET=utf8;

テスト用に、いくつかデータを入れておきます。

INSERT INTO `posts` (`id`, `title`, `content`, `created_at`) VALUES
(1, 'Article One',  'Lorem ipusm dolor one',    CURRENT_TIMESTAMP),
(2, 'Article Two',  'Lorem ipsum dolor two',    CURRENT_TIMESTAMP),
(3, 'Article Three',    'Lorem ipsum dolor three',  CURRENT_TIMESTAMP);

データベースとの接続

作成したデータベースを使うには、Webアプリケーションから接続する必要があります。
接続する設定は、以下のファイルに保存されています。

app/config/local.neon
database:
    dsn: 'mysql:host=127.0.0.1;dbname=quickstart'
    user: root
    password: *enter password here*

上記のdsn、user、passwordの部分を書き換えてください。

なお、このファイルは.neonという拡張子ですが、YAMLと同じような形式のため、インデントやスペースの位置に注意が必要です。
(インデントとしてタブがデフォルトになっており、「:」の後にはスペースが必要です。)

このように、さまざまな設定は「app/config/」にある「.neon」という拡張子のファイルで行います。
「common.neon」というファイルは、アプリケーションのグローバル設定、「local.neon」には使用環境(開発環境と本番環境など)におけるパラメータを格納します。

プレゼンターを変更して一覧画面を作る

データベースから取得するには、プレゼンターからデータベース接続が必要です。
例えば、上記で紹介したHomepagePresenterに次のようなコンストラクタを作成します。

さらに、データベースから投稿を取得し、テンプレートに渡すメソッド「render」を追加します。

app/Presenters/HomepagePresenter.php
<?php

declare(strict_types=1);

namespace App\Presenters;

use Nette;


final class HomepagePresenter extends Nette\Application\UI\Presenter
{
    /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function renderDefault(): void
    {
        $this->template->posts = $this->database->table('posts')
            ->order('created_at DESC')
            ->limit(5);
    }
}

この記述により、「default」というビューにデータが渡されます。
つまり、「app/Presenters/templates/{PresenterName}/{viewName}.latte」にプレゼンターのテンプレートが保存されていますが、上記の場合は「app/Presenters/templates/Homepage/default.latte」というテンプレートが使用されます。

また、テンプレート側では$postsという変数が使用可能になり、この変数を使用して投稿内容を表示できます。

テンプレートで一覧ページのデザインを作成する

Nette Frameworkのテンプレートには、ページ全体を指定するテンプレートと、ページの一部を指定するテンプレートがあります。
全体のテンプレートでは、レイアウトやヘッダー、スタイルシート、フッターなどを指定します。
一部のテンプレートでは、ブログのリストを表示する、などの使い方ができます。

全体のテンプレートのデフォルトは、次のように作成されています。

app/Presenters/templates/@layout.latte
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">

    <title>{ifset title}{include title|stripHtml} | {/ifset}Nette Web</title>
</head>

<body>
    <div n:foreach="$flashes as $flash" n:class="flash, $flash->type">{$flash->message}</div>

    {include content}

    {block scripts}
    <script src="https://nette.github.io/resources/js/3/netteForms.min.js"></script>
    {/block}
</body>
</html>

ここで、{include content}は、本文に該当する部分です。
今回のようにブログ記事を表示する場合、この部分に反映されます。

今回は次のようにテンプレートを編集します。

app/Presenters/templates/Homepage/default.latte
{block content}
    <h1 n:block="title">Sample blog</h1>

    {foreach $posts as $post}
    <div class="post">
        <div class="date">{$post->created_at|date:'F j, Y'}</div>

        <h2>{$post->title}</h2>

        <div>{$post->content}</div>
    </div>
    {/foreach}
{/block}

{foreach}という部分は、変数$postsに格納されている投稿を、順に反復処理し、各投 稿のHTMLを出力します。
|date:の部分は「フィルター」と呼ばれ、出力をフォーマットできます。今回は指定されたタイムスタンプを読みやすいように変換しています。
{link}と書くことで、他のページへのリンクを作成できます。ここでは、以下で作成するPost:showを呼び出すURLアドレスを生成しています。また、投稿のIDを引数として設定しています。

タイトルを表示する部分では、n:block="title"という記述をしています。
これは、次の記述と同じことを表します。

{block title}<h1>Sample blog</h1>{/block}

このように書くと、titleというブロックを再定義できます。
このブロックはレイアウトのテンプレート/app/Presenters/templates/@layout.latteで定義されていますが、この指定で上書きできます。
これにより、ページの<title>タグに、ブログ名がセットされます。

ブラウザを更新すると、登録しておいたブログの投稿内容がリスト形式で表示されます。
ブログ投稿一覧

デザインを変更したい場合は、CSSを「www/css/style.css」に追加して、レイアウトのテンプレートに次の記述を追加します。

app/Presenters/templates/@layout.latte
<link rel="stylesheet" href="{$basePath}/css/style.css">

例えば、次のようなスタイルシートを作成すると、少し見栄えが良くなります。

www/css/style.css
.post {
  margin: 10px;
  border: 1px dotted #808080;
}

.post > div {
  margin: 5px 20px;
}

.date {
  text-align: right;
  float: right;
}

h2 {
  border-left: 1em solid #808000;
  border-bottom: 1px solid #808000;
  margin-left: 10px;
  padding: 3px;
}

ブログ投稿一覧デザイン

特定の投稿を表示するページを作る

ブログの一覧画面から、特定のブログを選択し、その内容を表示するページを作成します。
このためには、投稿のIDを取得し、その内容を表示する新しいrenderメソッドを作成します。

新しいプレゼンターのクラスPostPresenterを次のように作成します。
コンストラクタでデータベースの設定をしているのは上記と同様で、投稿を表示するrenderShowでは投稿のIDを取得しています。

app/Presenters/PostPresenter.php
<?php

declare(strict_types=1);

namespace App\Presenters;

use Nette;


final class PostPresenter extends Nette\Application\UI\Presenter
{
    /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function renderShow(int $postId): void
    {
        $post = $this->database->table('posts')->get($postId);
        if (!$post) {
            $this->error('Post not found');
        }

        $this->template->post = $post;
    }
}

存在しないIDが指定された場合、「ページが見つからない」というエラーを表示しています。
$this->error(...)が呼び出されると、わかりやすいメッセージとともにHTTPのステータスコード404のページが表示されます。
開発環境では、エラーページではなく、Tracyによって詳細な情報が表示されます。

次に、テンプレートを作成します。

app/templates/Post/show.latte
{block content}
<p><a href="{link Homepage:default}"> back to posts list</a></p>
<div class="date">{$post->created_at|date:'F j, Y'}</div>
<h1 n:block="title">{$post->title}</h1>
<div class="post">{$post->content}</div>
{/block}

最初にブログ投稿一覧へ戻るためのリンクを設定しています(defaultは省略することもできます)。

そして、ブログ投稿一覧画面から各投稿へのリンクを作成します。
タイトルをクリックすると、投稿画面に遷移するように、タイトル部分を次のように変更します。

app/templates/Homepage/default.latte
<h2><a href="{link Post:show $post->id}">{$post->title}</a></h2>

実際にアクセスしてみると、次のように表示されます。

一覧画面にリンクが追加
投稿画面

次回は記事の投稿やコメント入力を作成します。

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

チェコで人気のPHPフレームワーク「Nette」の紹介

Netteとは

PHPのWebアプリケーションフレームワークというと、日本ではLaravelやCakePHP、Symfony, CodeIgniterなどが人気を集めています。しかし、世界を見渡してみると、さまざまなフレームワークが利用されています。
その中でも日本ではあまり知られていませんが、チェコ共和国では人気のPHPフレームワーク「Nette」を紹介します。
以下の文章は、Netteの公式サイトにあるドキュメントからポイントをかいつまんで紹介し、解説を追記したものです。

最新の内容は公式サイトをご覧ください。
https://nette.org/en/

3番目?の人気を誇るPHP7向けのフレームワーク

Webアプリケーションを開発するとき、スクラッチで開発することもできますが、多くの人にとってフレームワークを使うと効率よく開発できます。

NetteはPHP7向けに開発されたスタンドアロンのフレームワークで、オープンソースで公開されています。
また、雑誌「SitePoint」による調査「2015年のベストPHPフレームワーク」では、フレームワークの人気ランキングで第3位を獲得しています。

セキュリティが最優先

Webアプリケーションを開発するとき、セキュリティは非常に重要です。
Netteは安全なPHPフレームワークとして開発されており、XSSやCSRF、セッションハイジャックなどを防ぐため、さまざまな方法が用意されています。
例えば、他のフレームワークでは、開発者が明示的にエスケープを宣言する必要がありますが、NetteではContext-Aware Escapingなどが用意されており、指定されたコンテキストに基づいてすべての入力を自動的にエスケープされます。

10年以上続いている開発体制とライブラリ

Netteは最近できたものではなく、すでに10年以上にわたって開発が続けられています。
このため、成熟したライブラリがあり、安定しているため、多くのWebサイトで広く使用されています。

Zdrojákが実施した世論調査では、チェコ共和国で最も人気があり、広く使用されているフレームワークと 位置付けられています。

Netteはスタンドアロンのライブラリで構成されているため、WordPressや他のフレームワークと組み合わせて使うこともできます。
また、テンプレートシステムやAjaxのサポートがあるだけでなく、ドキュメントが豊富に用意されています。

高速かつ洗練されたコード

NetteはPHP 7.1の新機能を使用し、オブジェクト指向に基づいて設計されています。
洗練された高品質なコードで、将来の拡張性に重点を置いているだけでなく、高速なフレームワークの1つです。
Netteを使うと、システムの本質に集中して効率的に作業できるようになるだけでなく、ソースコードを適切に構造化できるので読みやすくなります。

サンプル

順次、追記していきます。

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

Wordpress自作テーマ ヘッダーの画像とテキストを設定 + 変更可能にする

はじめに

この記事ではwordpressの自作テーマでヘッダー画像をセットしたい場合、どうるれば良いかを紹介。

functions.php

結論、functions.phpを編集します。
これを追加することで、管理画面>外観>ヘッダーが選択できるようになる。

functions.php
//ヘッダーテキストの色を変更可能にする
function wphead_cb() {
  echo '<style type="text/css">';
  echo '.topimg-pc h1, .topimg-pc h6 { color: #'.get_header_textcolor().' }';
  echo '</style>';
}

// カスタムヘッダー
$custom_header = array(
'random-default' => false,
'width' => 1000,
'height' => 300,
'flex-height' => true,
'flex-width' => true,
'default-text-color' => '',
'header-text' => true,
'uploads' => true,
// ヘッダーテキストのデフォルトの色
  'default-text-color' => '000',
  'wp-head-callback' => 'wphead_cb',
                         // デフォルト画像へのパス
'default-image' => get_bloginfo('template_url').'/src/img/top_img.jpg',
'admin-head-callback'    => '',      // 管理画面で、[外観 - カスタマイズ]をプレビューするためのコールバック
    'admin-preview-callback' => '',
);
add_theme_support( 'custom-header', $custom_header );

スクリーンショット 2020-03-04 20.46.28.jpg

ヘッダー画像を出力

どこにヘッダー画像を出力するかは人によるけど、私は共通化してあるheader.phpにした。

header.php
 <div class="topimg-pc">

 <!-- もしヘッダー画像が設定されていたら -->
       <?php if ( get_header_image() ) : ?>
          <img src="<?php header_image(); ?>" height="<?php echo get_custom_header()->height; ?>" width="<?php echo get_custom_header()->width; ?>" alt="" />

 <!-- もしヘッダー画像が設定されていないなら -->
          <?php else: ?>
           <img src="<?php echo get_template_directory_uri(); ?>/src/img/top_img.jpg">
        <?php endif; ?>

        <h1><?php bloginfo( 'name' ); ?></h1>
        <h6><?php bloginfo('description'); ?></h6>

  </div>

ヘッダーテキストの色を変更

echoで何を吐き出すかは、HTMLタグとCSSによって変わる。

functions.php
//ヘッダーテキストの色を変更可能にする
function wphead_cb() {
  echo '<style type="text/css">';
  echo '.topimg-pc h1, .topimg-pc h6 { color: #'.get_header_textcolor().' }';
  echo '</style>';
}

スクリーンショット 2020-03-10 20.28.28.jpg

これで管理画面>外観>ヘッダー>色からヘッダーテキストの色を変更可能になった!

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

Laravelのコア1つを、複数サブドメインを作ったエックスサーバーで駆動させる

概要

筆者以前から実験してみたかったのですが、エックスサーバーのサブドメインで、マルチサイトを作れるCMSを構築したい。
個人的にエックスサーバーが好きなんです。すみません。

使い道は、
・テンプレートタイプのLPやホームページの運用
・通販サイト

そんな感じかなぁと。
私は、単純に日々の業務を合理化したいのが目的です。

設定

config/app.php

config/app.php に記述されている urlは 標準だと.envから設定値を読み取り設定しています。
動的に設定したいので、PHPで記述しておきます。
テンプレートで {{ulr('/xxx')}} を使いたい時など設定しておくと便利かと。
.envのAPP_URLは、使っているドメインでも入れておけば良いかと。使われませんので。

    //'url' => env('APP_URL', 'http://localhost'),
    'url' => empty($_SERVER["HTTPS"]) ? "http://" : "https://" . $_SERVER["HTTP_HOST"],

public_html/{subdomain}/

エックスサーバーでサブドメインを作成すると、ドメインの手前の部分はフォルダでpublic_htmlの直下に作成されてきて、そのフォルダがサブドメインのルートディレクトリになりますよね。

サブドメインのルートに標準で作成されているpublicフォルダのデータをコピーします。
ただ、階層が1つ深く沈むのでindex.phpを少々編集が必要です。
autoload.phpとbootstrap/app.php'の相対パス(../)をそれぞれ1つ増やします。

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylor@laravel.com>
 */

define('LARAVEL_START', microtime(true));

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels great to relax.
|
*/

require __DIR__.'/../../vendor/autoload.php';

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

$app = require_once __DIR__.'/../../bootstrap/app.php';

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

routes/web.php

ここについては、マニュアル通りに設定してみます。
(公式マニュアル)
https://laravel.com/docs/6.x/routing#route-group-subdomain-routing

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


Route::domain('{subdomain}.yourdomain.com')->group(function () {
    Route::get('/', function ($subdomain) {
    //ビュー渡し
        return view('welcome',['subdomain'=>$subdomain]);
    });
    //コントローラ渡し
    Route::get('/', 'Controller@index');
});
    /**
     * コントローラ渡しの時は、引数がこれで渡ります
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request, $subdomain)
    {
        return view('welcome', [
            'subdomain'=> $subdomain
        ]);
    }

https://subdomain.yourdomain.com 
所定のURLを開いてみると、welcomeテンプレートには、subdomainの変数が取れるようになります。
あとは、このsubdomainを引数として使って、コントローラやモデルを組んでいけば、
マルチサイトの構築は、いつも通りに作っていけば、できそうですね。
なかなか面白いと思います。
比較的簡単なので興味ある方は一度試してみてわ。
でわでわ。

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

LaravelをMacにインストールしてみよう!

LaravelをMacにインストールしてみよう!

概要

macOSにローカル開発環境としてLaravelをインストール

公式サイト
https://readouble.com/laravel/6.x/ja/installation.html

前提

■環境 
 macOS HighSierra 10.13.16
 Homebrew 2.2.9
 Composer 1.9.3
 PHP 7.4.3
 Laravel 7.0.8

■インストール済みソフト
 Homebrew(macOS用パッケージマネージャー)
 >日本語サイト:Homebrew
 >インストール参考記事:Homebrew使い方まとめ

準備

■Composerインストール
 PHP用ライブラリ依存管理ツールをインストール

$ brew install composer

 >参考記事:PHPのライブラリ管理ツール「Composer」入門

インストール

■laraverlインストール
Composerを使ってインストール

$ composer global require "laravel/installer"

PATHを通す

~/.bash_profile または ~/.bashrc にパスを追加(お使いの設定により)

~/.bash_profile
export PATH=$PATH:/usr/local/bin:$HOME/.composer/vendor/bin

 パス確認(値は環境依存)

$ echo $PATH
usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

 設定反映

$ source .bash_profile

 パス確認

$ echo $PATH
usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/{ユーザー名}/.composer/vendor/bin

 末尾に :/Users/{ユーザー名}/.composer/vendor/bin が追加されていることを確認

プロジェクト作成

$ laravel new {任意のプロジェクト名}

成功のメッセージを確認

Package manifest generated successfully.
Application ready! Build something amazing.

 動作確認 作成したプロジェクトに移動してartisanでバージョン確認&サーバを起動

$ cd PROJECT
$ php artisan --version
Laravel Framework 7.0.8
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000

 ブラウザで表示
ローカルサーバ

以上です。

参考記事

Mac OSにLaravelローカル開発環境構築
https://qiita.com/da-sugi/items/7ee7a458aad4209bab01

Mac OSにLaravel 5.7を導入する方法
https://qiita.com/nemui_/items/a62637a6aa173cbb8b09

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

Wordpress カスタムフィールドプラグイン「smart custom fields」の使い方メモ

Wordpress カスタムフィールドプラグイン「smart custom fields」の使い方メモ

ちょっと前置き

今まではAdvanced Custom Fieldsを使っていて問題はなかったのですが
オプションページ、繰り返し機能が有料版にしかないため有料版を購入しようかと調べていたら
無料かつオプションページ、繰り返し機能が付いているプラグインがあったので使い方を調べつつ
自分用のメモとして書いていきます。

実行環境
Windows 10
Xampp

種類 バージョン
php 7.3
Wordpress 5.3

とりあえずインストール

プラグインの新規追加から「smart custom fields」を検索
smart custom fields.png
※未検証と出ているけど問題はないみたい・・・?

基本的な使い方

入力部分

インストールが完了したらサイドバーにある「smart custom fields」→「新規追加」
ページ転移したら「カスタムフィールド」内の「フィールドを追加」をクリック
FireShot  #275  - http.png
そしたらこんな画面になるのでちょっと解説

カスタムフィールド 説明
タイトル 表示されるタイトル
繰り返し ONにすると複数回入力できるようになる
タイプ* テキストとか画像とか、入力するものを選択
ラベル わかりやすい名前
名前* わかりやすい名前、呼び出し時に使う可能性有
デフォルト 説明するまでもない初期値
手順 そのまま、わかりやすい手順を書く
メモ メモ・・・?

とりあえずこんな感じに入力したら
FireShot  #276  - http.png
右サイドバーの「投稿」をONにして保存。
そうすると投稿編集画面の下部にこんな感じに現れます。
FireShot  #277  - http.png

これでひとまず入力部分は完成?です。

出力部分

入力するだけでは出力してくれないので出力部分を書かないといけません・・・
今回は投稿ページなので通常はsingle.phpを編集します。
※index.phpだったりしますのでご注意をw
※確認にはshow current templateがおススメです

single.phpの中で「the_content()」の関数を探します。
これは投稿編集ページのコンテンツ部分を出力するコードですので
これの周辺に書くことが多いかと思います。

single.php
<?php the_content(); ?>
<?php echo SCF::get('名前'); ?>

とりあえずこんな感じに書くと
FireShot  #278  - http.png

表示されるようになります。

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

Rim fdraw As require ’pop->File->Draw'

ファイルの有無を調べなければインストール

Sik pop @popのインストール
echo Sik pop @こうすれば同時にログも取れて安心(あればtrueなければfalse)
Rim require "pop" @ライブラリの取り込み
Rim fdraw As require "pop->file->draw"

Rimはファイル自身。requireは文字列の名前空間を探す。asは別名を作成

@代入にはset簡単でしょ
n set loop t of range 10 to if t->mod 2 = 1:{1,t->tostr}:{2,t->tostr}
call T t->add1 n 0

@メソッド定義
Trait T
bind f h m n = h->each->(m)->append n
Trait end

@メソッド定義
Method T extends Trait
@めんどくさけりゃusing ? repeat $だぜ!
using bind repeat $
$add1 h m = f h m 1 @h->each->(0)->inc とも書ける
$inc h m = h->each->(m)->inc
$dec h m = h->each->(m)->dec 
Proc Construct me-lily ,grp set {}
Lily grp set grp
img set{fdraw'{}'->Format C:\Data\Mg.png ->Image 1}
ndir set nodir
chdir img->(0)->Getdir
Lily geekimg set img
Proc End-> nil
Method End
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでスクレイピングその1

Goutte

https://github.com/FriendsOfPHP/Goutte

PHPで簡単にスクレイピングを行うことができるライブラリーです。

導入

コンポーザーでインストール

$ composer require fabpot/goutte

もしくは上記Githubから.pharファイルをダウンロードしましょう

あとはソース内で

test.php
require_once './vendor/autoload.php';

test.php
require_once 'goutte.phar';

のように読み込んであげて、

test.php
use Goutte\Client;

useしてあげるだけでOKです!

使ってみる

https://giftpad.co.jp/company こちらのサイトから

赤枠の部分、良い言葉なので是非PHPで取得したいですね

campany.png

XPathを確認して、
xpath.png

ソースに反映

index.php
<?php

require_once 'goutte.phar';

use Goutte\Client;

// Goutteオブジェクトの生成
$client = new Client();

// ページ情報を取得
$crawler = $client->request('GET', 'https://giftpad.co.jp/company');

// タグを指定
$word = $crawler->filter('div#content div section div div div p')->each(function($element){
    return $element->text();
});

echo $word[0];

取れました!
get.png

総評

  • 簡単に導入できて、XPathやタグの指定で直感的にスクレイピングしやすいと感じました。
  • 今回は簡単な紹介でしたが、次回は取得したデータをもとにして何かのツールを作ろうと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む