PHP関連のことを調べてみた2020年09月11日

PHP関連のことを調べてみた2020年09月11日

IBM i oci8.so でセグメンテーション障害(core dumped)

IBMiとOracleで嵌り事象に遭遇したので、備忘録として。

## 突然のセグメンテーション障害(core dumped)
IBMi 環境下のPHP`oci8.so`を使用して、ユーザーのPHPアプリケーションテストをしたところ、ある日突然なんのエラーメッセージも出力されず「セグメンテーション障害(core dumped)」となり、PHPアプリケーションが落ちてしまう様になった。エラー時に出力された、スプールは以下の通り。

“`txt
MCH6801 エスケープ 40 20/09/07 20:04:46.275123 QP2USER2 QSYS *STMT QP2USER2 QSYS *STMT
送信元モジュール. . . . . : QP2API
送信元プロシージャー. . . : runpase_common__FiPvT2

元記事を表示

sprintf()でSQL文を生成する際、%は%でエスケープできる

何を言っているのかわからねーと思うが、ありのままを話すぜ

#はじめに
現在私はPHP+MySQLでフルスクラッチ開発をしている会社で働いているのですが、
まだ、入社して1ヶ月ほどなので既存のコードを読むことがほとんどです。

弊社ではphpファイルの中でSQL文を生成する際に
sprintf()を使用して、フォーマットを整えるようにしています。
(これがスタンダードなのかは不明)

その中で、いまいちよくわからない記述を調べていくうちに
興味深いルールに出会いましたので、忘れないようQiita残しておきます。

#sprintf()でSQLの曖昧検索クエリを作る時

“`php
$freeword = ‘qiita’;

