20220112のPHPに関する記事は11件です。

myAssignとは

こんなコードがあった! sample.php $menuAry = $this->getMenuForAPI(); myAssign('menuAry',$menuAry); // Smartyにアサイン 上から読んでみよう! ◆$menuAry 変数名だね! ◆$this Refers to current object …よくわからん?わすれた。 ◆-> …アロー演算子というらしい ◆getMenuForAPI() とりあえずAPIだね! ◆myAssign SmartyにAssignする 次画面持越し変数にセットする …画面で使るようにするのか? つまりどういうことだってばよ  ・getMenuAPIの返却値を$menuAryに格納  ・$menuAryの値を変数menuAry(Smartyとしての変数名の方)として定義を追加する なので… Smartyとしての変数を定義したい場合に使う関数 ということかな?!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

配列に値を追加する複数の方法

配列に値を追加するにはいくつかあるらしい。 あとでかく
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

$thisってなんぞ?

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

コメントアウトの@return voidってなんぞ

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

blastengineを使ってPHPでメールを送信する

blastengineはシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先に届くようになります。 今回はblastengineを使ってPHPでメール送信を行うまでの流れを解説します。 ユーザ登録する blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします(ユーザIDは後で使います)。 送信元ドメインのSPFを設定する 送信元として利用するドメイン(自分で持っているもの)の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。 txt @ v=spf1 include:spf.besender.jp ~all API経由で配信する まずはAPIを使ってHTMLメールを配信する流れを紹介します。 APIキーを取得する ログイン後、管理画面の右上にある設定メニューに移動します。 そして設定の中で、APIキーを取得します。 必要な変数を取得 今回はターミナル(コマンドプロンプト)から実行します。その際にユーザIDとAPIキーを渡す仕組みにしますので、スクリプト側で入力値を受け取ります。また、両方とも必須なので、入力がなかったらエラーとします。 $user_id = getenv("BE_USERID"); $api_key = getenv("BE_APIKEY"); if ($user_id === false) { echo "ユーザIDは必須です"; exit; } if ($api_key === false) { echo "APIキーは必須です"; exit; } トークンを生成する APIリクエストするためのトークンを生成します。手順としては次のとおりです。 ユーザIDとAPIキーを連結する SHA256のハッシュを生成する ハッシュを全て小文字にする 3の文字列をBASE64エンコードする 実際のコードで言うと、次のようになります。 $token がトークンです。 // トークン生成 $str = "$user_id$api_key"; $token = base64_encode(strtolower(hash('sha256', $str))); APIリクエストする では実際にメールを送信します。APIのエンドポイントは https://app.engn.jp/api/v1/deliveries/transaction になります。生成したトークンは Authorization ヘッダーに適用します。fromのemailやtoなど、メールアドレスは利用されるものに書き換えてください。 // APIエンドポイント $url = 'https://app.engn.jp/api/v1/deliveries/transaction'; // POSTデータ $data = [ "from" => [ "email" => "sample@example.jp", "name" => "送信者サンプル" ], "to" => "to@example.com", "subject" => "テスト件名", "encode" => "ISO-2022-JP", "text_part" => "テスト配信", "html_part" => "<!DOCTYPE html><html><header></header><body>sample html</body></html>" ]; $data = json_encode($data); // ヘッダー $header = [ "Content-Type: application/json", "Authorization: Bearer $token" ]; // リクエスト内容を組み立て $context = [ "http" => [ "method" => "POST", "header" => implode("\r\n", $header), "content" => $data ] ]; // APIリクエスト $res = file_get_contents($url, false, stream_context_create($context)); 結果 レスポンスを出力します。配信ID(delivery_id)は照会、変更および削除操作に必要です。 echo $res; // { delivery_id: 9 } 実行する では実際にターミナル、またはコマンドプロンプトから実行してみます。 YOUR_USER_ID と YOUR_API_KEY はそれぞれ皆さんのものに置き換えてください。 $ BE_USERID=YOUR_USER_ID BE_APIKEY=YOUR_API_KEY php api.php { delivery_id: 9 } 全体のコード 今回のサンプルコードは次のようになります。実装時の参考にしてください。 <?php $user_id = getenv("BE_USERID"); $api_key = getenv("BE_APIKEY"); if ($user_id === false) { echo "ユーザIDは必須です"; exit; } if ($api_key === false) { echo "APIキーは必須です"; exit; } // トークン生成 $str = "$user_id$api_key"; $token = base64_encode(strtolower(hash('sha256', $str))); // APIエンドポイント $url = 'https://app.engn.jp/api/v1/deliveries/transaction'; // POSTデータ $data = [ "from" => [ "email" => "sample@example.jp", "name" => "送信者サンプル" ], "to" => "to@example.com", "subject" => "テスト件名", "encode" => "ISO-2022-JP", "text_part" => "テスト配信", "html_part" => "<!DOCTYPE html><html><header></header><body>sample html</body></html>" ]; $data = json_encode($data); // ヘッダー $header = [ "Content-Type: application/json", "Authorization: Bearer $token" ]; // リクエスト内容を組み立て $context = [ "http" => [ "method" => "POST", "header" => implode("\r\n", $header), "content" => $data ] ]; // APIリクエスト $res = file_get_contents($url, false, stream_context_create($context)); // 結果の出力 echo $res; SMTPリレーでの配信 次にSMTPリレーを使った方式です。 IPアドレスの登録 SMTPリレーを利用する場合、まず接続元サーバのIPアドレスを管理画面で登録する必要があります。 IPアドレスの設定ダイアログで、接続元サーバのIPアドレスを入力してください。 Postfixの編集 ネットで検索してよく出てくるphp.iniのSMTPサーバ設定はWindows向きの設定になります。恐らくLinuxサーバを利用するケースの方が多いが、php.iniの編集ではないので注意してください。Linuxの場合はPostfixを利用して配信します。この場合、/etc/postfix/main.cf を編集します。 下記1行を追加して保存します。blastengineのSMTPサーバアドレスは smtp.engn.jp 固定になります。ポート番号は25/587/2525より選択してください。 relayhost = smtp.engn.jp:587 Postfixが起動していない場合は起動してください。起動している場合には再起動が必要です。 $ sudo postfix start // または $ sudo postfix restart メール配信する PHPで一番手軽に使えるメール配信用関数mb_send_mailを使います。mb_send_mailは配信完了するとtrue、失敗するとfalseを返します。 <?php // 宛先 $to = "sample@example.jp"; // 件名 $subject = "HTMLメール"; // HTML文 $message = "<html><body><h1>これはHTMLメールです</h1></body></html>"; // From $headers = "From: from@example.com"; $headers .= "\r\n"; // HTMLメールの場合必要 $headers .= "Content-type: text/html; charset=UTF-8"; // 送信 mb_send_mail($to, $subject, $message, $headers); まとめ クラウドサービスではSMTPポートが塞がれている場合があるので、そうした時にはAPI経由を利用してください。SMTPリレーを使えば、より信頼性高く、安定した配信が実現できるでしょう。 APIとSMTPリレー、それぞれの要件に合わせて最適な方を選択してください。 エンジニア向けメール配信システム「ブラストエンジン」
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

