20200527のPHPに関する記事は8件です。

SQLで複数テーブルをDELETEする方法

ユーザーアカウント削除時に削除されたアカウントの投稿内容も一緒に削除したい。
そんな時に使用したコードです。

それぞれのテーブルが以下となります。

users
id name
1 鈴木
2 山田
3 佐藤

posts
id user_id message
1 2 こんにちは
2 1   おはよう
3 3   こんばんは

実際のSQL文は以下になります。
DELETE users,posts FROM users LEFT JOIN posts ON users.id = posts.user_id WHERE users.id=?'

コードの読み下し文としては
削除対象のテーブルはusersとposts、usersのidとpostsのuser_idが一致したものを結合。
結合した後のデーターにてusersのidが後程代入された値と同じものを削除して下さい、となる。

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

Xamppでポート競合を防ぐ方法

Xamppでポート競合を防ぐ方法をご紹介します。

作業環境

OS:Windows 10
エディション:HOME
バージョン:2004
Xampp:バージョン7.4.6

※Xamppのインストール方法はこちらで解説しています。
【環境構築】Windows10にXAMMPをインストールする方法

ポートとは

ポートはよく「扉(ドア)」に例えられるます。
IPアドレスが住所「家」であれば、ポートは外に出る・外から入る「扉(ドア)」に該当します。

多くのホームページでインターネットはIPアドレスで通信を行っていると記載されていますが、実際には「IPアドレス+ポート番号」で通信を行っています。

引用元:用語集 「ポート(PORT)とは?」

Xamppでポート競合が起こる原因

1つのプログラムにつきポートは1個しか利用できない仕組みとなっているので、Xamppが他のプログラムと同じポートを使っていると競合が起きて、Xamppが利用できなくなります。

そこでXamppで利用するポートを変更することで、競合を防ぎます。

Xamppで利用するポートを変更する

202005262238.png
Xamppのデフォルトでは、Apacheは80番と443番、MySQLは3306番のポートをそれぞれ利用しています。80番はHTTPプロトコル、つまりホームページを閲覧するときに使われるものなので、様々なソフトで利用されていて競合の原因になります。このポート番号を変更します。

①Apacheのポート番号を変更する

202005262254.png
ApacheやMySQLなどを起動している場合は全部停止して、「Config」を押します。
202005271509.png
「Service and Port Settings」を押します。
202005271514.png
この画面が起動するので、「Main Port」の番号を任意の数字に変更します。ここでは「8888」と設定しました。変更したら「Save」のボタンを押して画面を閉じます。

※エラーが起きた場合

私の環境下では、以下のエラーが出てきました。
202005271517.png

Error:Cannot create file "C:\xampp\xampp-control.ini"
アクセスが拒否されました。

書き込み権限がないようなので、管理者権限で実行してみます。
202005271536.png
「XAMPP Control Panel」で右クリックをして「その他」→「管理者として実行」を押して、管理者権限で実行するとエラーが解消しました。

②Apache(httpd.conf)を変更する

202005271543.png
Apacheの右の「Config」→「Apache(httpd.conf)」を選びます。
202005271548.png
「httpd.conf」がメモ帳で開くので、「編集」→「検索」を選びます。
202005271553.png
「Listen」と検索をし、「Listen 80」とポート番号が書いてあるので、ここも先程と同じ番号に変更をします。ここでは「Listen 8888」としました。変更が終わったら、保存してメモ帳を閉じます。
※管理者権限で実行している場合は、ここまでできたら一度Xamppを終了して、再度、通常通りに起動してください。

③動作確認

202005271602.png
「Apache」と「MySQL」をそれぞれ「Start」ボタンを押して起動すると、ポート番号の表示が変わっています。
202005271604.png
「Apache」の右の「admin」のボタンを押します。
202005271605.png
上のような画面が開いたら、ポート番号の変更は完了です。

参考サイト

用語集 「ポート(PORT)とは?」

XAMPPでインストールしたApacheが起動しないとき

php.iniファイルの確認と修正

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

【Git】Gitの使い方を考えてみた

はじめに

この記事では
バージョン管理システムのGitを
職場で使うことを想定して
Gitの使い方についてまとめた記事です。

ベストプラクティスや間違いがあれば
それなりに良い方法で書き直していきます。


