- 投稿日:2020-04-04T22:22:24+09:00
【PHPメモ】(恐竜)プルダウンを生成する関数
1.はじめに
DBのSELECT結果でプルダウンを作成するコードを記述するのが面倒だ。
htmlタグの間にPHPを埋め込む、インデントがややこしい。
さらにコードの量が増えていく。
下記の画像は前に作った改良恐竜登録ツール(PHP+MYSQL版)の一部。
このハイブリッド選択のコードが結構、ぐちゃぐちゃになっていた。生成元タイプ1、生成元タイプ2はセレクト状態を維持するプルダウン、
生成元恐竜1と生成元恐竜2は、生成元タイプで選択した項目により変化するプルダウン。
上記のプルダウンを生成する関数を作って、共通プログラム(common_dino2.php)に置けば、効率的に開発が
進められるのではないか(開発とは言えないけど)
勉強もかねて作ってみた。2.選択状態を維持するプルダウンを生成する関数
common_dino2.php//$name_pulldown_type:プルダウンのname、$str_query0:SQL、$select_type0:プルダウンで選択されたタイプ function Make_pulldown_selectedType($db0,$name_pulldown_type,$str_query0,$select_type0) { $result_a=$db0->prepare($str_query0); $result_a->execute(); echo "<select name=\"$name_pulldown_type\" style=\"width: 100px\">"; while($data0=$result_a->fetch(PDO::FETCH_ASSOC)){ //$select_type0が$data0['type0']と等しい場合 if($select_type0 == $data0['type0']){ echo "<option selected>".$data0['type0']."</option>"; //$select_type0が$data0['type0']と等しくない場合 }else{ echo "<option>".$data0['type0']."</option>"; } } echo "</select><br>"; }3.生成元タイプで選択した項目により変化するプルダウン
common_dino2.php//$name_pulldown:プルダウンのname、$str_query0:SQL、$val1:str_query0のプレースホルダ function Make_pulldownDname($db0,$name_pulldown,$str_query0,$val1) { $result_a=$db0->prepare($str_query0); $result_a->bindparam(1,$val1); $result_a->execute(); echo "<select name=\"$name_pulldown\" style=\"width: 280px\">"; while($data0=$result_a->fetch(PDO::FETCH_ASSOC)){ echo "<option>".$data0['dname0']."</option>"; } echo "</select><br>"; }4.呼び出し元コード例
select_dinotype3.php//色々省略 <?php }else{ echo "<h1>ハイブリッド選択</h1>"; require "common_dino2.php"; $dbname="db_dino"; $dbh= NewPdo($dbname); $query_type0 = "SELECT DISTINCT type0 from tbl_dino Where type0 != 'unique'"; ?> <?php $stype1=isset($_POST['dtype01'])?htmlspecialchars($_POST['dtype01']):null; $stype2=isset($_POST['dtype02'])?htmlspecialchars($_POST['dtype02']):null; ?> <form action="select_dinotype3_mysql.php" method="post"> 生成元タイプ1: <?php Make_pulldown_selectedType($dbh,"dtype01",$query_type0,$stype1); ?> 生成元タイプ2: <?php Make_pulldown_selectedType($dbh,"dtype02",$query_type0,$stype2); ?> <input type="submit" value="タイプ確定"> </form> <?php $dbname="db_dino"; $dbh= NewPdo($dbname); $query_select_type0 = "SELECT dname0 from tbl_dino where type0 = ?"; ?> <form action="hibrid_dino2_mysql.php" method="post"> 生成元恐竜1: <?php Make_pulldownDname($dbh,"dname1",$query_select_type0,$stype1); ?> 生成元恐竜2: <?php Make_pulldownDname($dbh,"dname2",$query_select_type0,$stype2); ?> //色々な処理5.結果
(1).ハイブリッド選択時の画面
(2).ハイブリッド選択時の画面のソース
(3).生成元1タイプと生成元2タイプを選択時の画面
(4).生成元1タイプと生成元2タイプを選択時のソース
赤枠で選択されたタイプが、青枠では赤枠で選択されたタイプに属する恐竜名が表示されている。
- 投稿日:2020-04-04T19:05:00+09:00
curl を使っているPHP スクリプトで https がエラーになる件の解決方法
Moodle の管理をしていて、ハマった事項を解決したので共有します。
「言語パック」をクリックすると環境によってエラーになる問題です。
Moodle のダウンロードサイトから https 通信により curl コマンドで言語パックファイルをダウンロードしようとして、エラーになってしまうのです。AWSのインスタンスで、出たり出なかったりしました。プログラムの動作としては、curl コマンドを内部で実行しているのですが、デバッグ
してみたところ、lib/filelist.php で以下のように PHP の curl エラーになっています。[77] => 'CURLE_SSL_CACERT_BADFILE',要すれば、curl が俺が使うためのCACERTファイルがない、と文句を言っているようです。
以下のサイトから、最新の cacert.pem をダウンロードして、一連の CACERT の仲間に
加えてあげることで、直りました。
(リンク)
https://curl.haxx.se/docs/caextract.htmlたまに次の手順をやってあげる必要がありそうです。
- 上記リンクからダウンロードした最新の .pem ファイルを以下にコピー。
/etc/pki/ca-trust/source/anchors
- 次のコマンドを実行
# update-ca-trust
- サービスを再読み込み
# systemctl reload php-fpm # systemctl reload httpd(参考)
/etc/pki/ca-trust/source/README
(マニュアル)
man update-ca-trust
(PHP)
https://www.php.net/manual/ja/function.curl-errno.php
(関連)
https://stackoverflow.com/questions/23434792/php-curl-working-locally-error-77-on-aws-server
(近い)
https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b
- 投稿日:2020-04-04T17:24:19+09:00
Laravelで Target class [App\Http\Controllers\***] does not exist. エラー!
Laravel6 あるある言いたい
コピペでルーティングとコントローラを増やして、ついついやっちまうミス。
えぇ〜なんでぇ〜ってなります。以下を確認しよう!
1. コントローラのnamespaceのパスが違う。
コントローラのnamespaceが違うとClassを見つけられません。
パスがあっているか確認しよう。
これが一番あります。2. 複製したコントローラのエクステンドしているパスが違う
管理画面を作ったりすると、Contoller.phpとは別に管理画面用にBaseControllerのエクステンドを作っていたりする事あれば、そこも確認しよう。3. ルーティングのスペルミスかパスが違う
コントローラのパスとスペルミスを確認しよう。
artisan route:list でエラーがでなくなるまで、
web.phpのルーティングの記述を1行1行コメントアウトして、間違い箇所を特定しましょ。これくらいですね。
凡ミスで時間とられないように、気をつけましょ。
- 投稿日:2020-04-04T16:24:28+09:00
Laravelのユーザー登録を使って、カラムを増やした時のエラーの解決法
事象
SQLSTATE[HY000]: General error: 1364 Field 'path' doesn't have a default value (SQL: insert into
users
(name
,password
,updated_at
,created_at
) values (a, a@a, $2y$10$wb1DAgh21cDvXZd85w2tL.gbW2KocCLWhaAY/bArGB4JOAJhjI6r., 2020-04-04 07:19:22, 2020-04-04 07:19:22))というエラーが出た。
解決法
database.php の
'strict' => true,
の部分を
'strict' => false,
に変更する。
- 投稿日:2020-04-04T15:21:36+09:00
CKeditor4と画像アップロード(CKfinder使用しない)
行ったこと
- Cakephp にCKeditor4を適用
- 画像アップロードの処理をコントローラに書く
CKeditor適用
View(ctp)
ファイルcdn 経由で呼び出し
※Fullバージョンがおすすめです。<?= $this->Html->script('https://cdn.ckeditor.com/4.14.0/full/ckeditor.js') ?>※コントローラ指定
var url = '<?= $this->Url->build(['controller' => 'ImgUpload', 'action' => 'index']) ?>';var editor = CKEDITOR.replace('editor', { language: 'ja', toolbarCanCollapse: true, filebrowserUploadMethod: 'form', filebrowserUploadUrl: url, /* 上で指定したurl(変数) */ image_previewText: '画像アップロード', };ツールバーのオプションなどは今回省略します。
画像アップロード処理
上で指定した
ImgUploadController
の内容namespace App\Controller\Admin; use App\Controller\AppController; class ImgUploadController extends AppController { public function index() { if (isset($_FILES['upload']['name'])) { $uploaddir = WWW_ROOT; $file = $_FILES['upload']['tmp_name']; $file_name = $_FILES['upload']['name']; $file_name_array = explode(".", $file_name); $extension = end($file_name_array); $new_image_name = rand() . '.' . $extension; chmod($uploaddir.'/uploads', 0777); $allowed_extension = array("jpg", "gif", "png"); if (in_array($extension, $allowed_extension)) { move_uploaded_file($file, $uploaddir.'/uploads/'.$new_image_name); $function_number = $_GET['CKEditorFuncNum']; $url = '/uploads/'.$new_image_name; $message = ''; echo "<script type='text/javascript'>window.parent.CKEDITOR.tools.callFunction($function_number, '$url', '$message');</script>"; return; } } } }webroot ∟ uploads ∟ ここに画像ファイルが保存される参照サイト: https://www.webslesson.info/2019/01/uploading-image-in-ckeditor-with-php.html
- 投稿日:2020-04-04T14:10:34+09:00
CodeIgniterをLinuxサーバで使うときにつまづいたこと
はじめに
PHPのフレームワークのCodeIgniterをxamppの環境で使って開発を進めていてそろそろLinuxのサーバーにあげて開発を進めていこうとし、LinuxのサーバにあげたとたんにURLにアクセスしても繋がらくなり、1時間ほど悩まされこの記事の方法でやっと解決しました。
命名規則を守ろう
結論は命名規則を守ろう!!
xamppの環境で開発を進めている時には自分が使っているOSがWindowsでした。
ここのOSで部分が重要になってきます。
自分は、xamppの環境で開発を進めている時にcontrollersとmodelsの部分のフォルダの中身にあるファイルの先頭の文字を小文字で開発を進めていました。
しかし、ここのファイルを小文字で進めていたことに原因がありました。
そう、ファイル名は大文字から始めるということです。(ちゃんと公式のドキュメント読んどけばよかった)
先ほどもいいましたがOSが重要になってくるのはWindowsやMacはファイル名の大文字小文字を区別しないのですがLinuxではそこがちゃんと区別されるからでしょう。命名規則は守りましょう!!
おわりに
もう少しCodeIgniterの日本語のサイトがあってくれると嬉しいです(笑)
参考
- 投稿日:2020-04-04T13:15:37+09:00
PHPがない環境でEmacsでPSR2のflycheckを使用する
Dockerを使って開発している場合、Emacsエディタが動いている環境にPHPがインストールされていない場合もよくあると思います。
EmacsでPSR2のflycheckを使って文法チェックを動かすためには、phpcsコマンドが使える必要があるので、わざわざPHPからインストールするのかという問題が出てきます。それを避けるために、phpcsのDockerコンテナを使ってEmacsでflycheckを動かす方法を紹介します。
※ Docker等のインストールは完了していることが前提となります。
※ Docker化によるオーバーヘッド等の検証はまだ行っておりません。環境
Ubuntu: 18.04
Docker: 19.03
Emacs: 25.2セットアップ
以下の内容のファイルを作成します。
/usr/local/bin/phpcs#!/bin/bash docker run -i -v $(pwd):$(pwd) -w=$(pwd) --rm phpqa/phpcs $@実行権限を与えます。
chmod 755 /usr/local/bin/phpcs
動作確認します。
phpcs --version
これでEmacsが正しく設定されていればflycheckが正しく動作するようになるはずです。
参考
ここでは細かい.emacs側の設定はスキップしますが、参考までにこのようにflycheckを有効化しています。
.emacs(add-hook 'php-mode-hook '(lambda () (setq flycheck-phpcs-standard "PSR2") 'php-enable-psr2-coding-style )) (add-hook 'after-init-hook #'global-flycheck-mode)
- 投稿日:2020-04-04T04:28:21+09:00
PHP基本集(2)~フォーム作成~
【formタグ】
<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> //urlには階層を意識したファイル名でも可能 //methodのgetは送信される値がURLに表示され、postの場合はURLに表示されない </form>【inputタグ】
<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> Emailを入力してください <input type="text" name="email"> //name属性は入力された値の取得に使用され、データを受け取る時のキーとして使用する </form>入力値を受け取りたい場合
formタグに入力して送信したデータ内容を受け取る場合は、「$_POST」を使用する。
$_POST」は連想配列となっており、キーが「name属性の値」と値が「入力値」となる。<?php $_POST['email']; //['']には取得したいタグのname属性の値を入力する ?>【textareaタグ】
<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> 内容 <textarea name="content"></textarea> //改行を含む文章のためのテキストボックス </form>入力値を受け取りたい場合
選択したoptionタグのデータ内容を受け取る場合<?php $_POST['content']; //['']には取得したいタグのname属性の値を入力する ?>【送信ボタン】
<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> <input type="submit" value="送信"> //typeを「submit」とし、表示させる文字を「value」に記述する </form>【selectタグ・optionタグ】
<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> <select name="fruits"> //selectタグの中に選択肢となるoptionタグを記載する <option value="apple">りんご</option> //選択したoptionタグのvalue属性が送られる <option value="banana">ばなな</option> <option value="orange">おれんじ</option> </select> </form>入力値を受け取りたい場合
選択したoptionタグのデータ内容を受け取る場合<?php $_POST['fruits']; //['']には取得したいタグのname属性の値を入力する ?>【繰り返し処理と変数展開を用いて多数のoptionタグを作る】
<?php for($i = 1; $i =<3; $i++) { echo "<option value='{$i}'>{$i}</option>" } ?>【配列要素を繰り返し表示させる】
<?php $types = ['お問い合わせ', 'ご意見・ご要望', '採用に関するお問い合わせ', '取材・メディア関連のお問い合わせ', '料金に関するお問い合わせ', 'その他']; ?> <select name="category"> <option value="noSelect">選択してください</option> <?php foreach($types as $value) { //配列$typesに入れられた要素を$valueという名前で変数化 echo "<option value='{$value}'>{$value}</option>"; } ?> </select>今回はここまで
- 投稿日:2020-04-04T00:46:06+09:00
【Laravel】Herokuでのデプロイ
Herokuを利用して、Laravelのアプリのデプロイを行います。その一連の手順をメモします。
DBにはMySQLを利用したいので、その設定も行います。前提
・laravelアプリが作成済み
・Herokuアカウント取得済み
・Heroku CLI導入済み
・DBにはMySQLを利用します。Procfileの作成
まずはLaravel側の設定を行います。
ProcfileというHerokuの設定ファイルを作成。サーバーにApacheを使うこと、public/をドキュメントルートとすることを宣言するために使います。アプリフォルダの直下に作成してください。
Procfileweb: vendor/bin/heroku-php-apache2 public/DBの文字数の設定
Herokuではvarchar型の文字数はデフォルトの255では大きすぎるため191に設定します。
app\Providers\AppServiceProvider.phpのboot()に設定します。AppServiceProvider.appuse Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }アプリをhttpsに対応させる
本番環境の場合にhttpsを強制します。こちらもapp\Providers\AppServiceProvider.phpのboot()に設定します。
AppServiceProvider.apppublic function boot() { if (\App::environment('production')) { \URL::forceScheme('https'); } }Laravel側の設定は以上です。ほかにもあるとは思いますが、これらをしておけば少なくともデプロイには成功すると思います。
Herokuへのログイン
$ Heroku loginHerokuアプリの作成、デプロイ
Herokuアプリを作成します。
$ heroku create myapp –buildpack heroku/phpデプロイはGitを利用したHerokuアプリへのプッシュによって行います。
なのでまずHerokuアプリをリモートとして登録します。myappのところは先ほど作成したHerokuアプリを指定します。$ heroku git:remote -a myappこのHerokuリモートにプッシュしてデプロイします。変更点のコミットを忘れずにしましょう。
$ git add . $ git commit -m 'Add Procfile, varcher length, force https' $ git push heroku masterDBとしてMySQLを利用
HerokuはデフォルトのDBがPostgreSQLであるため、MySQLを使うためにはアドオン「ClearDB」を利用して設定を変更します。
ClearDBは利用自体は無料ですが、クレジットカードの登録が必要となります。Herokuのサイトから行うことができます。クレカの登録をしたら、下記コマンドでClearDBのインストールをします。
$ heroku addons:add cleardb環境変数の設定
アプリの環境変数は.envなどに定義しますが、それらはデプロイされません。したがって環境変数はHerokuアプリに定義する必要があります。
下記コマンドで設定ができます。
$ heroku config:set キー=値DBの環境設定
まずは自分のClearDBのURLを確認します。
$ heroku config:get CLEARDB_DATABASE_URL mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true各キー、値を登録します
$ heroku config:set DB_DATABASE=[データベース名] $ heroku config:set DB_HOST=[ホスト名] $ heroku config:set DB_USERNAME=[ユーザー名] $ heroku config:set DB_PASSWORD=[パスワード]その他の環境設定
$ heroku config:set APP_KEY=$(php artisan key:generate --show) $ heroku config:set APP NAME=myapp $ heroku config:set APP_ENV=herokuこのほかにもメールやapi等の各種環境変数もここで設定します。
マイグレーションの実行
$ heroku run php artisan migrate $ heroku openマイグレーションを実行し、成功したらサイトにアクセスしてみましょう。
下のようなエラーが出た場合、MySQLのvarchar型の文字数を変更がうまくいっていません。
Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
- 投稿日:2020-04-04T00:22:39+09:00
Mac Visual Studio Code 「Error spawning PHP: spawn ファイルパス EACCES」がウインドウ右下に出た話
目的
codeコマンドを用いてphpのファイルを開こうとした時に下記のエラーが出力されて修正した話をまとめる
エラーの内容
- これはPHPの実行ファイルパスのが見つからない時に出るエラーである。
- 設定されているパス先にPHPの実行ファイルがない事を表している。
- Homebrewで入れたPHPがVisual Studio Code側から見れていなかったため前日に自分で設定ファイルにパスを記載したところそのパスが間違えていた。
解決方法概要
- PHP実行ファイルのパスの取得
- PHP実行ファイルのパスをVisual Studio Codeの設定に記載
解決方法詳細
PHP実行ファイルのパスの取得
HomebrewでPHPを入れた方
下記コマンドを実行して
/usr/local/opt
に移動する$ cd /usr/local/optoptディレクトリ配下にphp@X.Xというシンボリックリンクがある事を確認する。(X.Xはバージョン名)
下記コマンドを実行してphp@X.X配下のbinディレクトリに移動する。
$ cd /usr/local/opt/php@X.X/binbinディレクトリ直下にphpファイルがある事を確認する。(下記の「>php*」の部分)
$ ls >pear* >peardev* >pecl* >phar@ -> phar.phar >phar.phar* >php* >php-cgi* >php-config* >phpdbg* >phpize*前述の確認により「>php*」の存在が確認された場合の実行ファイルのまでのパスは
/usr/local/opt/php@X.X/bin/php
となる。
PHP実行ファイルのパスをVisual Studio Codeの設定に記載
- Visual Studio Codeを開く
画面左上の「Code」をクリックする。
「基本設定」→「設定」をクリックする。
設定画面が開く
設定の検索に「Associations」と入力する。
赤矢印が指している「settings.jsonで編集」をクリックする。
下記のような.jsonのファイルが開く。(本ファイルの記載内容は各個人で異なる。今はファイルが開く事を確認する。)
開いた.jsonファイルにphp.executablePathの記載があるか確認する。
下記の内容を開いているsettings.jsonファイルに記載する。(X.XはHomebrewでインストールしたみなさんのPHPのバージョンを記載する。)
settings.json"php.executablePath": "/usr/local/opt/php@X.X/bin/php" //"php.executablePath": "PHP実行ファイルのパスの取得"筆者は間違えたphp.executablePathの記載があったためコメントアウトした上で正しいパスを記載する。
settings.jsonファイルを閉じてVisual Studio Code本体も再起動する。
codeコマンドをもちいてPHPのファイルを開いてエラーが出ない事を確認する。