1054 unknown column 'email in 'field list'はこれで解決した

今やっていること Laravel6を使って簡単な掲示板機能の作成中。 最初の新規登録でつまりました。 表示されたエラー SQLSTATE[42S22]: Column not found: 1054 Unknown column 'email' in 'field list' このエラーの解決方法はいろんな記事で読みましたが、イマイチ解決できず。 新規登録の機能を実装しているRegisterControllerを見直してみました。 解決方法 RegisterController.php public function register(Request $request){ if($request->isMethod('post')){ $data = $request->input(); $validator = Validator::make($data,[ 'username' => 'required|max:30', 'email' => 'required|max:100|email:rfc,dns|unique:users,mail', 'password' => 'required|min:8|max:30|confirmed', 'password_confirmation' => 'required|min:8|max:30', ]); if($validator->fails()){ return redirect('/register') ->withErrors($validator) ->withInput(); } else { $this->create($data); return redirect('added'); } } return view('auth.register'); } 新規登録後、「登録ありがとうございます」と表示されている画面へ移行するように書いています。 これは以前作っていたSNS開発のコードをそのままコピーして改変していたのですが、ここの部分 RegisterController.php 'email' => 'required|max:100|email:rfc,dns|unique:users,mail', MySQLのテーブルは、"email"という名前でしたので、uniqueのカラム名を変えていないことが原因でした。 本当にしょうもないミス? RegisterController.php 'email' => 'required|max:100|email:rfc,dns|unique:users,email', これで問題なくDBに登録ができました?? まとめ 以前のコードをコピーするときはDB名を見直そう!(当たり前) バリデーションの登録が原因であることはあまり書かれている記事を見かけなかったので記事にしてみました。すぐにエラーの原因が見つかってよかったです!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

