20210621のPHPに関する記事は14件です。

Laravelで違う文字(濁点/半濁点/平仮名/片仮名)が同じ文字として使われてしまう問題の対処法

はじめに Laravelで日本語の比較処理をしようとしたところ、違う文字列であるにも関わらず同じものとして扱われてしまうことがありました。 その時の対処法を忘れないように記事にしたいと思います。 動作確認環境 PHP 8.0 Laravel 8.0 MySQL 8.0 ※下位環境でも動作する場合がございます テーブル構造 問題点 $nana = Sample::where('name', 'バッグ')->get(); この処理。一見だと違う文字列であるため、一致する値は取得できないように思えますが、実はID:1の情報が返ってきてしまいます。 解決法1 $nana = Sample::where('name', 'LIKE BINARY', 'バッグ')->get(); あいまい一致を回避するためにはLaravelでは'LIKE BINARY'を付けることで完全一致に切り替えることができます。 解決法2 ただ、解決法1ではSelect文の時は回避できるのですが、該当カラムにユニークキーが貼られていた場合、Insertは依然として通りません。 該当カラムにユニークキーを使っている場合は、該当カラムの参照順序(文字コード)を変えてしまいましょう。 MySQLのバージョンにもよりますが8.0.2以降であれば、utf8mb4_ja_0900_as_cs_ksを使っておけば無難です。 ※MySQL8系が使えない場合はutf8mb4_binが無難です(適時読み替えて下さい) /** * Run the migrations. * * @return void */ public function up() { // マイグレーションの書き方 Schema::create('samples', function (Blueprint $table) { $table->id(); $table->string('name')->unique()->collation('utf8mb4_ja_0900_as_cs_ks'); $table->timestamps(); }); } 解決法3 文字コードで混乱しなくないという場合は、Laravelのconfig/database.phpの設定を書き換えてしまうのが簡単です。 MySQL 8.0.2以降を使用する場合は下記の設定しておけば問題ないかと思います。 マイグレーションした際の初期値がutf8mb4_ja_0900_as_cs_ksになります(個別設定は不要)。 ※なお、MySQL8系が使えない場合はutf8mb4_binが無難です(適時読み替えて下さい) 'mysql' => [ ... 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_ja_0900_as_cs_ks', ... ], 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】PHP課題14-8 ジャンケンゲーム 難易度(高)

1・画面のレイアウトは画像の通り 2・ユーザーはグー・チョキ・パーのいずれかをラジオボタンで入力する 3・submitされたら、ユーザーの手を表示する 4・submitされたら、コンピュータの手をグー・チョキ・パーからランダムに選択し、表示する 5・submitされたら、じゃんけんの勝敗を判定し、出力する 6・利用するクラスは public/object_sample/classes 内に作成し、適宜読み込む。 7・JankenGameクラスとHandクラスを作成する。 JankenGameクラスはコンピュータの手をランダムに決める。 JankenGameクラスはユーザーの手とコンピュータの手を比べて勝敗を判定できる。 JankenGameクラスは勝敗に応じて結果のテキストを返す。 /laravel_bbs/public/object_sample/rock_paper_scissors.php <?php require_once 'classes/Hand.php'; require_once 'classes/JankenGame.php'; $hand = new Hand(); $cpu = new Hand(); $result = ''; if($_SERVER['REQUEST_METHOD'] === 'POST'){ $hand->set($_POST['hand']); $cpu->random(); $jankenGame = new jankenGame($hand,$cpu); $result = $jankenGame->get_result(); } ?> <!DOCTYPE html> <html lang="ja"> <head> <title>じゃんけん</title> </head> <body> <h1>じゃんけん勝負</h1> <p>あなたの手: <?php print $hand->get(); ?> </p> <p>コンピューターの手: <?php print $cpu->get(); ?> </p> <p>結果: <?php print $result; ?> </p> <form method="post"> <label> グー <input type="radio" name="hand" value="グー" required ></label> <label>チョキ <input type="radio" name="hand" value="チョキ" required ></label> <label>パー <input type="radio" name="hand" value="パー" required ></label> <input style="display:block;" type="submit" value="勝負"> </form> <p><a href="rock_paper_scissors.php">初画面</a></p> </body> </html> /laravel_bbs/public/object_sample/classes/Hand.php <?php class Hand { const HANDS = ['グー', 'チョキ', 'パー']; private $hand; public function __construct(){ $this->hand = ''; } public function random(){ $this->hand = Hand::HANDS[array_rand(Hand::HANDS)]; } public function set($hand){ $this->hand = $hand; } public function get(){ return $this->hand; } } /laravel_bbs/public/object_sample/classes/JankenGame.php <?php class JankenGame { private $hand; private $cpu; public function __construct($hand, $cpu){ $this->hand = $hand; $this->cpu = $cpu; } public function get_result(){ $playerHand = $this->hand->get(); $pcHand = $this->cpu->get(); if ($playerHand == $pcHand) { $result ='あいこ'; } elseif ($playerHand == 'グー' && $pcHand == 'チョキ') { $result = '勝ち'; } elseif ($playerHand == 'チョキ' && $pcHand == 'パー') { $result = '勝ち'; } elseif ($playerHand == 'パー' && $pcHand == 'グー') { $result = '勝ち'; } else { $result = '負け'; } return $result; } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ユーザーエージェントを判別するAgentをLaravelにインストールする

「Agent」のロゴ。ダンディですね。 UserAgentを識別するライブラリ「Agent」 PHPでユーザーのOSやブラウザの種類を判別したいときには「Agent」が便利です。 使い方 <?php use Jenssegers\Agent\Agent; $agent = new Agent(); // デバイスのチェック $agent->isAndroidOS(); // ブラウザのチェック $agent->isIE(); $agent->isSafari(); Laravelへのインストール composerでインストールします。 composer require jenssegers/agent Laravelから呼び出せるように設定をconfig/app.phpに足します。 config/app.php Jenssegers\Agent\AgentServiceProvider::class, config/app.php 'Agent' => Jenssegers\Agent\Facades\Agent::class, LaravelのBladeに便利に渡す ServiceProviderを追加し、Bladeテンプレートに常に$agentが渡されるようにします。 これでいつでもBlade内から$agentを参照することによってUserAgentを取得できます。 app/Providers/AgentServiceProvider.php <?php namespace App\Providers; use View; use Jenssegers\Agent\Agent; use Illuminate\Support\ServiceProvider; class AgentServiceProvider extends ServiceProvider { public function boot() { $agent = new Agent(); View::share('agent', $agent); } public function register() { // } } config/app.php <?php ... 略 ... /* * Application Service Providers... */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, ... 略 ... App\Providers\AgentServiceProvider::class, ], これで以下のようにBladeテンプレートから呼び出せます。 index.blade.php @if($agent->isIE()) {{ 'Internet Explorerを使っています。' }} @endif
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP8.1】呼び出し元に返らない返り値の型が指定できるようになる

function foo():XXX{ exit; } この関数の返り値の型は何にすればいいでしょうか。 null? void? nullはnullという型ですし、voidは『値を返さない』であって『呼び出し元に返らない』ではありません。 ということで『呼び出し元に返らない』を明記できる型が提案されました。 返らないのに返り値とは。 PHP8.1以降ではこう書けるようになります。 function foo():never{ exit; } 以下は該当のRFC、PHP RFC: noreturn typeの日本語訳です。 PHP RFC: noreturn type Introduction ここ数年の傾向として、元々はPHP docで表現されていた型がPHPネイティブになっていくということがあります。 過去の例としてはスカラー型、返り値の型、UNION型、mixed型、static型などです。 現在、PHPの静的解析ツールは、常に例外を発したり常にexitしたりする関数を示すために、@return noreturn構文をサポートしています。 ツールのユーザは、自分のコードの動作を表すためにこの構文が便利だと感じていると思いますが、PHPネイティブのコンパイル・実行時の型チェックがサポートすればより便利になると思います。 Proposal 戻り値の型としてnoreturnを導入する。 リダイレクトする関数は、この戻り値型のよいサンプルです。 function redirect(string $uri): noreturn { header('Location: ' . $uri); exit(); } function redirectToLoginPage(): noreturn { redirect('/login'); } PHP開発者は、この関数を呼び出したときに、その後の文が評価されないことが保証されるという安心感を得ることができます。 function sayHello(?User $user) { if (!$user) { redirectToLoginPage(); } echo 'Hello ' . $user->getName(); // redirectToLoginPageが呼ばれたらここには絶対に来ない } 後からredirect関数にreturnを追加しようとしても、コンパイルエラーが発生します。 function redirect(string $uri): noreturn { if ($uri === '') { return; // Fatal error: A noreturn function must not return } header('Location: ' . $uri); exit(); } 暗黙的なreturnにしようとした場合は、TypeErrorが発生します。 function redirect(string $uri): noreturn { if ($uri !== '') { header('Location: ' . $uri); exit(); } } redirect(''); // Uncaught TypeError: redirect(): Nothing was expected to be returned noreturn関数内でyieldを使うとコンパイルエラーになります。 function generateList(string $uri): noreturn { yield 1; exit(); } // Fatal error: Generator return type must be a supertype of Generator Applicability noreturn型は、void型と同じく返り値の型としてのみ有効です。 引数やプロパティとして使おうとするとコンパイルエラーになります。 class A { public noreturn $x; // Fatal error } Variance 型理論において、noreturn型はボトム型とされます。 すなわち、PHPの型システムにおいては、noreturn型はvoidを含む全ての型のサブタイプになるということです。 従って、noreturn型は他のサブタイプと同じルールに従います。 返り値の型を狭めることができます。 abstract class Person { abstract public function hasAgreedToTerms(): bool; } class Kid extends Person { public function hasAgreedToTerms(): noreturn { throw new \Exception('Kids cannot legally agree to terms'); } } 返り値の型を広げることはできません。 abstract class Redirector { abstract public function execute(): noreturn; } class BadRedirector extends Redirector { public function execute(): void {} // Fatal error } リファレンスを使うことも可能です。 class A { public function &test(): int { ... } } class B extends A { public function &test(): noreturn { throw new Exception; } } __toStringメソッドにも適用可能です。 class A implements Stringable { public function __toString(): string { return "hello"; } } class B extends A { public function __toString(): noreturn { throw new \Exception('not supported'); } } noreturn型は全ての型のサブタイプであるため、他の型で問題なくアノテーションできます。 function doFoo(): int { throw new \Exception(); } Prior art in other interpreted languages 他のインタプリタ型での同様な実装。 Hacklang noreturn型 TypeScript never型 Python NoReturn型 Prior art in PHP static analysis tools PHP静的解析ツールでの同様な実装。 PsalmとPHPStanは、/** @return noreturn */をサポートしている。 PHPStormは、PHP8のアトリビュートで#[JetBrains\PhpStorm\NoReturn]をサポートしている。 Comparison to void noreturnとvoidは、いずれも返り値の型にしか書けないということは同じですが、類似点はそれだけです。 void型の関数を呼んだ場合、通常はそれ以降のプログラムも実行されるという想定です。 function sayHello(string $name): void { echo "Hello $name"; } sayHello('World'); echo ", it’s nice to meet you"; noreturn型の関数は、その後の文が実行されることはありません。 function redirect(string $uri): noreturn { header('Location: ' . $uri); exit(); } redirect('/index.html'); echo "this will never be executed!"; Naming ネーミングは難しい。 noreturn ・既存のクラス名として使われている可能性は低い。 ・関数っぽい名前。 never ・1単語であり、no-returnみたいに区切りを入れたくなる衝動がおこらない。 ・特定状況で使われるキーワードではなく、本格的な型として扱える。遠い将来ジェネリクスが入ったときにも使える単語だろう。 Backwards Incompatible Changes 互換性のない変更として、neverが予約語に追加されます。 Proposed PHP Version(s) PHP 8.1。 Patches and Tests Support noreturn types #6761 Vote 投票は2021/03/30から2021/04/13に行われ、賛成42反対11で受理されました。 またキーワードについて、noreturn・neverどちらがよいかという投票も同時に行われました。 こちらはnoreturn14票・never34票となっており、neverに決定しました。 RFCの本文はnoreturn前提で書かれているのですが、まあそのうち書き替えられると思います。 感想 never型は、void型やfalse疑似型同様、返り値にしか書けない特殊な型となります。 途中でexitするなんて他の言語ではなかなか考えづらいものがありますが、PHPの場合はリダイレクトという非常に自然な例が存在します。 function redirect(string $url): never { header('Location: ' . $url); exit; } これについては、他の書き方の方がかえって不自然になるでしょう。 こういうところに使えば、サジェストなどに出てくるため使い勝手がよりよくなりますね。 もっともフレームワークを使っていれば、あまり目にする機会はなさそうです。 たとえばLaravelだとユーザコード上でexitすることは考えられておらず、リダイレクトもRedirectResponseを適当に設定してreturnで送り返せ、みたいな設計だったりするので、ユーザから見える範囲にnever型が現れてくることはないでしょう。 ……いや待てddがあった! これでddとdumpの動作の違いをシグネチャで区別できるようになるぞ。 何の意味があるのかはわかりません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【WP】All-in-One WP Migration のアップロード上限を上げる方法【ロリポップ】

【STEP1】 ロリポップ管理画面の php.ini の設定を変更 最初にロリポップの管理画面の「PHP設定」でモジュール版からCGI版に変更します。 php.ini の設定画面にある「php_value, php_flagを利用可能にする」の項目を On にします。 「php.iniを設定する」のボタンをクリックします。 ※モジュール版のままだと「php_value, php_flagを利用可能にする」の項目を変更できません。 ※「php_value, php_flagを利用可能にする」の項目を On にすることで、 .htaccess に記述したアップロード上限の設定が有効になります。 【STEP2】 .htaccess に追記 既に WordPress がインストール済みなら .htacccess ファイルが作成されています。 その .htaccess ファイルに下記の 2 行を追記すれば完了です。 php_value upload_max_filesize 900M php_value post_max_size 900M ※この場合なら、上限が 900 MB になります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【WordPress】All-in-One WP Migration のアップロード上限を上げる方法【ロリポップ】

【STEP1】 ロリポップ管理画面の php.ini の設定を変更 最初にロリポップの管理画面の「PHP設定」でモジュール版からCGI版に変更します。 php.ini の設定画面にある「php_value, php_flagを利用可能にする」の項目を On にします。 「php.iniを設定する」のボタンをクリックします。 ※モジュール版のままだと「php_value, php_flagを利用可能にする」の項目を変更できません。 ※「php_value, php_flagを利用可能にする」の項目を On にすることで、 .htaccess に記述したアップロード上限の設定が有効になります。 【STEP2】 .htaccess に追記 既に WordPress がインストール済みなら .htacccess ファイルが作成されています。 その .htaccess ファイルに下記の 2 行を追記すれば完了です。 php_value upload_max_filesize 900M php_value post_max_size 900M ※この場合なら、上限が 900 MB になります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 多次元配列の差分を取る方法

LaravelのCollectionに多次元配列を比較する万能な機能を求め調べてみたのですが、特になかったので、 phpの配列の多次元配列の差分を見る方法を探しました。 下記のfunctionを用いて、差分を出してみてください。 public static function array_diff_assoc_recursive($array1, $array2) { $difference=array(); foreach ($array1 as $key => $value) { if (is_array($value)) { if (!isset($array2[$key]) || !is_array($array2[$key])) { $difference[$key] = $value; } else { $new_diff = self::array_diff_assoc_recursive($value, $array2[$key]); if (!empty($new_diff)) { $difference[$key] = $new_diff; } } } elseif (!array_key_exists($key, $array2) || $array2[$key] !== $value) { $difference[$key] = $value; } } return $difference; } <?php $a1=array( 'a' => 0, 'b' => null, 'c' => array( 'd' => null ) ); $a2=array( 'a' => 0, 'b' => null ); var_dump( array_diff_assoc_recursive( $a1, $a2 ) ); var_dump( chinello_array_diff_assoc_recursive( $a1, $a2 ) ); ?> array(1) { ["c"]=> array(1) { ["d"]=> NULL } } array(2) { ["b"]=> NULL ["c"]=> array(1) { ["d"]=> NULL } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

phpstorm xdebug どうしてもつながらないよ。そんなとき

だれかの役に立てば xdebug.log ファイルを見ても明らかに接続成功してるのに、breakpointで止まらない。 そんなときは Language & Frameworks > PHP > Debug > External connections の Ignore external connections through unregistered server configurations のチェックをはずしてみてください!きっとつながります
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのAuth機能で表示されるナビバーにリンクを追加したい。

LogoutしかメニューがないAuth機能のナビバー。 Laravelでポートフォリオを作成中です!! Auth機能でログイン機能を実装したのち 右上部にログインした後に名前が表示されるのですが そこのナビバーって Logoutしかメニューがないんですね。 今回のポートフォリオで 追加で「新規投稿画面」 「ユーザー情報画面」とか他画面に行くためのリンクの追加がしたい。。。。 日本語で探したかったけどうまく言葉が見つからんやった なので英語で説明あったので。 こちら まだ初心者なので英語のソース見るのドキドキしちゃうんですが 簡単でした。 This should be super simple to do, I'm not sure what you're doing but to add additional links you can add an anchor tag to the dropdown div: スーパーシンプルやで。アナタ様がどのような感じでやったか知らんけど、 a タグを div ん中に追加するんやで。 <a class="dropdown-item" href="#">About</a> たとえばこんな感じやな <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown"> <a class="dropdown-item" href="#">About</a> <a class="dropdown-item" href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();"> {{ __('Logout') }} </a> <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> @csrf </form> </div> て感じでした。 aタグの中に「dropdown-item」のクラス名を追加して あとはお好きなようにリンク貼っちゃっていいみたいです。 簡単じゃった。またレベルが上がりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Engress(作成中)

事前準備 コーディング手順 対応ブラウザ、パスの指定方法、納品形式、フォルダの構造、アニメーションの実装などの仕様を確認。 デザインを見て、頭の中でコードを組み立てる。この際、「クラス名の命名」「共通要素の洗い出し」「実際のコーディングで直面しそうな問題の把握(実装の仕方がわからないなど)」を明確にする。 画像の書き出し。画像ファイルの命名も「ttl_」「bg_」「ico_」「btn_」「img_」「nav_」などの識別子をつけ、画像がどのような意味を持つのか考えながら命名。 「ページ名/ブロック名」_「識別子」_「連番」の順で命名する。 また、背景透過、画質などを考慮し「png-8」「png-24」「jpg」「gif」などを適切な拡張子を選択する。 加えて、高解像度ディスプレイ対応のため2倍の大きさで書き出し。 さらに、ファイルサイズを考慮し、適切に圧縮をかける。 このテンプレートを使用し、まずは大枠、共通部分のコーディング、それから細部のコーディングを進める。 コーディング完了後はW3Cのバリデーションツールで文法のエラーをチェック。 各種チェック項目 修正の対応/完了 a.altが正しく入ってるか b.誤字がないか c.タイポグラフィーがあっているか d.色があっているか e.マークアップの構造が適切か f.どの画面幅でも崩れていないか g.アニメーションの挙動は適切か h.デザインとのずれがないかパーフェクトピクセルで確認 i.IE、Edge、Safari、FireFox、Chrome各ブラウザで表示確認 j.リンクは適切に入ってるか k.横スクロースしないか l.画像が重すぎないか コーディング規則 HTML、SCSS共に、セクションごとの開始と終わりにコメントで区切りをわかりやすくする。 SCSSのプロパティ順はposition, padding, margin, top,bottomなど「位置、余白」に関わるものを一番上に書き、あとはアルファベット順に整理する。 命名規則は基本はMindBEMding、共通要素が多く、下層ページの多いサイトにはモジュールコーディングを採用(接頭辞つけるやつ)。 パスは指定がなければ基本相対パス(ドキュメントパス)を使用。 文章構造はHTML、装飾はCSSに分離(ただしマテリアルデザインなどの場合は例外的にHTMLで装飾を施すこともやむを得ない)。 どの画面幅でも表示が崩れないようなリキッドデザインを極力使用。(320px~1900pxの画面幅で確認) ブラウザは「safari」「firefox」「IE(x)」「chrome」「iPhone」「アンドロイド」で確認*IEに関してはWindowsの実機で確認 ブレイクポイントは基本的にはBootstrapのものに合わせて「スマホ 768px」で「タブレット 992px」(デザインによっては例外あり) 位置や色ではなく、役割や意味を表す識別名をつけることを命名ルールにする。また、その単語からパーツを推測できるようにする。加えて、長くなりすぎないように意味が分かる範囲で単語を短くする。 padding,margin,backgroundのように複数の値を一度に指定できるプロパティに対して、基本的に2つ以上に個別指定が必要な場合は、ショートハンドプロパティを使って一括して指定する。 命名の際に数字を用いる際は「01」「02」のように2桁の連番で記述する。 基本的にはBlockで左右上下の余白を指定し、残りの要素には下に対して余白をつけていく Local By Flywheel CSS設計法 ディレクトリ構造 CSS reset.css style.css style.css.map images js swiper swiper.min.css swiper.min.js jquery-3.5.1.min.js script.js parts breadcrumb.php cta.php fnav.php gnav.php lowerLayerMv.php tel.php scss base _base.scss _reset.scss mixin _animation.scss _btn.scss _etc.scss _font.scss _keyflame.scss _mixin.scss _over.scss _utility.scss module _content.scss _etc.scss _fnav.scss _gnav.scss _main.scss _share.scss _snav.scss page common _footer.scss _header.scss _sidebar.scss top _article.scss _cta.scss _flow.scss _fv.scss _problem.scss _qa.scss _strength.scss _success.scss _tel.scss _archive-archive _archive-news.scss _page.scss _page-contact.scss _page-price.scss _single.scss _single-archive.scss _single-news.scss plugins _slick.scss slick.css.map setting _block.scss _color.scss _config.scss _function.scss _size.scss _typography style.scss templates 404.php archive.php archive-archive.php archive-news.php category.php footer.php front-page.php functions.php header.php index.php page.php page-contact.php page-price.php sidebar.php single.php single-archive.php single-news.php screenshot.png style.css slick.css.map style.css.map style.scss // ========================================================================== // setting // ========================================================================== @import "./setting/config"; @import "./setting/function"; @import "./setting/block"; @import "./setting/color"; @import "./setting/size"; @import "./setting/typography"; // ========================================================================== // mixin // ========================================================================== @import "./mixin/animation"; @import "./mixin/btn"; @import "./mixin/etc"; @import "./mixin/font"; @import "./mixin/_keyframe"; @import "./mixin/_mixin"; @import "./mixin/over"; @import "./mixin/utility"; // ========================================================================== // base // ========================================================================== @import "./base/reset"; @import "./base/base"; // ========================================================================== // module // ========================================================================== @import "./module/_content"; @import "./module/_etc"; @import "./module/_fnav"; @import "./module/_gnav"; @import "./module/_main"; @import "./module/_share"; @import "./module/_snav"; // ========================================================================== // page // ========================================================================== @import "./page/common/header"; @import "./page/common/sidebar"; @import "./page/common/footer"; @import "./page/top/fv"; @import "./page/top/problem"; @import "./page/top/strength"; @import "./page/top/success"; @import "./page/top/flow"; @import "./page/top/qa"; @import "./page/top/article"; @import "./page/top/cta"; @import "./page/top/tel"; @import "./page/page"; @import "./page/page-price"; @import "./page/page-contact"; @import "./page/archive-archive"; @import "./page/archive-news"; @import "./page/single"; @import "./page/single-archive"; @import "./page/single-news"; // ========================================================================== // plugins // ========================================================================== @import "./plugins/slick"; 吉本式BEM設計法 mixin PHP 動的部分マーキング Plugin Advanced Custom Fields Breadcrumb NavXT Custom Post Type UI MW WP Form WP Social Bookmarking Light All-in-One WP Migration Show Current Template WordPress インポートツール 難しかった部分 related-post reccomend-post custom-field custom-post-type pagination SNS-button Breadcrumb contact-form scroll-hint よく使うテンプレートタグ <?php echo get_template_part(''); ?> <?php echo get_template_part('parts/lowerLayerMv'); ?> <?php echo get_template_part('parts/breadcrumb'); ?> <?php echo get_template_part('parts/cta'); ?> <?php echo get_template_part('parts/tel'); ?> <?php get_template_directory_uri(); ?> <?php echo esc_url(home_url('/')); ?> 不明点 あ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

prepareメソッドを使う時にbindValueを省略する記述法があるらしい…!

bindValueを省略しない書き方 prepareメソッドは変動値を持つSQLを実行したいときに使うメソッド。 基本的な流れは 変動値にプレースホルダーを持たせてprepareメソッドを記述   ↓ prepareメソッドの返り値のPDOExeptionの中にあるbindValueメソッドで、 設定しているプレースホルダーに割り当てたい値、$PDOデータ型定数を設定する   ↓ executeで実行する   ↓ fetchで実行結果の返り値を取得 $sql = 'select * from contacts where id = :id'; $stmt = $pdo->prepare($sql); $stmt->bindValue('id', 3, PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetchAll(); bindValueを省略する書き方 基本的な流れは 変動値にプレースホルダーを持たせてprepareメソッドを記述   ↓ bindValueを使わない代わりに、exectueメソッドにarray型の引数をもたせる   ↓ fetchで実行結果の返り値を取得 $params = [ 'id' => null, 'your_name' => '追加名前4', 'email' => 'params@udemy2.com', 'url' => 'http://params2.com', 'gender' => '0', 'age' => '3', 'contact' => 'ダミーテキスト4', 'created_at' => null ]; $count = 0; $colums = ''; $values = ''; foreach(array_keys($params) as $key){ if($count++>0){ $colums .= ','; $values .= ','; } $colums .= $key; // 名前付きプレースホルダー $values .= ':'.$key; } $sql = "insert into contacts ($colums) values ($values)"; $stmt = $pdo->prepare($sql); // bindValueを使わない代わりに、exectueメソッドにarray型の引数をもたせる $stmt->execute($params); /* bindValueを省略しないバージョン */ // $stmt = $pdo->prepare($sql); // $stmt->bindValue(':id',$params["id"],PDO::PARAM_INT); // $stmt->bindValue(':your_name',$params["your_name"],PDO::PARAM_STR); // $stmt->bindValue(':email',$params["email"],PDO::PARAM_STR); // $stmt->bindValue(':url',$params["url"],PDO::PARAM_STR); // $stmt->bindValue(':gender',$params["gender"],PDO::PARAM_INT); // $stmt->bindValue(':age',$params["age"],PDO::PARAM_INT); // $stmt->bindValue(':contact',$params["contact"],PDO::PARAM_STR); // $stmt->bindValue(':created_at',$params["created_at"],PDO::PARAM_STR); // $stmt->execute(); bindValueを省略しないバージョンは記述量がとてつもなく長くなる・・・ 変動値が複数ある場合にはbindValueを使わない記述の方が見やすくて良い感じ! ただ、bindValueを使わないことで$PDOデータ型変数が指定できないことがデメリットみたいだなあ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CakePHP v3.6.x から v4.5.x へのバージョンアップについてのメモ

CakePHP 3.5.x から 4.2.x へバージョンアップする際に、苦労した点などをマトメていきます。 この記事は徐々に、更新していく予定です。 私が携わった案件では、サーバをインターネット環境に接続できないという制約があったため、composerは使用せず、全て手動でバージョンアップしています。 CakePHP4.xの移行ガイドに書かれていることについては、この記事では触れません。 移行ガイドだけ読んでいても気づきづらいことや、予め一覧化されていた方がよい変更点などをマトメていきます。 ↓ v4.2の移行ガイドはこちら ↓ no link next time link post
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CakePHP v3.5.x から v4.2.x へのバージョンアップについてのメモ

CakePHP 3.5.x から 4.2.x へバージョンアップする際に、苦労した点などをマトメていきます。 この記事は徐々に、更新していく予定です。 私が携わった案件では、サーバをインターネット環境に接続できないという制約があったため、composerは使用せず、全て手動でバージョンアップしています。 CakePHP4.xの移行ガイドに書かれていることについては、この記事では触れません。 移行ガイドだけ読んでいても気づきづらいことや、予め一覧化されていた方がよい変更点などをマトメていきます。 ↓ v4.2の移行ガイドはこちら ↓ https://book.cakephp.org/4/ja/appendices/4-2-migration-guide.html 記述方法の変更点マトメ 現行のソースコードにこれらの記述方法の変更点を反映させて、新フレームワークに乗せ換えるだけで、ほぼほぼ動く様になると思います。 (もちろん、/src/Config配下の設定が正しく移行されていることが必要ですが。) 逆に言うと、これらの変更点を事前に把握していないと、 ■エラー出る→■公式サイトで変更点を調べる→■修正する→■それを類似の全てのファイルに反映させる を繰り返すハメになります。(私のように・・・・・) 記述方法の変更によるエラー「以外」については、フレームワークの個々の機能(ウィジェットとか)の問題なので、一個一個調べていくしかないと思います。 分類 v3.5.x v4.2.x 備考 Model public function initialize(array $config) public function initialize(array $config) : void View $this->viewBuilder()->layout('hoge'); $this->viewBuilder()->setLayout('hoge'); Controller public function initialize() public function initialize(): void Controller $hoge = $this->Hoges->newEntity(); $hoge = $this->Hoges->newEmptyEntity(); Hogesはコントローラーの名前(HogesController) Table public function validationDefault(Validator $validator) public function validationDefault(Validator $validator): Validator Session関連 $this->request->session() $this->request->getSession() --- --- --- --- (続きは随時、更新していきます。)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

そのまま、コピペーでできます!LineNotify api でlineグループにメッセージを送信する(PHP)

①Lineグループを作る。 ・Line Notifyのユーザーを友たちに追加します。 ・Lineグループを作成します。 ・Line Notifyのユーザーをグループに招待します。 ②下記Urlにログインしてトークンを発行する。 こちらの画面から発行してください。 ③下記コードをそのまま使えば送信できます。 lineNoftify.php function send($lineNotifyToken, $lineMessage) { $query = http_build_query(['message' => $lineMessage]); $header = [ 'Content-Type: application/x-www-form-urlencoded', 'Authorization: Bearer ' . $lineNotifyToken, 'Content-Length: ' . strlen($query) ]; $ch = curl_init('https://notify-api.line.me/api/notify'); $options = [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $header, CURLOPT_POSTFIELDS => $query ]; curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); curl_setopt_array($ch, $options); // APIリクエスト $result = curl_exec($ch); $info = curl_getinfo($ch); // リクエスト結果取得 $errno = curl_errno($ch); $error = curl_error($ch); curl_close($ch); if (CURLE_OK !== $errno) { Log::error(); } return $result; } $lineNotifyToken = '〇〇〇〇〇〇〇〇';//こちらトークンを入れます。 $lineMessage = 'テスト' sendLineNotify($lineNotifyToken, $lineMessage);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む