20200404のPHPに関する記事は10件です。

【PHPメモ】(恐竜)プルダウンを生成する関数

1.はじめに

DBのSELECT結果でプルダウンを作成するコードを記述するのが面倒だ。
htmlタグの間にPHPを埋め込む、インデントがややこしい。
さらにコードの量が増えていく。
下記の画像は前に作った改良恐竜登録ツール(PHP+MYSQL版)の一部。
このハイブリッド選択のコードが結構、ぐちゃぐちゃになっていた。

select_dino_mysql2.jpg

生成元タイプ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).ハイブリッド選択時の画面

pulldown_beforeselect_img.jpg

(2).ハイブリッド選択時の画面のソース

pulldown_beforeselect.jpg

(3).生成元1タイプと生成元2タイプを選択時の画面

pulldown_afterselect_img.jpg

(4).生成元1タイプと生成元2タイプを選択時のソース

pulldown_afterselect.jpg

赤枠で選択されたタイプが、青枠では赤枠で選択されたタイプに属する恐竜名が表示されている。

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

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

たまに次の手順をやってあげる必要がありそうです。

  1. 上記リンクからダウンロードした最新の .pem ファイルを以下にコピー。

/etc/pki/ca-trust/source/anchors

  1. 次のコマンドを実行
  # update-ca-trust
  1. サービスを再読み込み
 # 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

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

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行コメントアウトして、間違い箇所を特定しましょ。

これくらいですね。
凡ミスで時間とられないように、気をつけましょ。

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

Laravelのユーザー登録を使って、カラムを増やした時のエラーの解決法

事象

Laravelでユーザーのカラムを増やそうとした時に
スクリーンショット 2020-04-04 16.20.06.png

SQLSTATE[HY000]: General error: 1364 Field 'path' doesn't have a default value (SQL: insert into users (name, email, 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,
に変更する。

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

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

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

CodeIgniterをLinuxサーバで使うときにつまづいたこと

はじめに

PHPのフレームワークのCodeIgniterをxamppの環境で使って開発を進めていてそろそろLinuxのサーバーにあげて開発を進めていこうとし、LinuxのサーバにあげたとたんにURLにアクセスしても繋がらくなり、1時間ほど悩まされこの記事の方法でやっと解決しました。

命名規則を守ろう

結論は命名規則を守ろう!!

xamppの環境で開発を進めている時には自分が使っているOSがWindowsでした。
ここのOSで部分が重要になってきます。
自分は、xamppの環境で開発を進めている時にcontrollersとmodelsの部分のフォルダの中身にあるファイルの先頭の文字を小文字で開発を進めていました。
しかし、ここのファイルを小文字で進めていたことに原因がありました。
そう、ファイル名は大文字から始めるということです。(ちゃんと公式のドキュメント読んどけばよかった)
先ほどもいいましたがOSが重要になってくるのはWindowsやMacはファイル名の大文字小文字を区別しないのですがLinuxではそこがちゃんと区別されるからでしょう。

命名規則は守りましょう!!

おわりに

もう少しCodeIgniterの日本語のサイトがあってくれると嬉しいです(笑)

参考

PHP スタイルガイド — CodeIgniter 3.2.0-dev ドキュメント

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

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)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP基本集(2)~フォーム作成~

【formタグ】 

<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> 
//urlには階層を意識したファイル名でも可能
//methodのgetは送信される値がURLに表示され、postの場合はURLに表示されない
</form>

【inputタグ】

スクリーンショット 2020-04-04 3.51.39.png

<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> 
  Emailを入力してください
  <input type="text" name="email">  //name属性は入力された値の取得に使用され、データを受け取る時のキーとして使用する
</form>

入力値を受け取りたい場合
formタグに入力して送信したデータ内容を受け取る場合は、「$_POST」を使用する。
$_POST」は連想配列となっており、キーが「name属性の値」値が「入力値」となる。

<?php
  $_POST['email'];  //['']には取得したいタグのname属性の値を入力する
?>

【textareaタグ】

スクリーンショット 2020-04-04 3.54.23.png

<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> 
  内容
  <textarea name="content"></textarea> //改行を含む文章のためのテキストボックス
</form>

入力値を受け取りたい場合
選択したoptionタグのデータ内容を受け取る場合

<?php
  $_POST['content'];  //['']には取得したいタグのname属性の値を入力する
?>

【送信ボタン】

スクリーンショット 2020-04-04 3.57.36.png

<form action="(urlを入力する)" method="(postもしくはgetを入力する)"> 
  <input type="submit" value="送信">  //typeを「submit」とし、表示させる文字を「value」に記述する  
</form>

【selectタグ・optionタグ】

スクリーンショット 2020-04-04 4.07.18.png

<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タグを作る】

スクリーンショット 2020-04-04 4.16.39.png

<?php
  for($i = 1; $i =<3; $i++) {
    echo "<option value='{$i}'>{$i}</option>"
  }
?>

【配列要素を繰り返し表示させる】

スクリーンショット 2020-04-04 4.22.22.png

<?php 
  $types = ['お問い合わせ', 'ご意見・ご要望', '採用に関するお問い合わせ', '取材・メディア関連のお問い合わせ', '料金に関するお問い合わせ', 'その他'];
?>

  <select name="category">
    <option value="noSelect">選択してください</option>
    <?php
      foreach($types as $value) { //配列$typesに入れられた要素を$valueという名前で変数化
        echo "<option value='{$value}'>{$value}</option>";
      }
    ?>
 </select>