sendgrid php で smtp 送信 ライブラリ無しでもOK

今回は cakeemail を使用。 メールサーバーってマジで不安定だから大変。 しかも最近はAPI送信とかになっているからsmtpの送信方法が無くて困る。 以下の方法ならアカウントを設定するだけだから ライブラリとか必要無しで送信できるので便利。 ということで早速方法。 sendgridを利用 まずはメールの設定です public $default = array( 'host' => 'smtp.sendgrid.net',//固定 'port' => 587,//固定 'transport' => 'Smtp',//固定 'username' => 'apikey', //固定 'password' => 'SG.Uxxxxxxxxxxx229',//要変更 パスワード 'from' => 'you@localhost',//任意 ); こんな感じで固定って書いてあるのは sendgrid の規則に従って書いてください。 たったこれだけで送信できるようになる。 また、接続元のIPアドレスを sendgrid側で制限をしている場合は、 一度メールを送信して、エラーになるとIPが sendgrid に表示されるので、それを allow して送信許可して再度送信してみる。 すると送信できるようなる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Slim4 に dotenv と migration の機能を追加していい感じにする

環境 Slim4 (Skelton じゃない方だが、どっちでも行けそう?) PHP7.4 (or later) MySQL5.7 (MariaDB) dotenv ライブラリ: vlucas/phpdotenv@5.4.1 マイグレーションライブラリ: robmorgan/phinx@0.12.9 dotenv ライブラリの準備 PHP 向けの dotenv ライブラリは2種類くらいメジャーなのがあるが、今回は vlucas/phpdotenv を採用した。 インストール composer require vlucas/phpdotenv 設定ファイル作成 touch .env 自分の環境に合わせて、設定内容を書く。 /.env DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=database DB_USERNAME=username DB_PASSWORD=password DB_CHARSET=utf8 マイグレーションライブラリの準備 マイグレーションのライブラリも有名なものはいくつかあると思うが、今回は phinx を採用した。 インストール composer require robmorgan/phinx 設定ファイル作成 まず以下のコマンドで設定ファイル phinx.php を生成する。 vendor/bin/phinx init . 次に、中身を書き換える。 初期状態では配列をリターンしているだけになっているので、先頭で dotenv を読み込ませる。 phinx.php <?php $dot_env = __DIR__. '/.env'; if (is_readable($dot_env)) { $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); } 続けて、配列の中身を書き換える。 phinx.php return [ 'paths' => [ ... ], 'environments' => [ 'default_migration_table' => 'phinxlog', 'default_environment' => 'production', 'production' => [ 'adapter' => 'mysql', 'host' => $_ENV['DB_HOST'] ?? 'localhost', 'name' => $_ENV['DB_DATABASE'] ?? 'production_db', 'user' => $_ENV['DB_USERNAME'] ?? 'root', 'pass' => $_ENV['DB_PASSWORD'] ?? '', 'port' => $_ENV['DB_PORT'] ?? '3306', 'charset' => $_ENV['DB_CHARSET'] ?? 'utf8', ], 'development' => [ 'adapter' => 'mysql', 'host' => $_ENV['DB_HOST'] ?? 'localhost', 'name' => $_ENV['DB_DATABASE'] ?? 'development_db', 'user' => $_ENV['DB_USERNAME'] ?? 'root', 'pass' => $_ENV['DB_PASSWORD'] ?? '', 'port' => $_ENV['DB_PORT'] ?? '3306', 'charset' => $_ENV['DB_CHARSET'] ?? 'utf8', ], 'testing' => [ ... ] ], ... ]; DB の設定は dotenv で設定するので、production/development と分けなくても良いケースもあるので、不要であれば development の配列を丸ごと削除しても良いかも。 また、今回は dotenv を利用したが、サーバで環境変数を設定できるのであれば、先頭部分を削除し $_ENV のところを $_SERVER に変えるだけで済むと思う。 それでは良き Slim ライフを。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DQLで日付関数とGROUP BY

