20210907のPHPに関する記事は12件です。

phpMyFAQの業務導入顛末記(その1)

1.背景 筆者の職場では、主にユーザーのサーバーやネットワーク環境の構築~保守・運用をやっています(筆者はやってないけど)。 作業は小規模ながらも多量の案件を効率よくさばく必要があり、特に顧客ごとの担当も決まっていないため、過去に各人が経験したノウハウやヒヤリハットをどう全員に共有するかが課題となっていました。 そういった情報共有を目的として、OSSなどフリーの「情報共有ツール」と称するツールを探している途中で見つけたのが、今回取り上げるOSSのphpMyFAQです。 https://www.phpmyfaq.de/ これがなかなかの「めっけもん」やったんで、以降そのインストールからデータ移行、業務への導入に関してその顛末をご紹介していきたいと思います(現在進行形)。 2. phpMyFAQの特徴 1) PHPを使った、フリーのオープンソースツールである:ある程度の調整や不具合は自分で対処  最新版のver.3.0.9は、PHP7.2~で稼働します。  もちろんソースも公開されていて、カスタマイズ可能です。  https://www.phpmyfaq.de/docs/3.0 2) 特殊な環境を要しない:「Apache + PHP + MariaDB」etc.というコテコテの環境で稼働  筆者は職場のMariaDBを使いましたが、PostgreSQLやSQLiteも使えるようです。 3) FAQサイトにありがちな、「一方的上意下達」なサービスではない  これは、たぶんこのツールの最大のウリなんで後述。 3. phpMyFAQでできること 図解します。 機能的には、「FAQサイト構築ツール」と言うより「情報共有コミュニティサイト」といった感じです。 1)管理者が記事を記載し公開:通常のFAQサイトのイメージです 2)一般ユーザーが記事を提案し、管理者が承認して公開 3)ユーザー間のQ&Aを管理者が承認して公開 4. phpMyFAQのインストール&設定 ・・・と書いてはみたものの、ことインストール&設定だけに関して言えばネット検索すれば山ほど出ますし、きわめて簡単ですので省略。 ただ、(ネット記事でもほとんど言及はありませんが)インストールに当たっては下記のような制約がありますのでお気を付けを。 ※筆者の環境は  ・CentOS7  ・Apache2.4.6  ・PHP7.3.27  ・MariaDB5.5.68  ・OpenSSL1.0.2  です。 1)".htaccess"が使えるディレクトリであること これはちょっとハマりました。 Apacheの設定で、せめてインストール先ディレクトリだけは".htaccess"が使えるようにした方がよいです。 httpd.conf <Directory "/var/www/html/phpmyfaq/"> Allow Override All Order deny,allow allow from all </Directory> 2)拡張機能"Pecl-Zip"が必要 後から分かったことなんですが・・・これオプション機能なんで、必要であればインストールすればええんです。 それが必須になってるって・・・ しゃーないんで、 php-pecl-zip-1.19.3-2.el7.remi.7.3.x86_64 をインストールして解消。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【4枚目】おっさんが入門CakePHP (動画第5回:Modelを使ってデータを表示)

今回はDB使って画面表示するらしい。 今回も動画に従って進めます。 XAMPPコンパネで各サービスを開始 ブラウザでアパッチの動作確認。 ※databaseの個所が赤いのでDB接続できていないということ。 XAMPPコンパネでphpmyadminを起動 phpmyadminで捜査を進める。 DB作成し ユーザ作成して権限付与。 SQLでusersテーブルを作成 CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `account` varchar(20) NOT NULL COMMENT 'ログインID', `password` varchar(255) NOT NULL COMMENT 'パスワード', `name` varchar(20) NOT NULL DEFAULT '' COMMENT '名前', `email` varchar(255) NOT NULL DEFAULT '' COMMENT 'E-Mail', `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日', `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日', `created_user` varchar(45) DEFAULT NULL COMMENT '作成者', `modified_user` varchar(45) DEFAULT NULL COMMENT '更新者', PRIMARY KEY (`id`), UNIQUE KEY `account` (`account`) ); 1回目にSQLをコピペ実行した際は文字化けで上手く実行できなかった。 手打ちSQL実行で成功。 制作担当者に伝えて修正してもらった。 担当はMacで制作しているらしく正常動作するとの事。 ※私はWindows10proで勉強進めてる。 CakePHP側の接続設定だが configフォルダ内のapp.phpに設定記述がある。 ↓ この辺 設定がすんだらブラウザで確認。 赤枠内が緑の表示ならOK。 GitHubからはこんな感じでまとめてダウンロードした。 今回使うのは ↓ ココの下 src下のファイルをプロジェクトにコピーしてブラウザで確認 動画と同様に確認できる。 データをSQLでインサートして再度ブラウザで確認。 INSERT INTO `users`(`account`, `password`, `name`, `email`, `created`, `modified`, `created_user`, `modified_user`) VALUES ('taro','12345','山田 太郎','xxx@xxx.xxx',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'admin','admin'); データが上手く表示されていない。 ソース見ても特に悪いところもなさそうなので atomにリロード的な機能が無いか確認。 reopen project っての有りました。 リオープン後にブラウザで確認。 今度はちゃんとデータ表示されました。 今回のまとめ ・動画や指示書の指示どおりに進めてもうまくできない場合はある。 ・文字化け注意 ・リロードや再起動は基本
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCode x DockerでXdebugを使えるようにする