$sql = sprintf(‘SELECT * FROM title LIKE “%%%s%%”‘, $freeword);
“`

このコードはsprintf()の第二引数 $freeword が、第一引数内の “%%%s%%” の部分に
置き換わってフォーマットされるのですがその際に気をつけたいルールがあります。

まず真ん

Laravelでcreateを実行してもカラムの値がNULLになってしまうときの解決策

## 問題
– `Laravel`で`create`を実行したが、値を指定したのに挿入される値は`NULL`になっていた。
– `Laravel`で`create`を実行した際、**`SQLSTATE[HY000]: General error: 1364 Field (カラム名) doesn’t have a default value`**が発生した。

## 解決策
**モデルを見直す**

自分の場合、モデルで該当のカラムを`$fillable`の対象に記入していなかった。

“`app\Model.php
class Model extends Authenticatable
{
use Notifiable;

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
‘name’, ‘email’, ‘password’,
//(ここにcreateを実行してもNU

Visual Studio Codeでも必要な時にのみXDebugをオン

# やりたいこと
– [必要な時にのみxdebugをオン](https://qiita.com/koriym/items/29f81514706a39e3b7c1)というのをVisual Studio Codeでもやりたい

# Install
– [Visual Studio Codeの拡張機能のPHP Debug](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug)をインストールする

# 設定 launch.json
“`json
{
“version”: “0.2.0”,
“configurations”: [
{
“name”: “Listen for XDebug”,
“type”: “php”,
“request”: “launch”,
“port”: 9000
},
{
“name”: “Launch currently open script”,
“type”: “

FuelPHPでのFacebookログインの実装

# はじめに

わりと今さらですが、FuelPHP で Facebook ログインを実装した時のメモです。
FuelPHP では、Opauth というパッケージを使うことにより容易にソーシャルログインを実装することが可能です。

# Facebookアプリを作成

これは FuelPHP に限った話ではないですが、Facebook の使ったソーシャルログインを実装するためには、まず Facebook 側でソーシャルログイン用の Facebook アプリを作成しておく必要があります。
Facebook アプリを作成するには Facebook の開発者登録が必要ですので、まずは開発者登録を行います。

## 開発者登録
開発者登録をしたいアカウントでFacebookにログインした状態で、下記のページにアクセスします。

https://developers.facebook.com/

ページの右上の「スタートガイド」をクリックすると登録用のウィンドウが出てきます。
あとは画面の案内通りに進めれば開発者登録が終わります。
ちなみに、開発者登録には電話番号認証もしくはクレジットカード認証が必

fgetsとかSTDINとか標準入力がわからなくてPaizaスキルチェックを始められない方へ

#はじめに
プログラミングを学び始めて、もっと実力を磨くために、問題集みたいなのないかなーと探してPaizaに辿り着いたまではいいものの、「標準入力?fgets?STDIN?何それ?」「標準入力の値の取得方法は下記ページのサンプルコードを参照ください。って言うから値取得・出力サンプルコード見たけど、意味不。」と、当初はDランクの問題ですら、60分以内に解けなかった僕が通ります。

私はPHPを学習しているので、PHP前提でこの記事を作成します。

上級者の方、ツッコミや補足情報あれば、ぜひお願いします。

#標準入力
標準入力とは、ここでは、Paizaスキルチェックにおいて、Paiza側から渡されるデータのことです。現時点では、あなたのプログラムの整合性を確認するために、10パターンのデータを用意して、あなたが提出したプログラムをチェックします。そのデータはこの標準入力としてあなたのプログラムに読み込む準備をしておかなくてはなりません。

そこで必要なのが、fgets関数とSTDINというオブジェクト(モノ)です。
#fgetsとは
fgetsは関数で[PHP公式](https://w

Laravelでneo4jを使ってみる②Loginをneo4jに対応してみる

※モデルファイルをapp/Models内に移動しています。
※参考[【Laravel】モデルのディレクトリ構成変更についてのメモ](https://qiita.com/vrvr/items/4755e758f5d4b2e07579)

#②ログイン機能を対応してみる

##1)ログイン機能の有効化
下記コマンドをプロジェクトで実行

“`
php artisan make:auth
“`

##2)User.phpの変更

“`app/Models/User.php※フォルダ構成変更していない場合はapp/User.php

Laravelでneo4jを使ってみる①設定編

#①設定
・laravel バージョン 5.6
・neoEloquent バージョン 1.4.6

##1)Laravelプロジェクトをバージョン指定して作成

“`
composer create-project “laravel/laravel=5.6.*” [プロジェクト名]
“`

##2)Vinelab/NeoEloquentの設定

“`
composer require vinelab/neoeloquent 1.4.6
“`
※neo4jの設定がないと怒られる場合、先にconfig/database.phpの設定をしてキャッシュクリア。
 

##3)neo4jデータベースの利用設定

config/database.phpにneo4jの設定を追加

“`
‘default’ => env(‘DB_CONNECTION’, ‘neo4j’),
“`

“`
‘connections’ => [

‘neo4j’ => [
‘driver’ => ‘neo4j’,

Amazon Linux 2 で PHP を簡単にアップデートする方法

Amazon Linux 2 の、ここ1年位の Amazon Linux Extra を使って、PHP をインストールしている人は、Amazon Linux Extra でパッケージの Disable & Enable をするだけで、結構簡単に PHP のアップデートができるという話です。

参考: [Amazon linux 2でのphpの更新方法](https://qiita.com/P__act2_tech/items/69a5b94ead8ee3edbc7e) (感謝!)

# 自分の環境

– AWS
– 開発用のサーバー
– Amazon Linux 2
– PHP 7.1 の Extra を導入
– 導入済みの PHP 一覧 `libmcrypt php php-bcmath php-cli php-common php-dba php-embedded php-enchant php-fpm php-gd php-gmp php-intl php-json php-ldap php-mbstring php-mysqlnd php-odbc php-opcache

PHP 配列の中の配列の値を書き換える方法

# 目的

– 配列の中に入った配列の中の値を更新する方法をまとめる

# 実施環境

– 下記サイトにてPHPの動作を確認しながら本記事を書いた。
– [https://paiza.io/ja](https://paiza.io/ja)

# 例

– 配列の中に入った配列の値を更新する処理を下記に記載する。

“`php
foreach (配列A as &変数){
変数[‘インデックス’] = ‘更新したい値’;
}
“`

# 連想配列の既存インデックスのデータを書き換える具体例

– 配列「$infos」には連想配列が格納されている物とする。
– 連想配列にはインデックス「id」に商品IDが、インデックス「item_name」に商品名が、インデックス「price」に商品の税抜きの値段が格納されている物とする。
– 配列「$infos」に格納されている連想配列のインデックス「price」の税抜き金額を引き出し、税率を用いた計算をし、連想配列のインデックス「price」の税抜き金額を税込み金額で書き換える方法を下記に記載す

Laravelで更新項目をkey-valueで取得して動的にValidationを実施して更新を実施する

## TL; DR
APIの開発をしていると、通常はFormRequestで更新項目を取得し、validationを実施します。

しかし、更新する項目のみをリクエストとして送信する、かつ1項目のみとする場合は、通常の実装ではこの限りとはなりません。

そのため、少しとトリッキー~~冗長~~なやり方で実装してみます。

## 環境
– PHP7.4
– Laravel7.2

## 通常の更新処理の実装
通常、以下の要領で更新処理のリクエストを送信します。

“`json
{
“name”: “名前”,
“mail”: “test@exmaple.com”,
“gender”: 1
}
“`

このリクエストに対応するFormRequestは、以下のとおりです。

“`php

【Laravel】バッチでユーザーにメール送信

継続は力なり。めげずに今日も備忘録。
バッチの理解を深める為、簡単な処理を実装してみた。

## 環境
PHP 7.3.8
Laravel 6.18.35

## 本日のお題
バッチでメールを送ってみる。
今回は実装するアプリケーションの登録ユーザーに一括送信するもの。

## メールの環境設定
[mailtrap.io](https://mailtrap.io/inboxes)というSMTPのダミーサーバーを利用する。
mailtrap.ioを利用する事で送信したメールは指定したアドレス宛てには送信されずに、mailtrap.ioの画面で結果を確認する事が出来るので、非常に便利です。会員登録したら直ぐに使えます。

mailtrap.ioの` Inboxes` から` Demo inbox` に遷移して、SMTP情報を確認します。
その情報を元に.envを編集します。

“`php:.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=587
MAIL_USERNAME=mailtrap.ioのSMTP情報を参照
MA

実務で出てきて少し混乱したPHPの文法

#はじめに
2020年の8月から都内の企業でWebエンジニアとして働いています。

開発環境はいわゆるフルスクラッチPHPなのですが、
私はRubyをメインで学習するプログラミングスクール出身でしたので、入社前はほとんどPHPに触ったことがありませんでした。

入社から1ヶ月ほど経った今では基礎文法も大体理解し、新しく出会った関数などをその都度調べながら
既存システムの改修業務を行っています。

そんな業務中、特に違和感のある記述を見かけたので
すぐに忘れないよう、Qiita上に残しておこうと思います。

#問題のコード
“`php
isset($_REQUEST[‘search’]) && $var = $_REQUEST[‘search’];
“`
なんの変哲もないコードですが、人目見たときに混乱しました。

今までisset()を使う際は

“`php
if(isset($_REQUEST[‘search’])){
$var = $_REQUEST[‘search’];
}
“`
↑のようなパターンを見慣れていたので
論理演算子 && はANDの条件

デザインパターンのお勉強

#デザインパターンのお勉強をしたい

このサイトの例を参考にしてちょっとづつデザインパターンを勉強しながらオブジェクト指向の設計を覚えていきたいと思います。
https://www.techscore.com/tech/DesignPattern/index.html/

まだまだ始めたばかりなので、解釈のおかしなところあると思うのでコメントいただけますと助かります。
また普段PHPを使用しているのですが、こんなところでよく使うよというようなアドバイスありましたらいただけますと大変助かります。

#コマンドパターン
下記引用
>22.1 Commandパターンとは
第22章ではCommandパターンを学びます。あるオブジェクトに対して要求を送るということは、そのオブジェクトのメソッドを呼び出すことと同じです。 そして、メソッドにどのような引数を渡すか、ということによって要求の内容は表現されます。さまざまな要求を送ろうとすると、引数の数や種類を増やさなければなりませんが、 それには限界があります。そこで要求自体をオブジェクトにしてしまい、そのオブジェクトを引数に渡すようにします。それがC

Laravelのバリデーションでエラー時の遷移先を制御する

## 問題
– `Laravel`のバリデーションでエラーになった際、入力時のページに戻らない
– `Laravel`のバリデーションでエラーになった際に入力時のページへ戻る際、値は保持されない

## 原因
**`Laravel`でバリデーションを適用した際、エラー発生時に入寮時の画面などに戻る際、`GET`メソッドで遷移されるから**

自分は`Request`の`validate`メソッドを利用し、バリデーションを適用していたため、ルールやエラーメッセージなどの設定はできても、その後の制御ができておらず、冒頭のような問題が発生していた。
[バリデーション 5.5 Laravel](https://readouble.com/laravel/5.5/ja/validation.html)を見ると、`Request`以外にもバリデーションを設定できる方法があったので、それを試してみたら問題が解決したので、その方法を記載する。

## 解決策

**`validator`を利用する**

### validator

`validator`はコントローラに直接記入して利用する。
基本と

[PHP]郵便番号を正規表現でチェックする

今回は下記のコードを使って見ていきます。

“`php
$zip = ‘123−4567’; //←全角

$zip = mb_convert_kana($zip, ‘a’, ‘UTF-8’);
if (preg_match(“/\A\d{3}[-]\d{4}\z/”, $zip)) {
print(‘郵便番号:〒’ . $zip);
} else {
print(‘※郵便番号を 123-4567の形式でご記入ください’);
}
“`

↓のように表示されます。

“`
郵便番号:〒123-4567 //←半角になっている
“`

※**mb_convert_kana**については → [こちら](https://qiita.com/maca12vel/items/9378ec4ae64242ac487e)

#####パラメーターで「**’a’**」を指定する理由
郵便番号は数字なので「**’n’**」では?と思うかもしれませんが、
**-(ハイフン)**が含まれているので英数字扱いとなります。
「**’a’**」と指定することで、英数字を半角に直すことができます

Phalcon Devtoolsのインストール(mac)

前回、vagrantでPhalcon開発環境を作ったが、Phalcon Devtoolsの使用も必要となり、
ドキュメントと多少違うところがあり、エラー解決の過程をメモとしておく。

“`
composer global require phalcon/devtools
“`
で、次にエラーが出てきた:

“`
Problem 1
– phalcon/devtools v4.0.3 requires ext-phalcon ^4.0.0 -> the requested PHP extension phalcon is missing from your system.
– phalcon/devtools v4.0.2 requires ext-phalcon ^4.0.0 -> the requested PHP extension phalcon is missing from your system.
– phalcon/devtools v4.0.1 requires ext-phalcon ^4.0.0 -> the requested

[PHP]半角数字に直して、数字かどうかをチェックする

今回使うファンクションは“mb_convert_kana“

例えば、以下のように記述されていたとする

“`php
$age = 20; //←半角数字

if (is_numeric($age)) {
print($age . ‘歳’);
} else {
print(‘※年齢が数字ではありません’);
}
“`

表示は下記の通り

“`
20歳
“`

“is_numeric“というファンクションで、
指定されたパラメータが数値かどうかをチェックすることができる。
上記の例では($age)をチェックしている。

もし、“$age = ‘あいうえお’“とすると

“`
※年齢が数字ではありません
“`
と表示される事になる。

また、“$age = ’20’“ではなく“$age = ‘20’“(全角数字)にした場合も、
同じように「※年齢が数字ではありません」と表示されてしまう。

ユーザーが上記のように、半角で入力しなければいけない場合でも、
誤って全角で入力してしまうことが多々ある。

なので、仮に全角数字を入力してしまっても、半

Eccubeで○○円以上送料無料にする処理

`app/Customize/Service/PurchaseFlow/Processor/CustomDeliveryFeePreprocessor.php` というファイルを下記のように作成します。

“`php:CustomDeliveryFeePreprocessor.php

[PHP]連想配列とforeach構文

##連想配列について

例えば以下の配列があるとする

“`php
$fruits = [‘リンゴ’, ‘レモン’, ‘バナナ’];
“`

この変数“$fruits“に格納されている配列において、
“リンゴ“を取り出したい時は以下のように記述する

“`php
print($fruits[0]);
“`

これで取り出せたが、それぞれの値に対応する添字を覚えておかないと意味がない。
そんな時に使うのが“連想配列“
順番が関係ないような配列の場合によく使う。

上記の配列を連想配列のカタチにすると以下のようになる。

“`php
$fruits = [
‘apple’ => ‘リンゴ’,
‘lemon’ => ‘レモン’,
‘banana’ => ‘バナナ’
];
“`

この時、=>の左側の部分(“’apple’“)を“キー“、右側(“’リンゴ’“)を“値(バリュー)“と呼ぶ。
※キーはなんでも良いが、見た時に誰でも理解できるようなものが良い

連想配列において、先ほどと同じように“リンゴ“を取り出したい時は以下のように記述する