DQLでDATEカラムをGROUP BYする方法がわからなかったので調べた DoctrineExtensionを入れる https://github.com/beberlei/DoctrineExtensions でSQLの関数を追加 composer require beberlei/doctrineextensions configs/packages/doctrine.yamlに追加 doctrine: orm: dql: string_functions: MONTH: DoctrineExtensions\Query\Mysql\Month YEAR: DoctrineExtensions\Query\Mysql\Year DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat QueryBuilder 例えばNewsPostエンティティで記事がある年を取得する NewsPostRepository $qb = $this->createQueryBuilder('post') ->select('YEAR(post.post_date) AS year') ->groupBy('year') ->orderBy('post.post_date', 'DESC') ; // array( // array( // 'year' => 2022 // ), // array( // 'year' => 2021 // ) // ) Group By 節に直接日付関数は使えない模様 $qb->groupBy('YEAR(post.post_date)'); とした時 [Semantical Error] line 0, col 59 near 'YEAR(post.post_date)': Error: Cannot group by undefined identification or result variable. というエラーが出る。 select()で明示的に取得カラムにエイリアスをつけて、エイリアスでGroupByする様だ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者が解く】Windows10環境でLaravel sailインストールのエラーが起きる時

初心者の自分なりに解決方法を見つけたので、メモ用として記載しておきます。 OS: Windows10 にてエラーを確認(macは持っていないので同様の処理でうまくいくかは不明です。) 症状 インストール時に下記のエラー表記が出る failed to solve: rpc error: code = Unknown desc = executor failed running [/bin/sh -c apt-get update && apt-get install -y gnupg gosu curl ca-cer tificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 && mkdir -p ~/.gnupg && chmod 600 ~/.gnupg && echo "disable-ipv 6" >> ~/.gnupg/dirmngr.conf && apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E5267A6C && apt-key adv - -homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C300EE8C && echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu hirsute main" > /etc/apt/sources.list.d/ppa_ondrej_php.list && apt-get update && apt-get install -y php8.1-cli php8.1-dev php8.1-pgsql php8.1- sqlite3 php8.1-gd php8.1-curl php8.1-imap php8.1-mysql php8.1-mbstring php8.1-xml php8.1-zip php8.1-bcmath php8.1-soap ph p8.1-intl php8.1-readline php8.1-ldap php8.1-msgpack php8.1-igbinary php8.1-redis php8.1-swoole php8.1-memcached php8.1-pcov php 8.1-xdebug && php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer && curl -sL https:/ /deb.nodesource.com/setup_$NODE_VERSION.x | bash - && apt-get install -y nodejs && npm install -g npm && curl -sS https://dl.yarnpkg.com/ debian/pubkey.gpg | apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list && apt-get upd ate && apt-get install -y yarn && apt-get install -y mysql-client && apt-get install -y postgresql-client && apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*]: exit code: 100 対策 ターミナルにて下記を実施 "docker-compose build --no-cache" この間でエラー起きて止まる可能性がある、自分は[8/11]の時にエラー吐いて止まった。 ./vendor/bin/sail up -d エラー起きて止まっても上記を実施。 Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them [+] Running 10/10 ⠿ Network mybbs_sail Created 0.9s ⠿ Volume "mybbs_sailredis" Created 0.0s ⠿ Volume "mybbs_sailmeilisearch" Created 0.0s ⠿ Volume "mybbs_sailmysql" Created 0.0s ⠿ Container mybbs_meilisearch_1 Started 4.0s ⠿ Container mybbs_selenium_1 Started 3.6s ⠿ Container mybbs_mysql_1 Started 4.5s ⠿ Container mybbs_redis_1 Started 3.6s ⠿ Container mybbs_mailhog_1 Started 4.8s ⠿ Container mybbs_laravel.test_1 Started 上のような表記が出れば処理は完了しています。 最後に 下記にアクセスしLaravelの公式サイトが表示されれば完了 http://localhost:8573/ ※正直まだまだDockerの事が詳しくないので分からない事だらけですが、Youtubeや学習サイト等でチュートリアル形式の動画で 環境構築の練習をしている際にも言語問わずエラーが出まくるので、Docker嫌いになりそうです・・・。 機能面では優れものだと分かっているのですが、そこに到達するまでが鬼畜過ぎます。やっぱりMacの方が使いやすいのかな?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mysqlで躓いた時 確認するよ

Mysqlの学習で躓いた時に見ていたサイト達です お世話になりました。 Mysqlのインストール手順から初期設定まで 参考サイト: https://webkaru.net/mysql/windows-env/ ターミナルにてSQL文の発行 参考サイト:https://webkaru.net/mysql/windows-sql-query/ 【エラー】 PATHが通っていない時 参考サイト: https://nichi-petit.com/entry/path-error ※見つけ次第追記していきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む