はじめに この記事では、Visual Studio Code、Docker Desktop の導入方法は説明しません。 Xdebugのバージョンは2系と3系を使います。 環境 macOS Big Sur --version 11.3 Visual Studio Code --version 1.60.0 Docker Desktop --version 3.6.0 Visual Studioで必要な拡張機能をインストール felixfbecker.php-debug をインストールしてください ディレクトリ構成 . ├── .vscode │   └── launch.json ├── Dockerfile ├── docker-compose.yml ├── php.ini └── src └── index.php Dockerfile Xdebug2を使う場合 FROM php:7.4-apache RUN pecl install xdebug-2.8.1 \ && docker-php-ext-enable xdebug WORKDIR /var/www/html Xdebug3を使う場合 FROM php:7.4-apache RUN pecl install xdebug \ && docker-php-ext-enable xdebug WORKDIR /var/www/html docker-compose.yml version: "3.7" services: app: build: '.' ports: - 8088:80 volumes: - ./src:/var/www/html/ - ./php.ini:/usr/local/etc/php/php.ini php.ini Xdebug2を使う場合 [xdebug] xdebug.default_enable=1 xdebug.idekey=VSCODE xdebug.remote_autostart=1 xdebug.remote_enable=1 xdebug.remote_host=host.docker.internal xdebug.remote_log=/tmp/xdebug.log xdebug.remote_port=9000 Xdebug3を使う場合 [xdebug] xdebug.client_host=host.docker.internal xdebug.client_port=9000 xdebug.idekey=VSCODE xdebug.log=/tmp/xdebug.log xdebug.mode=debug xdebug.start_with_request=yes 2021/09/08 修正 xdebug.remote_host=docker.for.mac.localhostでも動きますが現在非推奨です。 /src/index.php <?php phpinfo(); ./vscode/launch.json てんとう虫のマークを押して「launch.jsonファイルを作成します。」を押します。 PHPを選択します。 作業ディレクトリ配下に「.vscode」ディレクトリと「lauch.json」が作成されます。 launch.json を編集します。 { "version": "0.2.0", "configurations": [ { "name": "Listen for Xdebug", "type": "php", "request": "launch", "port": 9000, "pathMappings": { "/var/www/html/": "${workspaceRoot}/src" }, }, { "name": "Launch currently open script", "type": "php", "request": "launch", "program": "${file}", "cwd": "${fileDirname}", "port": 9000, "runtimeArgs": [ "-dxdebug.start_with_request=yes" ], "env": { "XDEBUG_MODE": "debug,develop", "XDEBUG_CONFIG": "client_port=${port}" } } ] } Dockerコンテナを起動 ターミナルを開き、作業ディレクトリへ移動します。 user@Mac ~ % cd /path/to/a/directory/ コンテナをビルドした後に起動します。 ちょっと時間がかかるかもしれません。 user@Mac directory % docker-compose build user@Mac directory % docker-compose up -d ブラウザで http://localhost:8088/index.php にアクセスし、 phpinfoの画面が表示されればOKです。 VSCodeでデバッグする ブレークポイントを付ける デバッグを開始する 「Listen for Xdebug」を選び「▷」ボタンを押すと下の画面のようになります。 http://localhost:8088/index.php を更新すると下の画面のようになり、デバッグができます!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ルーティングの基本的な書き方

