- 投稿日:2020-03-10T23:10:45+09:00
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を利用しました。
いろいろセキュリティと利便性の案配が大変なんですね。
以上
おわおわり。
- 投稿日:2020-03-10T23:02:58+09:00
DVWA(XXS:stored)全レベルの脆弱性について
前提
- kali linux環境がある
- DVWAのセットアップ済み
- 初級レベル理解済み
目標
- 脆弱性の理解を深める。
手順概要
- 大まかな挙動を把握する
- コードを見て脆弱性をみつける
- コードの脆弱性を攻撃する
内容
挙動の把握
- ボタンを押すと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が埋め込まれている(下図)
medium
- 制限されているのは
<script>という文字列だけなので一部変更すれば突破できる<script >alert("medium")</script >- messageはエスケープされている。
high
- mediumみたいに空白を開けても並びが"script"ならブロックされる。なので、script以外を使う。
<img src="#" onerror=alert("high")>- messageはエスケープされている。
impossible
- 無理っぽい
- 投稿日:2020-03-10T22:49:23+09:00
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レコード以上なら速度がかなり低下するので、検索したいキーで連想配列を作り直して検索した方が良さそう
- 投稿日:2020-03-10T22:41:34+09:00
DVWA(XXS:Reflected)全レベルの脆弱性について
前提
- kali linux環境がある
- DVWAのセットアップ済み
- 初級レベル理解済み
目標
- 脆弱性の理解を深める。
手順概要
- 大まかな挙動を把握する
- コードを見て脆弱性をみつける
- コードの脆弱性を攻撃する
内容
挙動の把握
- ボタンを押すとGETリクエストが飛ぶ
- クエリにname=hogeが乗っかる
- そのクエリがpreタグへ転写される(下図)
コードを確認
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>medium
- 制限されているのは
<script>という文字列だけなので一部変更すれば突破できる<script >alert("medium")</script >high
- mediumみたいに空白を開けても並びが"script"ならブロックされる。なので、script以外を使う。
<img src="#" onerror=alert("high")>impossible
- 無理っぽい
- 投稿日:2020-03-10T22:00:18+09:00
Win10 + PHP + Laravel 開発環境構築メモ
概要
- Windows10にPHP開発環境を構築したときのメモです
- 後で見返す用に書きだしたレベルなので、内容は適宜修正します。
PHP(XAMMP)
- Apache, MariaDB, PHP, Perl などがパッケージ化されたもの
- https://www.apachefriends.org/jp/index.html
- 特定バージョンを入れる場合は「その他のバージョン~」から
- インストールした後はPATHを追加する
- 例) C:\xampp\php
composer
- PHPでの開発におけるライブラリの依存関係などを管理してくれるもの
- https://getcomposer.org/doc/00-intro.md#installation-windows
- DLは Composer-Setup.exe から
xdebug
- PHPでデバッグするための拡張モジュール
- https://xdebug.org/download
- 色々試行錯誤したけどうまくいかなかったので、最終的に以下の手順で導入した。
- コマンドプロンプトで
$ php -iをたたく- https://xdebug.org/wizard に[1]の内容を貼り付けて「Analyse my phpinfo() output」を押下
- 画面下部に表示される手順に従って操作していく
- [1]に戻り、再度 Analyze して Xdebug installed のところにバージョンが出てきたらOK
$ 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 ★ここが出力されたらOKphp.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)
- node.jsです。
- https://nodejs.org/en/
- LTSの方入れておきました
VisualStudioCode
- Microsoft が提供しているコードエディタ
- https://azure.microsoft.com/ja-jp/products/visual-studio-code/
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
サンプルプロジェクトで動作確認
$ composer create-project "laravel/laravel=6.*" sample$ cd sample$ php artisan -V$ composer install$ npm install$ php artisan serve- 任意の場所 (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, } ] }
- 投稿日:2020-03-10T21:38:48+09:00
「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での実装例)
対策方法
簡単な話スクリプトとして認識させなければ良いのです。
例えば、
・< → <
・> → >
・& → &
・" → "
これでスクリプトはスクリプトではなく、ただの文字列として扱われます。
これを「エスケープ」と言います。実装例
掲示板に以下のスクリプトが投稿されたとします<script>alert('XSS');</script>掲示板の投稿するソースが
echo <script>alert('XSS');</script>となっていた場合、スクリプトとして実行され、アラートが出てしまいます。
ではエスケープしてみます。
エスケープするには「htmlspecialchars」を使用します。echo htmlspecialchars(<script>alert('XSS');</script>, ENT_QUOTES, "UTF-8");これでただの文字列として扱われ、アラートは出ません。
- 投稿日:2020-03-10T20:49:25+09:00
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テーブルに保存。
また、入力欄が空、すでに登録済みメールアドレスを入力したなどの場合、error[]という配列に値を代入します。そして、error[]があるばあいは同じページに、error[]が空ばあいは確認画面に飛びます。また、error[]の要素とその値によってメッセージを赤字でページ内に表現します。
5.4ログイン機能
入力したemailとpasswordがmemberテーブルに保存されている値と一致した場合には、ログインします。エラーが発生した場合は赤字でメッセージをだします。
自動的にログインするをチェックした場合はcookieに値を2週間保存します。5.5メッセージの送信、削除、返信機能
メッセージを送信してデータベースに保存。そして、メッセージを新しい順に写真、名前、日付をつけて表示しました。
また、削除の機能を追加して、返信機能も追加しました。
返信機能では「RE」を押すことで、そのメッセージとそのメッセージを送信主の名前をメッセージの入力欄に記載5.6いいね機能
いいね追加、削除機能
データーベースに、coutsテーブルを作成。もしそのメッセージにいいねをしていない場合にいいねをクリックしたら、countデータベースにユーザーのidとメッセージのid、時間を保存する。逆に、そのメッセージにいいねをしている状態でいいねをクリックしたら、countデータベースから登録あったしてカラム(ユーザーのidとメッセージのid、時間を保存したもの)を削除する。いいね表示機能
そして、countsテーブルから、メッセージのidの数だけいいねの数を表示する5.7
htmlspecialcharsでセキュリティ対策をしました
課題点
・全体のレイアウトのいびつさ
htmlをその都度に入力していたので、いびつなレイアウトになりました。設計をしっかりしてその通りに形を整えることができなかったのが原因と思われます・ユーザーに配慮した設計
ユーザーの使いやすいような、見た目や機能にできてない。スマートフォンに対応したりしていない。
- 投稿日:2020-03-10T20:46:46+09:00
nginxとphp-fpmを使ってLaravelのhome画面を表示する
前書き
初めての投稿ですので、わかりにくい箇所があるかもしれません。改善案などございましたら、教えてください。
nginxとphpのインストール
自分はMacを使っているので、今回はHomebrewを利用してインストールしていきます。
brew install php@(バージョンは各自指定してください) brew install nginxphp-fpmはbrewでphpをインストールすると同時にインストールされます。
インストールできたか確認
php -v nginx -vnginxとはなにか
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
にアクセスしてみて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(); ?>としておきました。
Laravelを表示するには
nginx.confのrootを編集するだけです。
Laravelの処理の起点となるのは、publicディレクトリです。
Laravelで扱うWebページのルート部分はpublic/ディレクトリになります。このことを理解していれば簡単です。root /Users/username/Desktop/projectname/public/;この画面が出れば完了です。
- 投稿日:2020-03-10T19:05:46+09:00
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 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 { }このファイルの最後の括弧を削除してみます。
すると、次のようにエラーの詳細が表示された赤い画面のページが表示されます。Tracyを使うと、エラーの原因を調べるのに非常に役立ちます。
上記の右下に表示されている「TRACY」というフローティングバーにマウスを合わせると、詳しい情報を表示することもできます。もちろん、公開モードではTracyが無効になっているため、ソースコードやパスワードなどの機密情報は公開されません。
エラーは「log/」ディレクトリに保存されます。公開モードに設定するには、Bootstrapファイルでコメントアウトされている部分を以下のように変更します。
app/Bootstrap.php$configurator->setDebugMode(false);「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.neondatabase: 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>実際にアクセスしてみると、次のように表示されます。
次回は記事の投稿やコメント入力を作成します。
- 投稿日:2020-03-10T19:04:46+09:00
チェコで人気の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を使うと、システムの本質に集中して効率的に作業できるようになるだけでなく、ソースコードを適切に構造化できるので読みやすくなります。サンプル
順次、追記していきます。
- 投稿日:2020-03-10T16:28:05+09:00
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 );ヘッダー画像を出力
どこにヘッダー画像を出力するかは人によるけど、私は共通化してある
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-10T14:45:06+09:00
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-routinguse 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を引数として使って、コントローラやモデルを組んでいけば、
マルチサイトの構築は、いつも通りに作っていけば、できそうですね。
なかなか面白いと思います。
比較的簡単なので興味ある方は一度試してみてわ。
でわでわ。
- 投稿日:2020-03-10T10:44:36+09:00
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_profileexport 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/7ee7a458aad4209bab01Mac OSにLaravel 5.7を導入する方法
https://qiita.com/nemui_/items/a62637a6aa173cbb8b09
- 投稿日:2020-03-10T09:53:37+09:00
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」→「新規追加」
ページ転移したら「カスタムフィールド」内の「フィールドを追加」をクリック
そしたらこんな画面になるのでちょっと解説
カスタムフィールド 説明 タイトル 表示されるタイトル 繰り返し ONにすると複数回入力できるようになる タイプ* テキストとか画像とか、入力するものを選択 ラベル わかりやすい名前 名前* わかりやすい名前、呼び出し時に使う可能性有 デフォルト 説明するまでもない初期値 手順 そのまま、わかりやすい手順を書く メモ メモ・・・? とりあえずこんな感じに入力したら
右サイドバーの「投稿」をONにして保存。
そうすると投稿編集画面の下部にこんな感じに現れます。
これでひとまず入力部分は完成?です。
出力部分
入力するだけでは出力してくれないので出力部分を書かないといけません・・・
今回は投稿ページなので通常はsingle.phpを編集します。
※index.phpだったりしますのでご注意をw
※確認にはshow current templateがおススメですsingle.phpの中で「the_content()」の関数を探します。
これは投稿編集ページのコンテンツ部分を出力するコードですので
これの周辺に書くことが多いかと思います。single.php<?php the_content(); ?> <?php echo SCF::get('名前'); ?>表示されるようになります。
- 投稿日:2020-03-10T07:50:44+09:00
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
- 投稿日:2020-03-10T00:42:29+09:00
PHPでスクレイピングその1
Goutte
https://github.com/FriendsOfPHP/Goutte
PHPで簡単にスクレイピングを行うことができるライブラリーです。
導入
コンポーザーでインストール
$ composer require fabpot/goutteもしくは上記Githubから.pharファイルをダウンロードしましょう
あとはソース内で
test.phprequire_once './vendor/autoload.php';や
test.phprequire_once 'goutte.phar';のように読み込んであげて、
test.phpuse Goutte\Client;useしてあげるだけでOKです!
使ってみる
https://giftpad.co.jp/company こちらのサイトから
赤枠の部分、良い言葉なので是非PHPで取得したいですね
ソースに反映
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];総評
- 簡単に導入できて、XPathやタグの指定で直感的にスクレイピングしやすいと感じました。
- 今回は簡単な紹介でしたが、次回は取得したデータをもとにして何かのツールを作ろうと思います。

