今回はここまで:santa:

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

【Laravel】Herokuでのデプロイ

Herokuを利用して、Laravelのアプリのデプロイを行います。その一連の手順をメモします。
DBにはMySQLを利用したいので、その設定も行います。

前提

・laravelアプリが作成済み
・Herokuアカウント取得済み
・Heroku CLI導入済み
・DBにはMySQLを利用します。

Procfileの作成

まずはLaravel側の設定を行います。

ProcfileというHerokuの設定ファイルを作成。サーバーにApacheを使うこと、public/をドキュメントルートとすることを宣言するために使います。アプリフォルダの直下に作成してください。

Procfile
web: vendor/bin/heroku-php-apache2 public/

DBの文字数の設定

Herokuではvarchar型の文字数はデフォルトの255では大きすぎるため191に設定します。
app\Providers\AppServiceProvider.phpのboot()に設定します。

AppServiceProvider.app
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

アプリをhttpsに対応させる

本番環境の場合にhttpsを強制します。こちらもapp\Providers\AppServiceProvider.phpのboot()に設定します。

AppServiceProvider.app
public function boot()
{
    if (\App::environment('production')) {
      \URL::forceScheme('https');
  }
}    

Laravel側の設定は以上です。ほかにもあるとは思いますが、これらをしておけば少なくともデプロイには成功すると思います。

Herokuへのログイン

$ Heroku login

Herokuアプリの作成、デプロイ

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 master

DBとして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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac Visual Studio Code 「Error spawning PHP: spawn ファイルパス EACCES」がウインドウ右下に出た話

目的

  • codeコマンドを用いてphpのファイルを開こうとした時に下記のエラーが出力されて修正した話をまとめる

    • エラー文: Error spawning PHP: spawn /usr/local/opt/php@7.4 EACCES

      スクリーンショット 2020-03-17 9.11.25.png

エラーの内容

  • これはPHPの実行ファイルパスのが見つからない時に出るエラーである。
  • 設定されているパス先にPHPの実行ファイルがない事を表している。
  • Homebrewで入れたPHPがVisual Studio Code側から見れていなかったため前日に自分で設定ファイルにパスを記載したところそのパスが間違えていた。

解決方法概要

  1. PHP実行ファイルのパスの取得
  2. PHP実行ファイルのパスをVisual Studio Codeの設定に記載

解決方法詳細

  1. PHP実行ファイルのパスの取得

    • HomebrewでPHPを入れた方

      1. 下記コマンドを実行して/usr/local/optに移動する

        $ cd /usr/local/opt
        
      2. optディレクトリ配下にphp@X.Xというシンボリックリンクがある事を確認する。(X.Xはバージョン名)

      3. 下記コマンドを実行してphp@X.X配下のbinディレクトリに移動する。

        $ cd /usr/local/opt/php@X.X/bin
        
      4. binディレクトリ直下にphpファイルがある事を確認する。(下記の「>php*」の部分)

        $ ls
        >pear*
        >peardev*
        >pecl*
        >phar@ -> phar.phar
        >phar.phar*
        >php*
        >php-cgi*
        >php-config*
        >phpdbg*
        >phpize*
        
      5. 前述の確認により「>php*」の存在が確認された場合の実行ファイルのまでのパスは/usr/local/opt/php@X.X/bin/phpとなる。
        スクリーンショット 2020-03-17 9.57.23.png

  2. PHP実行ファイルのパスをVisual Studio Codeの設定に記載

    1. Visual Studio Codeを開く
    2. 画面左上の「Code」をクリックする。

      Menubar_と_Visual_Studio_Code.png

    3. 「基本設定」→「設定」をクリックする。

      スクリーンショット 2020-03-17 9.48.25.png

    4. 設定画面が開く

      スクリーンショット 2020-03-17 9.49.24.png

    5. 設定の検索に「Associations」と入力する。

    6. 赤矢印が指している「settings.jsonで編集」をクリックする。

      設定.png

    7. 下記のような.jsonのファイルが開く。(本ファイルの記載内容は各個人で異なる。今はファイルが開く事を確認する。)

      スクリーンショット 2020-03-17 9.57.23.png

    8. 開いた.jsonファイルにphp.executablePathの記載があるか確認する。

      • 記載があった方

        1. すでに記載のある"php.executablePath": "ファイルパス"の前に//を記載してコメントアウトする。

          スクリーンショット 2020-03-17 9.58.31.png

      • 記載はない方でphp.executablePath意外の記載がある方

        1. すでにある記載の最後に,を追記しておく。

          Menubar_と_settings_json.png

      • 一記載はない方

        1. 次の手順で正しいパスを追記する。
    9. 下記の内容を開いているsettings.jsonファイルに記載する。(X.XはHomebrewでインストールしたみなさんのPHPのバージョンを記載する。)

      settings.json
      "php.executablePath": "/usr/local/opt/php@X.X/bin/php"
      //"php.executablePath": "PHP実行ファイルのパスの取得"
      
    10. 筆者は間違えたphp.executablePathの記載があったためコメントアウトした上で正しいパスを記載する。

      スクリーンショット 2020-03-17 10.21.17.png

    11. settings.jsonファイルを閉じてVisual Studio Code本体も再起動する。

    12. codeコマンドをもちいてPHPのファイルを開いてエラーが出ない事を確認する。

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