ベテランでもGitが扱えるとは限らないらしい

とある人に聞いたところによると
デキる技術者でも案外、
変更履歴のステージングやアド、コミットができないということらしい。
筆者は去年ぐらいからGitをプライベートで使い始めた一般の誤家庭の人

今度、新人君が配属されるということなので
彼にはちゃんと基本コマンドを覚えてもらいたいというオモイと
ちゃんとコードレビューできる体制と育てる環境を確立するという目標がある。

そうしたオモイや目標を実現させるためにGitの基本コマンドについてまとめてみました。
実際に職場に導入してもいないので
いざ使ってみるとこれもあれも必要となるかもしれないけど
とりあえず基本はおさえようというスタンス。


想定される環境

客先常駐
リモートリポジトリ環境なし
GitHub使用不可
Windows10 Pro 64bit
Git 2.26.2.windows.1


想定される利用者

研修中のエンジニア(例えば、業務未経験者など)
初学者を教えるベテラン、中堅エンジニア

何を管理するか

ソースコード
たとえば
・TeraTermLanguage
・HTML
・JavaScript
・PHP


初期設定

GitHubは使わない(使えない)けど
これがないと誰が何をしたかわからないので
最初に確認しておく。
user.nameは
PCの端末名と自分の名前をローマ字で入れておけばOK

mailaddressは会社のメールアドレスか
個人あてのメールアドレスがないなら
所属しているグループのアドレスがいいだろう。

$ git config --global user.name [username]
$ git config --global [mailaddress]

最初に教えるべきコマンド

最初からブランチ切るのは難易度高いと思うので
手堅いところから教えていく

$ git init
$ git add -a
$ git status
$ git commit -am "命令系のコメント"

リポジトリの初期化は知っておかないと何事も始まらないだろう。

git add については -a と .(ドット)の違いについて
聞かれるかもしれないのであらかじめ考えておく

変更したかどうか知りたいこともあるだろう
そういうときのために
git statusコマンドを新人に叩き込んでおく

「先輩!どれ変更したかわかりません」と言われて対応するのは
正直なところ大変だ。
初回ならば何の問題もないかもしれないがことあるごとに
やられたら死ぬ。間違いなく死ぬ。

そして、最後にcommit
これもオプションについて聞かれるかもしれない。
ツッコミ用のアンサーを用意しておこう。

ここで大事なのがコメント付きのcommitかどうかである。
もちろん、commitからのリカバリー方法も大事だが
コメントが付いていないと
リカバリするときにいつまでのcommitに戻れば
いいかわからなくなる可能性がある。


最低限教えたら次にブランチをやらせてみよう

$ git checkout -b ブランチ名
$ git branch

ここもオプションについてry
-b オプションは新規にブランチを作成して切り替えるという意味
すでに作成されているブランチがある場合はエラーになる。

checkoutでブランチを切り替えたと錯覚して
作業を続けてしまうというポカ防止のために
必ず、git branchコマンドを叩いて
現在、自分が参照しているブランチを意識させよう。

ここまできたらあとは運用方法である。


新しくリポジトリをつくる場合

新人君に
リポジトリを作って
初期化して
アドして
コミットさせたい。
そして、ブランチの活用までやらせたい。
そう思っていろいろ考えましたが
Railsポートフォリオにある運用方法を踏襲させていただくことにしました。

最初のコミットメッセージは
なにが良いんだろうかと考えましたが
無難に「initial repository」として
2回目以降からは案件の管理番号というのが職場にあるので
それを入れてもらった形で体言止めで入力してもらう。

例えば、~機能の改修-XXXX みたいな感じ
ここは実際に使ってみて具体的に決めたほうが良さそう。

デデデ
masterブランチの修正は基本的に行わないものとして
新しくブランチを切ってから修正を加えて
チームかリーダーのレビュー後マージする形をとる。