はじめに ルーティングとは 「ユーザーがこのURLにアクセスしたらこの機能を呼び出す」というような感じで、URLと機能を紐付ける工程のことを言います。 Laravelでは、ユーザーからリクエストが送信されたら、ルーティングにしたがって決められたコントローラーのアクション(メソッド)が起動するという流れになります。 ルーティングは、routesディレクトリ内のweb.phpにRouteファサードを使って記述していきます。 記述方法 (1)「/」にアクセスしたら、viewsのwelcome.blade.phpを表示する。 web.php Route::get('/', function () { return view('welcome'); }); (2)「/menu」にアクセスしたら、MenuControllerのindexアクションを実行し、menusディレクトリ内のindex.blade.phpを表示する。 web.php Route::get('/menu', 'MenuController@index'); MenuController.php public function index() { return view('menus.index'); } Laravel8.xでは web.php Route::get('/menu', [MenuController::class, 'index']); と記述するようになったみたいです。 おわりに ルーティングは先(上)に記述した方が優先されるということは覚えておきましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

☆herokuでのしょうもない凡ミス、、☆エンコードを直しても直しても変わらない

状態 ①herokuへDBをプッシュできなかった。 ②原因がわかっていて、エンコードのバイト数が基準を超えてしまっている。 ③エンコードのバイト数を増やす記述を増やす記述を追記する ④なぜか変わらない、、 ⑤どうやらherokuでプッシュするときは、ローカルでもプッシュしないといけないという凡ミス、、 ターミナル $ heroku run php artisan migrate ②原因がわかっていて、エンコードのバイト数が基準を超えてしまっている ターミナル SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes ③エンコードのバイト数を増やす記述を増やす記述を追記する 記述① php:/app/Providers/AppServiceProvider.php ... 記述② use Illuminate\Support\Facades\Schema; ... public function boot() { Schema::defaultStringLength(191); } ... 結論から言えば、③の処理をすれば全く問題ないのであるしかし、、私は凡ミスをしていた、、 ターミナル git push origin master ...こんなことでした。どうやら私はherokuはリモートのmasterブランチが反映されることを全く知らなかった。 *herokuにpushする前にはローカルから!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP・デバッグ】PHPのデバッグに役立つ関数

はじめに はじめまして、プログラミング初学者のbookkuunです。 学んだことをQiitaでアウトプットしていきます。 記事に気になる点がありましたら、ご指摘・アドバイスよろしくお願いします。 今回は、PHPのデバッグについて整理していきます。 対象者 PHPを学び始めて間もない方 PHPのデバッグ方法を整理したい方 構成 デバッグとは? PHPのエラーの種類 デバッグ方法 print_r var_dump var_export error_log まとめ おわりに 参考資料 デバッグとは? デバッグ(debug)とは、プログラムにあるバグや欠陥を発見し、正しく動作するようにするための作業です。 PHPのエラーの種類 エラー 内容 Fatal error(致命的なエラー) 処理を継続することが不可能になった場合に発生します。 Parse error(構文エラー) コードの文法が誤っていることに発生します。 Warning(警告) 処理を継続することは可能。想定外の問題が起こった時に発生します。 Notice(注意) 処理を継続することは可能。想定内の問題に起こった時に発生します。 参考資料 PHPエラー種類と原因 - Qiita PHPのエラーの種類 - Qiita 基本中の基本!PHPのプログラミングエラーの種類と内容 | 株式会社LIG デバッグ方法 print_r 変数の値に関する情報を解り易い形式で表示します。(PHP マニュアル - Manual引用) 配列の表示が見やすいです。 trueは1と表示されます。 falseとNULLは何も表示されません。 コード例 <?php //整数 $number = 100; print_r($number); //文字列 $moji = "sample"; print_r($moji); //真偽値 $shin = true; $gi = false; print_r($shin); print_r($gi); //NULL $data = null; print_r($data); //配列など $fruits = array('a' => 'apple', 'b' => 'banana', 'c' => array('orange', 'grape', 'strawberry')); print_r($fruits); 出力(ブラウザ/<pre>タグを使用しています。) //$number(整数) 100 //$moji(文字列) sample //$shin(真偽値/true) 1 //$gi(真偽値/false) //$data(NULL) // $fruits(配列など) Array ( [a] => apple [b] => banana [c] => Array ( [0] => orange [1] => grape [2] => strawberry ) ) var_dump この関数は、指定した式に関してその型や値を含む構造化された情報を返します。(PHP マニュアル - Manual引用) 表示できる変数に指定はなく、数値や文字列、配列といった様々な型の変数の値を確認することができます。 データ型や構造など詳細な情報を表示するには、var_dump関数を使用します。 コード例 <?php //整数 $number = 100; var_dump($number); //文字列 $moji = "sample"; var_dump($moji); //真偽値 $shin = true; $gi = false; var_dump($shin); var_dump($gi); //NULL $data = null; var_dump($data); //配列など $fruits = array('a' => 'apple', 'b' => 'banana', 'c' => array('orange', 'grape', 'strawberry')); var_dump($fruits); 出力(ブラウザ/<pre>タグを使用しています。) //$number(整数) int(100) //$moji(文字列) string(6) "sample" //$shin(真偽値/true) bool(true) //$gi(真偽値/false) bool(false) //$data(NULL) NULL //$fruits(配列など) array(3) { ["a"]=> string(5) "apple" ["b"]=> string(6) "banana" ["c"]=> array(3) { [0]=> string(6) "orange" [1]=> string(5) "grape" [2]=> string(10) "strawberry" } } var_export 渡された変数に関する構造化された情報を返します。この関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります。(PHP マニュアル - Manual引用) print_rと表示は似ています。var_dumpで見づらいときや文字列として出力したいときなどに活用できます。 trueはtrueと表示されます。(print_rは1と表示されます。) falseとNULLはfalseとNULLとそのまま表示されます。(print_rはfalseとNULLは何も表示されません。) コード例 <?php //整数 $number = 100; var_export($number); //文字列 $moji = "sample"; var_export($moji); //真偽値 $shin = true; $gi = false; var_export($shin); var_export($gi); //NULL $data = null; var_export($data); //配列など $fruits = array('a' => 'apple', 'b' => 'banana', 'c' => array('orange', 'grape', 'strawberry')); var_export($fruits); 出力(ブラウザ/<pre>タグを使用しています。) //$number(整数) 100 //$moji(文字列) 'sample' //$shin(真偽値/true) true //$gi(真偽値/false) false //$data(NULL) NULL //$fruits(文字列など) array ( 'a' => 'apple', 'b' => 'banana', 'c' => array ( 0 => 'orange', 1 => 'grape', 2 => 'strawberry', ), ) error_log エラーメッセージを Web サーバーのエラーログあるいはファイルに送ります。(PHP マニュアル - Manual引用) エラーをログとして残したい時に使用します。 print_rとvar_exportは第2引数をtrueにすると返り値をとります。var_dumpは値を返しませんのでここでは活用できません。 コード例 <?php $fruits = ['a' => 'apple', 'b' => 'banana', 'c' => ['orange', 'grape', 'strawberry']]; //error_log(メッセージ, メッセージタイプ, 出力先) //メッセージタイプ //0の場合は標準出力など //1の場合はメールの送付先アドレス //3の場合は出力先ファイルパス //print_rの場合 error_log(print_r($fruits, true), 3, "./print_r.txt"); //var_exportの場合 error_log(var_export($fruits, true), 3, "./var_export.txt"); ログファイル print_r.txt Array ( [a] => apple [b] => banana [c] => Array ( [0] => orange [1] => grape [2] => strawberry ) ) var_export.txt array ( 'a' => 'apple', 'b' => 'banana', 'c' => array ( 0 => 'orange', 1 => 'grape', 2 => 'strawberry', ), ) まとめ 配列の要素数やデータ型など細かい情報を確認したい場合はvar_dumpを使用します。 print_rとvar_exportは似ているが、真偽値やNULLの表示が異なります。 出力表 データ型 値 print_r var_dump var_export 整数 123 123 int(123) 123 文字列 sample sample string(6) "sample" 'sample' 真偽値(true) true 1 bool(true) true 真偽値(false) false bool(false) false NULL null NULL NULL 配列など ['apple', 'orange', 'grape'] [0] => apple [1] => orange [2] => grape array(3) { [0]=> string(5) "apple" [1]=> string(6) "orange" [2]=> string(5) "grape" } array ( 0 => 'apple', 1 => 'orange', 2 => 'grape', ) おわりに 最後まで読んでいただきありがとうございます。print_rとvar_exportは似ていますがこのような違いがあったのですね。新たな発見でした。今後デバッグ関数を適切に活用し、エラー解決に活かしていきたいです。 参考資料 PHP マニュアル - Manual PHPエラー種類と原因 - Qiita PHPのエラーの種類 - Qiita 基本中の基本!PHPのプログラミングエラーの種類と内容 | 株式会社LIG var_dump、var_export、print_r、デバッグ時に使うのがベストなのはどれ!? - Qiita print_r()とvar_dump()どちらをつかう??
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Amazon Linux 2 に複数PHPバージョンを同居