レビューはどのようにして行うか
そのあたりのノウハウを集めないときつそうな感じがする。
おいおい、集めることとする(続


出力メッセージの英語翻訳

あと、英語読めない人が圧倒的に多いはずなので
これらも職場のどこかに貼っておいて覚えてもらおう。

単語 日本語
On branch master 親ブランチを参照しています
No commits yet まだコミットされていません
Changes to be committed コミットされる変更
Changes not staged for commit 変更がステージングされていません
nothing to commit, working tree clean 作業ツリーにコミットするものは何もありません
discard changes in working directory 作業ディレクトリの変更を無視する

初期化といってgitの設定ファイル丸ごと削除されたどうしようとか
思っていますが
実際に使い始めてから考えることとする(続


まとめ

結論言うと、まずはこれらを新人君には覚えてもらおう。

$ git config --global user.name [username]
$ git config --global [mailaddress]

$ git init
$ git add -a
$ git status
$ git commit -am "initial repository"

$ git checkout -b ブランチ名
$ git branch
$ git checkout master
$ git branch


おわり

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

WindowsでPHPから入力したデータをExcelに出力する

PHPからデータをExcelに出力する手順

composerの入手

composerPHPのパッケージ管理ツール

もっと簡単に言えば、何かパッケージをインストールするときに、それを動かすのに必要な他のパッケージも一緒にインストールしてくれるというもの。

PHPからExcelにデータを出力するには、PhpSpreadsheetというパッケージが必要になる。
それを入手するためにまず、このcomposerをPCで使えるようにする。

Introduction - Composer から Composer-Setup.exeをダウンロードして、実行。
インストールの詳しい手順はComposerインストール手順(Windows) を参考に。
インストール完了後、コマンドプロントでcomposerを実行し、以下のような表記が出たら完了。

>composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.10.6 2020-05-06 10:28:10

パッケージのインストール

作業するディレクトリを作成し、そこに移動。
そして、コマンドプロントで以下のコマンドを実行。
このコマンドを実行することで、PHPのデータをExcelに出力できるパッケージがインストールされる。

composer require phpoffice/phpspreadsheet

また、venderというディレクトリ、composer.json,composer.lockというファイルも作成されるため、どのような記述がされているか確認しておく。
それぞれの構成やcomposerの使い方に関しては以下の記事を参照。
composerとは

PHPファイルの作成

続いて、PHPファイルの作成に移る。
Excelにデータを出力するといっても色々な形があるが、今回はセルにいくつかの値を埋め込んだExcelファイルを作成する。
PHPExcelでエクセル出力入門を参考にPHPファイルを作成した。
上記の記事はphpExcelという少し前のパッケージを使用していたため、PhpSpreadsheetの使い方も参考に、phpSpreadsheetでのコード記入を行った。

ExcelOutput.php
<?php
date_default_timezone_set("Asia/Tokyo");
require __DIR__ . "/vendor/autoload.php";

// Excelの読み込み
$spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getSheet(0);

// Excelに出力するデータの設定
$sheet->setCellValue("A1", "データ1");
$sheet->setCellValue("A2", "データ2");
$sheet->setCellValue("A3", "データ3");

$sheet->setCellValue("B4", "データ4");
$sheet->setCellValue("B5", "データ5");
$sheet->setCellValue("B6", "データ6");

// Excelに出力
$writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save("ExcelOutput.xlsx");
?>

その後、コマンドプロントで作業ディレクトリに移り、以下のコマンドを実行する。

>php ExcelOutput.php

エラーがなければ、作業ディレクトリにExcelOutput.xlsxが作成されている。
その中身は以下のようになっている。

screeenshot.png

テンプレートを読み込んで出力

もう少し踏み込んで、PhpSpreadsheetを使いならせるようにしていく。
既存のExcelを読み、その形式をコピーした新しいExcelファイルを出力できるようにする。

テンプレートのダウンロード

MicrosoftがExcelのテンプレートを配布しているので、そこから好きなテンプレートをダウンロードして、作業ディレクトリに置く。
自分は業務計画表(下半期)をダウンロードした。

ファイル名がローマ字表記なので、phpファイルで書く量を減らせるように名前を変えるのもアリ。
自分は業務計画表.xltxにした。

テンプレートの読み込み

PhpSpreadsheetに書き込むを参考に進めていく。

IOFactry::load("テンプレートのファイル")でテンプレートのExcelファイルを読み込む。
$sheet = $spreadsheet->getSheet(1);で2枚目のシートの読み込みを設定。
シートの読み方は配列と同じように、0,1…と0から数えるので設定する数字を間違えないように注意。

ExcelOutput.php
// テンプレートの読み込みとシートの読み込み
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("業務計画表.xltx");
$sheet = $spreadsheet->getSheet(1);

あとは、出力部分は変わらないので、データを記入するセルを書き込みたい場所に変更するだけでOK。

出力するとこんな感じに。
screeenshot.png

シート名を変えたい場合は以下のコードを出力部分に設定するだけでOK。

ExcelOutput.php
$sheet->setTitle("シート名");

シートの削除

業務計画表.xltxにはシートが2つあり、1枚目が「使い方」、2枚目がデータを記入する「下半期 業務計画表」となっている。
使用するテンプレートは2枚目だけなので1枚目を削除した状態で出力したい。
そのような場合は、以下のコードでシートを削除できる。
PhpSpreadsheetでシートのコピーと削除|teratailを参考にさせてもらった。

ExcelOutput.php
$sheetIndex = $spreadsheet->getIndex(
    $spreadsheet->getSheetByName("使い方")
    // 削除したいシート名を""に記入
);
$spreadsheet->removeSheetByIndex($sheetIndex);

処理としては、""で指定されたシート名のインデックスを取得し、それを用いて削除するという単純なもの。

ただ、テンプレートによってはシート間で連携している可能性もあり、片方のシートを削除してしまうとExcelファイルとして使えなくなることもある。
削除する前にシート間での連携などがないか、あっても削除して大丈夫かを確認しておく。

ExcelOutput.php

ExcelOutput.php
<?php
// https://qiita.com/kaitaku/items/d7c7b91d2f995fad3fc8
date_default_timezone_set("Asia/Tokyo");
require __DIR__ . "/vendor/autoload.php";

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("業務計画表.xltx");
$sheet = $spreadsheet->getSheet(1);
$sheetIndex = $spreadsheet->getIndex(
    $spreadsheet->getSheetByName("使い方")
);
$spreadsheet->removeSheetByIndex($sheetIndex);

$sheet->setCellValue("B22", "データ1");
$sheet->setCellValue("E22", "データ2");
$sheet->setCellValue("G22", "データ3");

$sheet->setCellValue("I23", "データ4");
$sheet->setCellValue("K23", "データ5");
$sheet->setCellValue("M23", "データ6");

$sheet->setTitle("ExcelOutput");
$writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save("ExcelOutput.xlsx");
?>

参考資料

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

高知県のWEB業社はあまりコールバック使わないですか?

コールバック使っている?

高知県のWEB業社はあまりコールバック使わないですか?
正直な所、WEB業社の零細企業や中小企業で
コールバック使用しているソースコードを見かけたことが有りません。
かなり少ないと感じます。今までコールバック使っているコードを目にしたことがないです。
間接的にワードプレスなどで使用している事はあるかもしれないけれど・・・。
それ以外は見たことがないです(´・ω・`)。
※高知県に支店を持つ県外企業やソフトウェアやアプリを開発される企業は除く。

ちなみに下記コードを実行するとこのような結果になります。
http://taoka-toshiaki.com/qiita-no4/

index.php
<?php
function fuc1(...$u){
    foreach($u as $val){
        $ret+= $val * 97;
    }
    return $ret;
}
function fuc2(...$u){
    foreach($u as $val){
        $ret+= $val * 98;
    }
    return $ret;
}

function fuc3(...$u){
    foreach($u as $val){
        $ret+= $val * 99;
    }
    return $ret;
}

$ary = [1,2,3,4,5,6,7,8,9,10];
for($i=1;$i<=4;$i++){
    $ret = Null;
    if(is_callable("fuc$i"))$ret = call_user_func_array("fuc$i",$ary);
    var_dump($ret);
    print "<br>\n";
}

var_dump(array_map(function($a){
    return $a * 99;
},$ary));

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

SessionとCookieの使い分け

はじめに

何をどっちに持たせたら良いかわからなくなったので、備忘録として残します

Sessionとは

  1. はじまりからおわりまでの、一連の行動
    1. Webサイトにログインアクセスしてそのサイトから出て行くかブラウザを閉じるまでが1セッション
      1. sessionスタート時にsession idを発行し、Cookieへ保存する。このidで通信相手(ユーザ)の判別をする。
  2. サーバー側にデータを保存する仕組み、またはそのデータ
    1. Cookieより改ざんの可能性が低いので、機密情報を保存したい場合はこっち
  3. 会議、会期、学期などを表す英単語

Cookieとは

  1. ブラウザ側にデータを保存する仕組み、またはそのデータ
    1. ブラウザでCookieへの保存を拒否した場合保存されない
    2. 簡単に盗聴・改ざんできるので、機密情報は保存させない
  2. 語源は諸説あるようだが、フォーチュンクッキー(fortune cookie:運勢を書いた紙が入ったクッキー)から来ている等

おわりに

Sessionもすごい安全ってわけではないようなので、どうしても機密情報を一時保存したい場合、Session。

漏れてもいいちょっとした情報を一時保存したい場合、Cookieって感じでしょうか:thinking:

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

Laravel MySQL 既に存在するテーブルにカラムを追加する

目的

  • rollback時の記載を毎回間違えるのでしっかりとまとめる

実施環境

  • ハードウェア環境(下記の二つの環境で確認)
項目 情報 備考
OS macOS Catalina(10.15.3)
ハードウェア MacBook Air (11-inch ,2012)
プロセッサ 1.7 GHz デュアルコアIntel Core i5
メモリ 8 GB 1600 MHz DDR3
グラフィックス Intel HD Graphics 4000 1536 MB
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB

記載例

  1. アプリ名ディレクトリで下記コマンドを実行する。

    $ php artisan make:migration add_追加カラム名_column_to_追加テーブル名_table --table=追加テーブル名
    
  2. アプリ名ディレクトリで下記コマンドを実行して作成したマイグレーションファイルを開く

    $ vi database/migrations/yyyy_mm_dd_XXXXXX_add_追加カラム名_column_to_追加テーブル名_table.php
    
  3. 開いたマイグレーションファイルを下記の様に修正する。

    アプリ名ディレクトリ/database/migrations/yyyy_mm_dd_XXXXXX_add_追加カラム名_column_to_追加テーブル名_table.php
    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class Add追加カラム名ColumnTo追加テーブル名Table extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::table('users', function (Blueprint $table) {
                //下記を追加する
                $table->データ型('カラム名');
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::table('users', function (Blueprint $table) {
                //下記を追加する
                $table->dropColumn('カラム名');
            });
        }
    }
    
  4. アプリ名ディレクトリで下記コマンドを実行してマイグレーションファイルをマイグレートを行う。

    php artisan migrate
    
  5. エラーが出ずにマイグレートできる事を確認する

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

Immutableとは?Mutableとの違い

Immutableとは

プログラミングにおいてImmutable(イミュータブル)とは「不変」という意味で、オブジェクトの状態が変わらないことを指します。

逆に、元のデータが変更可能なオブジェクトの性質をMutable(ミュータブル)と言います。

ImmutableとMutableの違い

Immutable(イミュータブル)とMutable(ミュータブル)の違いについて、実際にみていきましょう。

まずは、日付操作ライブラリ「Carbon」を使って現在日時を取得してみます。

sample.php
$now = \Carbon\Carbon::now();//2020-05-26 06:57:02.027091

現在日時が取得できました。
次に、addDayメソッドで上記で取得した現在日時に1日加算してみます。

sample.php
$tomorrow = $now->addDay();//2020-05-27 06:59:01.25073

1日加算されています。

ここで$nowの中身を再びみてみます。

sample.php
var_dump($now);//2020-05-27 06:59:01.25073

なんと、\$nowまで1日加算され、\$nowと\$tomorrowが同じ結果となってしまいました。
これは、\$nowと\$tomorrowが同じオブジェクトであるために起こります。
元の状態の変化を防ぐにはcopyメソッドを使います。

copyメソッドで元の状態を保持

copyメソッドで元のオブジェクトを複製して、2つの変数の結果を見てみましょう。

sample.php
$tomorrow = $now->copy->addDay();
var_dump($now);//2020-05-26 06:57:02.027091
var_dump($tomorrow);//2020-05-27 06:59:01.25073

元のオブジェクトはそのままで、$tomorrowだけ1日加算されました。

Carbonのバージョン2系では、このImmutable(イミュータブル)版が利用できるようになっています。

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