Amazon Linux 2 に複数のPHPバージョンを同居 PHPインストール時に複数バージョンを同居しても問題ないよう、インストールしてる手順をメモ 汎用的なやり方ではないと思いますが、簡単に設定・切替えしたい人向けです。 ① yum updateした後に、remiリポジトリを追加 # 最新版へupdate sudo yum -y update # remiリポジトリを追加 sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm sudo yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm ② 利用するPHPバージョン毎にインストール # PHPを使うバージョン毎にインストール for v in 70 74 80; do sudo yum -y install php$v php$v-php php$v-php-{mbstring,mysqlnd,redis,pecl-apcu,opcache,xml,gmp}; done # PHP7.0を使う場合 php70 -v # PHP7.4を使う場合 php74 -v # PHP8.0を使う場合 php80 -v ③ apacheの自動起動を有効化 ※versionは2.4以上 sudo systemctl enable httpd sudo systemctl list-unit-files | grep -e httpd ④ apacheのphp.confを勝手にロードされないよう、ファイル名変更 cd /etc/httpd/conf.modules.d/ # php.confの拡張子を変更 sudo rename php.conf php.conf.org *php.conf ⑤ alternativesで各バージョンを管理 ※「複数のバージョンの PHP を切り替えて使う」記事を参考にしました。 # PHP7.0 sudo update-alternatives \ --install /usr/bin/php php /opt/remi/php70/root/usr/bin/php 10 \ --slave /usr/bin/php-cgi php-cgi /opt/remi/php70/root/usr/bin/php-cgi \ --slave /usr/bin/phar.phar phar /opt/remi/php70/root/usr/bin/phar.phar \ --slave /etc/httpd/conf.modules.d/10-php.conf webphp /etc/httpd/conf.modules.d/15-php70-php.conf.org # PHP7.4 sudo update-alternatives \ --install /usr/bin/php php /opt/remi/php74/root/usr/bin/php 10 \ --slave /usr/bin/php-cgi php-cgi /opt/remi/php74/root/usr/bin/php-cgi \ --slave /usr/bin/phar.phar phar /opt/remi/php74/root/usr/bin/phar.phar \ --slave /etc/httpd/conf.modules.d/10-php.conf webphp /etc/httpd/conf.modules.d/15-php74-php.conf.org # PHP8.0 sudo update-alternatives \ --install /usr/bin/php php /opt/remi/php80/root/usr/bin/php 10 \ --slave /usr/bin/php-cgi php-cgi /opt/remi/php80/root/usr/bin/php-cgi \ --slave /usr/bin/phar.phar phar /opt/remi/php80/root/usr/bin/phar.phar \ --slave /etc/httpd/conf.modules.d/10-php.conf webphp /etc/httpd/conf.modules.d/20-php80-php.conf.org ⑥ メインで使うphpに切替え $ sudo update-alternatives --config php There are 3 programs which provide 'php'. Selection Command ----------------------------------------------- *+ 1 /opt/remi/php70/root/usr/bin/php 2 /opt/remi/php74/root/usr/bin/php 3 /opt/remi/php80/root/usr/bin/php Enter to keep the current selection[+], or type selection number: ※php.ini設定を忘れずに(タイムゾーン等) # PHP7.0.ini sudo vi /etc/opt/remi/php70/php.ini # PHP7.4.ini sudo vi /etc/opt/remi/php74/php.ini # PHP8.0.ini sudo vi /etc/opt/remi/php81/php.ini コンテナ毎に各バージョンを用意してもOKだが、こちらがお手軽かなと。 殆ど自分用メモですが、ご指摘等頂けると助かります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでメールアドレスからサブドメインを除いた形のドメインを抜き出す

以下のコードを利用することで、サブドメインを除いた形で、メールアドレスからドメインを抜き出すことができます。 ※ブランドTLDは処理出来ません(ブランドTLDは別途処理方法を検討する必要があります) <?php function get_domain($email) { // メールアドレスからドメインのみ抜き出し $domain = preg_replace('/^.+?@(.+?)$/i', '${1}', $email); // 地域型JPドメインの抜き出し $pattern = '/^.*?((pref|metro|pref|city|town|vill)\..+?\.(hokkaido|aomori|iwate|miyagi|akita|yamagata|fukushima|ibaraki|tochigi|gunma|saitama|chiba|tokyo|kanagawa|niigata|toyama|ishikawa|fukui|yamanashi|nagano|gifu|shizuoka|aichi|mie|shiga|kyoto|osaka|hyogo|nara|wakayama|tottori|shimane|okayama|hiroshima|yamaguchi|tokushima|kagawa|ehime|kochi|fukuoka|saga|nagasaki|kumamoto|oita|miyazaki|kagoshima|okinawa|lg)\.jp)$/i'; if (preg_match($pattern, $domain)) { return preg_replace($pattern, '${1}', $domain); } // 属性型ドメインの抜き出し $pattern = '/^(.*?)(\.(co|or|ne|ac|ed|ed|go|gr|lg|com|net|org|mil|edu|int|idv)\.(is|ie|az|ac|af|us|as|vi|ae|dz|ar|aw|al|am|ai|ao|ag|ad|ye|uk|gb|io|vg|il|it|iq|ir|in|id|ug|ua|uz|uy|ec|eg|ee|sz|et|er|sv|eu|au|at|ax|om|nl|gh|gg|gy|kz|qa|um|ca|cv|ga|cm|gm|kh|mk|mp|gn|gw|cy|cu|cw|gr|ki|kg|gt|gp|gu|kw|ck|gl|cx|gd|hr|ky|ke|ci|cc|cr|km|co|cg|cd|sa|gs|ws|st|bl|zm|pm|sm|mf|sl|dj|gi|je|jm|ge|sy|sg|sx|zw|ch|se|sd|sj|es|sr|lk|sk|si|sc|gq|sn|rs|kn|vc|sh|lc|so|su|sb|tc|th|kr|tw|tj|tz|cz|td|cf|cn|tn|kp|cl|tv|dk|de|tg|tk|do|dm|tt|tm|tr|to|ng|nr|na|aq|nu|ni|ne|jp|eh|nc|nz|np|nf|no|hm|bh|ht|pk|va|pa|vu|bs|pg|bm|pw|py|bb|ps|hu|bd|tl|pn|fj|ph|fi|bt|bv|pr|fo|fk|br|fr|gf|pf|tf|bg|bf|bn|bi|vn|bj|ve|by|bz|pe|be|pl|ba|bw|bq|bo|pt|hk|hn|mh|mo|mg|yt|mw|ml|mt|mq|my|im|fm|za|ss|mm|mx|mu|mr|mz|mc|mv|md|ma|mn|me|ms|jo|la|lv|lt|ly|li|lr|ro|lu|rw|ls|lb|re|ru|wf))$/i'; if (preg_match($pattern, $domain)) { $tmp = preg_replace($pattern, '${1}', $domain); $tmp2 = preg_replace($pattern, '${2}', $domain); if (substr_count($tmp, '.') > 0) { $tmp = substr($tmp, strrpos($tmp, '.') + 1, strlen($tmp2)); } return $tmp . $tmp2; } // その他ドメインの抜き出し $tmp = substr($domain, 0, strrpos($domain, '.')); if (substr_count($tmp, '.') > 0) { $tmp = substr($tmp, strrpos($tmp, '.') + 1, strlen($tmp)); } $tmp2 = substr($domain, strrpos($domain, '.'), strlen($domain)); return $tmp . $tmp2; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

composerプライベート自作ライブラリをgitlabに作成する

概要 自作ライブラリをcomposer/gitlabを介して使う 手順 トークンの作成 アクセス用トークンを作成する。 https://${gitlab_url}/profile/personal_access_tokens にアクセスし、Scopeをapiで作成。 値をメモしておく。 ライブラリ用プロジェクト projectの設定 gitlabプロジェクトのページで、Setting>General>Visibility, project features, permissionsにアクセス。 パッケージとして使うことを許可する。 composer.json 以下の記載を入れる { "name": "${namespace}/${library-name}", "type": "library", "version": "${version}" } この状態で、タグをつけてプッシュしてする。 ライブラリの発行 以下のコマンドをたたきライブラリとして登録する。 curl --data tag=${tag_name} 'https://__token__:${token}@${gitlab_url}/api/v4/projects/${project_id}/packages/composer' 利用側プロジェクト composer.json 以下を追記する。 require: { "${namespace}/${library_name}": "${version}" }, "repositories":[ {"type":"composer","url":"https://__token__:${token}@${gitlab_url}/api/v4/group/${group_id}/-/packages/composer/packages.json"} ], auth.jsonを使って認証をする方法もあるがうまくいかなかった。 globalに設定すればできるかもしれないがあまりやりたくないのでこちらを利用。 install composer install これで利用可能です。情報が散らばっていましたが、やってみると意外と簡単。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php version 違いでエラーになる

Fatal error: Uncaught Error: Call to undefined function mysql_connect()   バージョンが違うと出る ネットで検索すると バージョンによって書き方が変わると書いてあった php version 7に書き換えるには、 $conn = mysql_connect($sv,$user,$pass) or die("接続エラー"); 空 $conn = mysqli_connect($sv,$user,$pass) or die("接続エラー"); mysql_connect ------> mysqli_connect というふうにiをmysqlの 後につけることで解決することができる そうすればエディタで表示されているエラーを解消することができる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPの便利な関数(4)

概要 PHPが用意している便利な関数について、忘備録として記載していく。 また、PHP7系を前提とする。 右記 PHPの便利な関数一覧 に他の関数について記載した一覧を作成しています。 ラインナップ array_key_exists( ) sprintf( ) empty( ) isset( ) is_array( ) array_key_exists( ) 指定したキーまたは添字が配列にあるかどうかを調べる 存在すれば true を返す 存在しなければ false を返す test.php // keyを持った連想配列を定義する $array = [ 'id' => 1, 'name' => 'Taro' ]; // keyに存在するname,存在しないcityを指定してみる var_dump(array_key_exists('name', $array)); var_dump(array_key_exists('city', $array)); php ./test.php bool(true) bool(false) sprintf( ) フォーマットされた文字列を返す フォーマットの中で「%s」のような記載を「指定子」という 指定子が設定された箇所に値の代入が可能 データ型によって指定子が異なる (例:%sで文字列、%dで数値) test.php // フォーマットを直接 echo sprintf('日本で%d番標高の高い山は、%sです。', 1, '富士山'); echo "\n"; // 出力結果が分かりやすいよう改行 // フォーマットを別で定義し代入 $format = '日本で%d番標高の高い山は、%sです。'; echo sprintf($format, 1, '富士山'); echo "\n"; // %(引数)$ で引数の順番を指定 $format = '日本で%2$d番標高の高い山は、%1$sです。'; echo sprintf($format, '富士山', 1); echo "\n"; php ./test.php 日本で1番標高の高い山は、富士山です。 日本で1番標高の高い山は、富士山です。 日本で1番標高の高い山は、富士山です。 empty( ) 変数が空であるかどうかを検査 空の場合、trueが返される 空でなかった場合、falseが返される 空であるとみなされるのは、「変数が存在しない場合」や 「変数の値が false に等しい」場合 test.php // 各種定義 $tmp_var; $empty_var = ""; $null_var = null; $false_var = false; $true_var = true; $num_var = 123; $str_var = "testtest"; // 結果の確認 var_dump(empty($not_var)); // 存在しない変数 var_dump(empty($tmp_var)); var_dump(empty($empty_var)); var_dump(empty($null_var)); var_dump(empty($false_var)); var_dump(empty($true_var)); var_dump(empty($num_var)); var_dump(empty($str_var)); php ./test.php bool(true) bool(true) bool(true) bool(true) bool(true) bool(false) bool(false) bool(false) isset( ) 変数が宣言されていることをチェックする また、値がnullではないことをチェックする 変数が宣言されているかつ、値がnullではない場合、trueが返される 変数が宣言されていない、宣言されているが値がnullの場合、falseが返される test.php // 各種設定 $tmp_var = "test"; $null_var = null; // 結果の確認 var_dump(isset($tmp_var)); var_dump(isset($num_var)); var_dump(isset($not_var)); // 存在しない変数 php ./test.php bool(true) bool(false) bool(false) is_array( ) 変数が配列かどうかチェックする 配列であった場合、trueが返される 配列でなかった場合、falseが返される test.php // 配列、非配列を定義 $array = array('test1', 'test2'); $no_array = 'test3'; // 結果の確認 var_dump(is_array($array)); var_dump(is_array($no_array)); php ./test.php bool(true) bool(false)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【laravel】laravel+Reactを使ってSPAにしてみる

初書:2021/09/06 mac : 11.5.2 php:v8.0.6 laravel:v8.57.0 前書き 最近Reactを知ったのでせっかくならLaravelでも使ってみよう、というメモ。 前提 Laravelインストール済み。 素のPHPしか触ってなかった人がlaravelを触ってみる - Qiita インストール まずはuiをインストール % composer require laravel/ui その後はuiをreactに変更 % php artisan ui react インストールとmix % npm install && npm run dev もし、Please run Mix again.と言われた場合はもう一度npm run devします。 以上 Typescriptにする ReactといえばTypescript…と、勝手に思ってるので、Typescriptで書けるように追加していく。 インストール まずは必要なものをインストール % npm install --save-dev ts-loader typescript react-router-dom @types/react @types/react-dom @types/react-router-dom react-router-domと@types/react-router-domはSPAを作る場合。laravel側でルーティングする場合は不要。 でもこの記事では使います。 tsconfig.jsonの設定 % npx tsc --init これでtsconfig.jsonが生成される。 設定は好みだが、一応今設定しているものを置いておく。 tsconfig.json { "compilerOptions": { "target": "ES2020", "lib": [ "ES2020", "DOM", ], "jsx": "react-jsx", "module": "AMD", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true }, "include": [ "resources/ts/**/*" ] } targetはES2020を選択。頻繁なアプデを好まない層(IEとか古いiOSとか)がこないサイトなら最新のものでいいと思う。 moduleはAMDを選択した。es2020とかとの違いはあんまり分かってない。(非同期で読み込める点?でものちに1ファイルにまとめる・・・。) 各ブラウザの対応状況:ECMAScript 2016+ compatibility table ページを作成する 今回はメインページとサブページを作る。 laravelでtsを置くのは基本的にresourcesディレクトリなので、この下に作成する。 resources/ts/app.tsx import ReactDOM from "react-dom"; import { BrowserRouter, Route, Switch } from "react-router-dom"; import main from "./main"; import sub from "./sub"; function App() : JSX.Element { return ( <BrowserRouter> <Switch> <Route exact path="/" component={main} /> <Route exact path="/sub" component={sub} /> </Switch> </BrowserRouter> ); } ReactDOM.render(<App />, document.getElementById("root")); resources/ts/main.tsx import React from "react"; import { Link } from "react-router-dom"; const element = (): JSX.Element => { return ( <div> <p>メインページです。</p> <Link to="/sub">サブページへ</Link> </div> ); }; export default element; resources/ts/sub.tsx import React from "react"; const element = (): JSX.Element => { return <p>サブページです。</p>; }; export default element; React、最近は関数型の書き方の方が良いって聞いたので関数型を使ってみた。 基盤となるapp.tsxとページを表示するmainとsubを作成。 これが出来れば、それを表示するためのwelcome.blade.phpを変更する resources/views/welcome.blade.php <!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> </head> <body class="antialiased"> <div id="root"> </div> </body> <script src="{{ mix('js/app.js') }}"></script> </html> 表示用のdivと、読み込みスクリプトがあれば後は自由。 ページは以上 laravel mixを使う そのままではapp.jsなるファイルは存在していないので、作成する。 普通にインストールしていると、webpack.mix.jsが既に存在しているので、これを編集する。 webpack.mix.js const mix = require('laravel-mix'); mix.js('resources/ts/app.tsx', 'public/js') .react() .webpackConfig({ module: { rules: [ { test: /\.tsx?$/, loader: 'ts-loader', exclude: /node_modules/, }, ], }, resolve: { extensions: ['*', '.js', '.jsx', '.ts', '.tsx'], }, }) .version(); react()が何するのかよく分かってない。誰か教えてください(他人頼り) これで、npm run devを実行すると、先ほど作ったapp.tsx関連がapp.jsにまとめられる。 一度アクセスしてみる これで一度アクセスしてみる。 php artisan serveでサーバーを立て、http://127.0.0.1:8000/にアクセスすると、先程のメインページですが表示されているはず。 また、サブページへを押すと、http://127.0.0.1:8000/subにアクセスされ、サブページですが表示される。 一見これでいいように見えるが、直接http://127.0.0.1:8000/subにアクセスすると、laravel側からurlが存在していないと言われる。 これは、subページがReact内だけで作成されているだけのため。 この先は仕様次第だが、今回はReact側でアクセス処理を任せることにする 全てのアクセスをapp.tsxにまとめる アクセスはroutes/web.phpで管理しているので、ここを変える routes/web.php Route::get('/{any}', function () { return view('welcome'); })->where('any', '.*'); 元々あった/を/{any}に変え、条件を全てに変更した。 where文があるのは、/もanyに含まれるようにするため。 これで、直接http://127.0.0.1:8000/subにアクセスしても、サブページですが表示される。 終わりに この後ブラウザとサーバー側でデータのやりとりをするため、APIの設定等をしないといけないが、長くなりそうなので今回は一旦ここで切り上げ。 まだ試行錯誤段階なので、やり方異なってたり、よりいい方法とかあれば更新する…かも。 参考サイト React.JS + Laravel 8 + MySQL + API REST でCRUDを作ってみた。 【環境構築】LaravelでReactとTypescriptを使う方法 - Qiita 【Typescript×React】tsconfig.jsonの設定項目を詳しく紹介 - Qiita laravel-mixでtypescript + reactをビルドする - Qiita
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む