20190529のPHPに関する記事は12件です。

[PHP]セッションの有効期限が切れてもセッションが消えるわけじゃない。

session.gc_maxlifetimeの設定だけでは不十分

よくありがちな30分間操作がなければセッションを無効にする、といった処理。
セッションの有効期限(session.gc_maxlifetime)を30分に設定するだけでいいんじゃない?と思っていました。

ini_set('session.gc_maxlifetime', 1800);

https://php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime

session.gc_maxlifetime は、データが 'ごみ' とみなされ、消去されるまでの秒数を指定します。 ガベージコレクション (ごみの収集) は、 セッションの開始時に行われます (session.gc_probability と session.gc_divisor に依存します)。

https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-divisor

session.gc_divisorと session.gc_probabilityの組み合わせで すべてのセッションの初期化過程でgc(ガーベッジコネクション)プロセス も始動する確率を制御します。確率は gc_probability/gc_divisor で計算されます。例えば、1/100は各リクエスト毎に1%の確率でGCプロセスが 始動します。 session.gc_divisorのデフォルトは100です。

つまり、実際に削除(ガベージコレクション)が行われるのは次回のsession_start()時。かつ、デフォルトであれば1/100の確立。

また、この方法では有効時間が伸びない場合もあるようです。理由は後述。

毎回破棄したい場合

ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);

https://www.php.net/manual/ja/function.session-gc.php

PHPは、デフォルトで確率ベースのセッション GC を行います。
確率ベースの GC は多少は機能しますが、いくつかの問題があります。 1) トラフィックが少ないサイトのセッションデータは、優先期間内に削除されないことがあります。 2) トラフィックの多いサイトでは、GC が頻繁になる可能性があります。 3) ユーザーの要求の際に GC が実行され、ユーザーは GC 遅延を感じます。

ただこの方法だと上記の3)のように処理が重たくなることもあるようです。
自分でスクリプトを書いた方がいいかも。

有効時間が伸びない場合

https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime

注意: 異なる値を session.gc_maxlifetime に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。このような場合には、 お互いに session.save_path を使用します。

複数のアプリケーションなどでセッションファイルの保存場所が同じ場合には、一番小さい設定値になってしまうようです。
この場合はsession.save_pathでセッションファイルの保存場所を変更する必要があります。

参考

セッションの有効期間とか設定とか挙動とかを調べました
[php]ログインセッションの維持・有効期間について (session,cookie)
PHP のセッションに関する覚え書き

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

php-master-changes 2019-05-28

今日は JIT の修正、opcache の func_info の修正、opcache 最適化器の修正、libzip の検出に失敗する場合がある問題の修正、テストの並列実行対策、phpinfo() 関連コードの ZEND_COLD 指定、PHP 8 の ZPP エラー例外化で不要になったコードの削除、組み込み関数の一部に返り値型情報の追加、引数なしでの array_merge() / array_merge_recursive() が空配列を返すようにする修正、不要な zval コピーの削減、FFI で get/set オブジェクトハンドラを利用しないようにする修正、

2019-05-28

nikic: BIND_STATIC of implicit binding may be undef

nikic: Remove special handling of zero-arg funcs in func_info

paresy: Fixed bug #76345

cmb69: Prevent parallel test conflicts

dstogov: Put phpinfo() related code into cold code segment

nikic: zend_func_info: Remove unnecessary type callbacks

nikic: Add return type information to some ext/standard functions

dtakken: Allow array_merge() / array_merge_recursive() without arguments

nikic: Remove FUNC_MAY_WARN

dstogov: Fixed register allocation

nikic: Update MAY_BE_NULL func_info for Zend functions

nikic: Update MAY_BE_NULL for parts of ext/standard

dstogov: Avoid double copying

nikic: Update MAY_BE_NULL info for more ext/standard functions

nikic: hebrev/hebrevc: Don't return false for empty string

nikic: Revert accidental changes

nikic: JIT: Fix SWITCH_LONG/STRING codegen with exact type

nikic: SCCP: Don't perform partial object propagation for typed props

dstogov: Avoid usage of internal get/set object handlers. They are going to be removed in PHP-8.

nikic: SCCP: Fix handling of ASSIGN_OBJ_REF

nikic: Fix type inference of SEND_UNPACK with empty array

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

laravel-バリデーション正規表現(パイプ「|」利用)(頭が0つきの数字)

バリデーション時に、正規表現のパイプを利用し、00、01、02、0、1、2の値のみを通すようなバリデーションを作成しようと思います。

php
$this->validate($request, [
    'number' =>['required', 'regex:/^([0-2]|0[0-2])$/'];
]);

パイプを使う際は、'required|regex:/^([0-2]|0[0-2])+$/'と一行で、バリデーションルールを書いてしまうと、Laravel上だと、バリデーションごとにパイプを挟んでいるため、正規表現の中のパイプが他のバリデーションルールに切り替わったのかなとLaravelは判断するため、エラーになってしまいます。そのため、配列で一つずつ指定してあげる必要があります。

/^([0-2]|0[0-2])$/は「^」が行頭、「\$」が行末、パイプがor、[]は○○から○○まで、つまり0~2までもしくは、00~02となります。
前書いた正規表現記事
参考にさせていただいた記事-laravelバリデーション正規表現パイプ

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

PhpStorm-DB接続(MySql)

右上にあるDatabaseをクリック
画像のようにMySqlをクリック
Screenshot_1.png

画像のように
・Name (なんでもいい)
・Host (僕の場合Docker使用のため)
・User (Mysqlにログインできるユーザー)
・Password (Mysqlにログインできるユーザーのパスワード)
Screenshot_2.png

DriverFileがなければ、画像のような表示が出てきますので、Downloadボタンをクリック
Screenshot_3.png

完了し、パスワードが消えていたら、もう一度打ち直し、Test Connectionボタンをクリック
接続が完了すると、以下のように表示されます。
Screenshot_4.png

もう一度、Databaseを開き、0 of 7をクリックし、表示させたいDBのチェックボックスにチェックを入れる。
Screenshot_6.png

下記のように表示されました。DBの中身、テーブルの中身(カラムとデータ)も見ることができます。また、+ボタンを押下し、その中のConsoleをクリックすると、Console画面が開き、そこでクエリを書くと「Ctrl」+「Enter」で実行することができます。
Screenshot_7.png

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

0から始めるPHP:1日目

本日の目標

定数や変数を扱えるようになる。

定数

定数とは、定数である。つまり、ずっと同じ値を保つ。最初に定義したら、あとは中身は変わらない。

関数define()を用いて、定数を定義してみる。
defという定数を作り、その中にHelloを入れる。

<?php
    define("def","Hello");
    print(def);
?>

define("定数の名称",”定数の中身”) といったように書く。
実際に定義ができているか確認のため、関数print()で出力してみる。

変数

変数とは、定数との逆で何かしら操作すると値が変わる。

PHPでは、変数を定義するときに型を指定する必要がなく、勝手にやってくれる(多分)
今回は例として整数の変数を定義してみる。

<php
    $var = 0;
?>

$変数名 = 代入する値 というよに書く。
変数の型は整数以外にも文字列や、論理型などがある。

本日の成果

定数と変数の意味を理解して、定義できるようになった。

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

0から始めるPHP

目的

独学でPHP言語を勉強し、何を勉強したかを記事にしていきます。
誰の役に立つか分かりませんが...備忘録として書いていくので、雑かもしれませんが悪しからず・・・

環境

MAMPサーバでPHPを実行します。
エディタはBBeditのフリー機能のみで。

PHPの書き方

<?php

?>

PHPは基本的に<?php>の間に、関数やらなんやら記述する。

文字列の出力

とりあえず、動かしてみよう
print()関数でHello Worldを表示させる。

<?php
    print("Hello World");
?>

文字列の出力には、他にもprintf()echo()といった関数がある。
それぞれの関数の仕様については後ほど、まとめる。(maybe...)

改行の仕方

改行したい!というときには文末に<br>\nといれる。

<?php
    print("Hello World<br>\n");
?>

これで改行ができた。

本日の成果

関数print()printf()echo()を用いて、文字列を出力できた

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

0から始めるPHP:0日目

目的

独学でPHP言語を勉強し、何を勉強したかを記事にしていきます。
誰の役に立つか分かりませんが...備忘録として書いていくので、雑かもしれませんが悪しからず・・・

環境

MAMPサーバでPHPを実行します。
エディタはBBeditのフリー機能のみで。

PHPの書き方

<?php

?>

PHPは基本的に<?php>の間に、関数やらなんやら記述する。

文字列の出力

とりあえず、動かしてみよう
print()関数でHello Worldを表示させる。

<?php
    print("Hello World");
?>

文字列の出力には、他にもprintf()echo()といった関数がある。
それぞれの関数の仕様については後ほど、まとめる。(maybe...)

改行の仕方

改行したい!というときには文末に<br>\nといれる。

<?php
    print("Hello World<br>\n");
?>

これで改行ができた。

本日の成果

関数print()printf()echo()を用いて、文字列を出力できた

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

PHPのタイプヒントでbooleanを指定しているのにbooleanを指定しろと言われるんだが

問題のコード

type_hint.php
<?php
class Main{
    public function type_hint_boolean(boolean $arg){
        var_dump($arg);
    }

    public function type_hint_integer(integer $arg){
        var_dump($arg);
    }
}

$main = new Main();
$main->type_hint_boolean(true);
$main->type_hint_integer(1);

出力

PHP Fatal error:  Uncaught TypeError: Argument 1 passed to Main::type_hint_boolean() must be an instance of boolean, boolean given,

must be an instance of boolean, boolean given

booleanじゃなきゃいけないのにbooleanが渡されました???
ちなみにintegerの場合は以下のエラー

must be an instance of integer, integer given

解答

booleanintegerはタイプヒントでは使えずbool, intで指定する必要がある

type_hint.php
<?php
class Main{
    public function type_hint_bool(bool $arg){
        var_dump($arg);
    }

    public function type_hint_int(int $arg){
        var_dump($arg);
    }
}

$main = new Main();
$main->type_hint_bool(true);
$main->type_hint_int(1);

出力

bool(true)
int(1)

解説

booleanintegerを指定するとその名前のクラスのインスタンスのタイプヒントになってしまう
よって以下のコードは通る

type_hint.php
<?php
class Main{
    public function type_hint_boolean(boolean $arg){
        var_dump($arg);
    }
    public function type_hint_integer(integer $arg){
        var_dump($arg);
    }
}

class boolean{
}
class integer{
}

$main = new Main();
$main->type_hint_boolean(new boolean());
$main->type_hint_integer(new integer());

出力

object(boolean)#2 (0) {
}
object(integer)#2 (0) {
}

納得納得 :smiley:

参考

公式ドキュメント
PHP7調査(36)スカラ型のタイプヒントが書けるようになった
PHP: bool vs boolean type hinting

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

CentOS7でのSimpleSAMLphp環境構築

環境

・CentOS Linux release 7.5.1804 (Core)
・Apache/2.4.6
・PHP 5.6.40 ※後述
・SimpleSAMLphp 1.17.2

SimpleSAMLphpとは?

これ
https://simplesamlphp.org/

シングルサインオンについて

Webサービスを利用するときにアカウントをを登録することが多いと思いますが、だいたいのサイトではIDとパスワードを登録してログイン時に入力することでユーザ認証を行うという流れだと思います。
この流れは良いのですが、利用するサービスが増えると登録して覚えておくべきIDとパスワードのセットも増えていき、ユーザの負担が大きい、パスワードを忘れてしまうことがある、同じパスワードを使い回してしまいセキュリティ的によろしくない、といった問題があります。この問題に対するアプローチの一つがシングルサインオンです。
シングルサインオンは、認証サーバ(IdP:Identity Provider)にアカウントを一つ登録しておき、その他のサービス(SP:Service Provider)へのアカウント登録の際にIdPのアカウントを利用してサインインするといったものです。よくある"Twitterでログイン"みたいなのもシングルサインオンですね。
スクリーンショット 2019-05-29 16.47.19.png

SAMLについて

SAMLとはSecurity Assertion Markup Languageの略称で簡単に言うとシングルサインオンを実装するときに使う言語の一種です。

SimpleSAMLphp

今回題材としているSimpleSAMLphpとは、シングルサインオンを実装するためのSAMLベースのオープンソースソフトウェアです。リファレンスが英語のみで、実際に使用方法などを記述したサイトなども少なく、バージョンの違いなんかで動かなくなるようなちょっとトリッキーなものではありますが、シングルサインオンを実装するには非常に便利です。
今回は、IdPとSPそれぞれの環境構築と連携までを行います。

CentOS初期設定

こちらの記事が参考になります。
VirtualBoxを使うならssh接続できたほうがいろいろと便利なので…。
https://qiita.com/ebkn/items/751ed657629ba8d4ab0a

SimpleSAMLphp環境構築

こちらの記事が参考になります。
https://qiita.com/haya43/items/c74d2710cd9b57d2cbb4

だいたいこの通りにやればうまくいきますが筆者が少々躓いたのとIdPの設定が少しことなっていることから加筆しながらなぞっていく形になります。

CentOSの設定

参照した記事ではIPアドレスなどいろいろコマンドラインで設定していますが、ssh接続の記事で設定しているので今回は無視します。
hostnameは変えておくとのちのちわかりやすいので変えておきます。

# nmcli general hostname <変更するhostname>
# systemctl restart systemd-hostnamed

簡単に説明しておくとhostnameはいま設定しているVMの名前で、ウェブサイトとしてアクセスする際のURLになるのでわかりやすいものを付けるといいです。SPならばsp.local、IdPならばidp.localのようにしておくとURLを見ただけでSPかIdPか判別できます。

ssh接続してローカル環境のブラウザからアクセスする際には、ファイヤーウォールを停止しておかないとアクセスできないので停止しておきます。

# systemctl stop firewalld
# systemctl disable firewalld

アクセス制御の設定などをいい感じに設定できると停止しなくても良さそうですが、とりあえずアクセスできるようになることを目標とします。CentOSのVMをGUI起動して、VM内のブラウザからアクセスする場合はファイヤーウォールが起動していてもアクセスできたと思うので参考までに。

SELinuxを無効化します。

# vi /etc/selinux/config
etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled

ロケールを変更します。

# localectl set-locale LANG=ja_JP.utf8

OSを再起動します。

# reboot

ApacheとPHPのインストール

Apache

# yum install -y httpd
# systemctl start httpd
# systemctl enable httpd

ブラウザからhttp://<設定したhostname>/にアクセスしてApacheのデフォルトページが表示されたらOK。

PHP

# yum -y install php php-mbstring
# vi /etc/php.ini
php.ini
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extention=mbstring.so  #追記
# yum -y install php-xml
# systemctl restart httpd

テストページを作る。

# vi /var/www/html/phpinfo.php
phpinfo.php
<?php
    phpinfo();
?>

http://<設定したhostname>/phpinfo.phpにアクセス、PHPのバージョン情報が表示されればOK。

SimpleSAMLphpインストール

wgetコマンドで入れます。
wgetコマンドがないよとエラーが出たらyumでインストール。

# yum -y install wget

https://simplesamlphp.org/download から最新のパッケージのリンクをコピーしてwgetのあとに入力してダウンロードします。先にSimpleSAMLphpのファイルを展開したいディレクトリに移動しておくといいかも。今回は/var/www/配下に展開するので先にcdコマンドで移動しておきます。

# cd /var/www
# wget https://simplesamlphp.org/download?latest

ダウンロードしたファイルを展開

# tar xvf download?latest

展開したファイルはsimplesamlphp-1.XX.XXみたいなファイル名になっていると思うのでわかりやすいように変更しておきます。

# mv simplesamlphp-1.XX.XX simplesaml

HTTPS設定

参照先の記事まんまなので簡単にいきます。

mod_sslをインストール

# yum -y install mod_ssl

秘密鍵・証明書等作成

# cd /etc/pki/tls/private/
# openssl genrsa -aes128 1024 > server.key

Generating RSA private key, 1024 bit long modulus
..................++++++
..........................................++++++
e is 65537 (0x10001)
Enter pass phrase:(パスフレーズ)
Verifying - Enter pass phrase:(同じパスフレーズ)

# cd /etc/pki/tls/private/
# openssl req -new -key server.key > server.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:空白
Organization Name (eg, company) [Internet Widgits Pty Ltd]:空白
Organizational Unit Name (eg, section) []:空白
Common Name (eg, YOUR name) []:設定したhostname
Email Address []:空白

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:空白
An optional company name []:空白

# cd /etc/pki/tls/private/
# openssl x509 -in server.csr -days 36500 -req -signkey server.key > /etc/pki/tls/private/server.crt

Signature ok
subject=/C=JP/ST=Tokyo/L=Hoge/O=Hoge Ltd/OU=Hoge/CN=sp.local
Getting Private key
Enter pass phrase for server.key:(上記で指定したパスフレーズ)

# mv server.key server.key.bak
# openssl rsa -in server.key.bak > server.key

Enter pass phrase for server.key.back:(パスフレーズ)
writing RSA key

ここまでで秘密鍵と(オレオレ)証明書ができました。
さらに設定ファイルを編集

# vi /etc/httpd/conf.d/ssl.conf
Listen 443 https

(中略)

<VirtualHost _default_:443>
SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/simplesaml/config # 追記

# General setup for the virtual host, inherited from global configuration
DocumentRoot "/var/www/simplesaml/www" # 編集

Alias /simplesaml "/var/www/simplesaml/www" # 追記

ServerName <設定したhostname>:443 # 編集

(中略)

#   SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect.  Disable SSLv2 access by default:
SSLProtocol -all +TLSv1.2 # 編集

(中略)

#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/private/server.crt # 編集

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/server.key

(中略)

# 最後に追記
<Directory /var/www/simplesaml/www>
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
</Directory>
</VirtualHost>

simplesamlディレクトリを置いた場所が/var/www/でない場合や、秘密鍵などを違うディレクトリに置いた、違う名前にしたような場合は適宜変更してください。
最後にapacheを再起動

# systemctl restart httpd

https://<設定したhostname>/simplesamlにアクセスしてSimpleSAMLphpの設定ページが表示されたらOK。
スクリーンショット 2019-05-29 17.48.55.png

設定ページが表示されない場合

httpsではなくhttpでアクセスしていませんか?筆者も間違えてhttpでアクセスして表示されないという壁に直面しましたが、当時全く気が付かなかったので別の方法で対処しましたので以下に記します。参考までに。

httpd.confを編集

ssl.confはhttps(443ポートアクセス)の設定ファイルであり、/simplesamlが見つかりませんというエラーの場合ここで解決されることが多い。/simplesamlはエイリアスを設定しているのでこのエイリアス設定をhttp(80番ポートアクセス)の設定ファイルに書けばよいという寸法(?)

# vi /etc/httpd/conf/httpd.conf
httpd.conf
(設定ファイルの末尾に以下を追記)

Alias /simplesaml /var/www/simplesaml/www
<Directory /var/www/simplesaml/www>
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
</Directory>

Apacheを再起動して再びブラウザアクセスしてみると(おそらく)表示できると思います。

ここまでできたら次はSPとIdPの構築になりますが長くなってきたので次の記事で書こうと思います。出来次第リンクを貼ります。

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

PDOでPostgresqlから大量のデータをSELECTする(メモ)

何も考えずに70万件くらいのテーブルから全データSELECTしたらメモリが足りなくなってしまいました。(当然)

結論

メモリがたりない
$selectSql = "SELECT * FROM でかいテーブル";
// query() すると結果のデータがPHPのメモリに乗ってしまい、メモリが足りない。
$statement = $this->query($selectSql);

while($row = $statement->fetch(PDO::FETCH_ASSOC)){
    //なんなりと
}

だいじょうぶ
$selectSql = "SELECT * FROM でかいテーブル";
// 以下オプション付きでprepareすればOK。
$statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
// 実行
$statement->execute();
//第二引数はデフォルト値と同じなので、省略しても良い
while($row = $statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)){
    //なんなりと
}

感想

パラメタの無い単なるSELECT文をプリペアドステートメントで実行するという発想がなかった。。

注意点

//prepare の場合、rowCount() が取れない
$selectSql = "SELECT * FROM でかいテーブル";
$statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$statement->execute();
$statement->rowCount();//0件

参考

https://www.php.net/manual/ja/pdo.prepare.php
https://www.php.net/manual/ja/pdostatement.fetch.php

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

EC-CUBE4でmigrationを使いこなす

EC-CUBE4でmigrationを利用してデータベースを更新します。

composer installするとmigration機能がインストールされているはずなので、そのまま利用します。

テーブル追加・スキーマ更新

テーブル追加やスキーマの更新の場合はEntityを追加・修正し、コマンドを実行するだけです。

このあたりの説明は公式ドキュメントに記載されているので、こちらをご覧ください。

http://doc4.ec-cube.net/customize_entity

レコード追加

ファイル作成

INSERT文を実行するMigrationファイルを作成します。

EC-CUBEのルートディレクトリで下記コマンド実行します。

$ bin/console doctrine:migrations:generate
Generated new migration class to "/var/www/html/app/DoctrineMigrations/Version20190529032556.php"

記載されているファイルを編集します。

<?php declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20190529063256 extends AbstractMigration
{
    public function up(Schema $schema) : void
    {
        // this up() migration is auto-generated, please modify it to your needs

    }

    public function down(Schema $schema) : void
    {
        // this down() migration is auto-generated, please modify it to your needs

    }
}

upメソッドにINSERT文、downメソッドにINSERTしたレコードを削除するDELETE文を記載します。

<?php declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20190529032556 extends AbstractMigration
{
    public function up(Schema $schema) : void
    {
        // ギフト
        $sql =<<<EOL
INSERT INTO dtb_csv (csv_type_id, entity_name, field_name, reference_field_name, disp_name, sort_no, enabled, create_date, update_date, discriminator_type)
SELECT 4, 'Eccube\\\Entity\\\OrderItem', 'Gift', 'name', 'ギフト', max(sort_no) + 1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'csv' FROM dtb_csv WHERE csv_type_id = 4;
EOL;
        $this->addSql($sql);
    }

    public function down(Schema $schema) : void
    {
        // ギフト
        $sql =<<<EOL
DELETE FROM dtb_csv WHERE disp_name = 'ギフト';
EOL;
        $this->addSql($sql);
    }
}

実行

下記コマンドを実行するとupメソッドの処理が実行されます。

bin/console doctrine:migrations:migrate [日付]
※[日付]:クラス名に記載されている日付

$ bin/console doctrine:migrations:migrate 20190529032556

                    Application Migrations


WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y # yを入力
Migrating up to 20190529032556 from 20181109101907

  ++ migrating 20190529032556

     -> INSERT INTO dtb_csv (csv_type_id, entity_name, field_name, reference_field_name, disp_name, sort_no, enabled, create_date, update_date, discriminator_type)
SELECT 4, 'Eccube\Entity\OrderItem', 'Gift', 'name', 'ギフト', max(sort_no) + 1, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'csv' FROM dtb_csv WHERE csv_type_id = 4;

  ++ migrated (0.04s)

  ------------------------

  ++ finished in 0.04s
  ++ 1 migrations executed
  ++ 1 sql queries

元に戻す

元に戻したい場合は下記コマンドを実行します。downメソッドの内容が処理されます。

bin/console doctrine:migrations:execute [日付] --down
※[日付]:クラス名に記載されている日付

$ bin/console doctrine:migrations:execute 20190529032556 --down
WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y/n)y # yを入力

  -- reverting 20190529032556

     -> DELETE FROM dtb_csv WHERE disp_name = 'ギフト';

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

Wordpress 投稿画面で Advanced Custom Fields の関連記事をソートする

日付で新しい順(DESC)にしたい場合

functions.php
/* 関連記事の調整 */
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['orderby'] = 'post_date'; //投稿日付順
  $args['order'] = 'DESC'; //新しい順
  return $args;
}

今開いている投稿を除外する場合

functions.php
/* 関連記事の調整(開いている投稿を除外) */
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['post__not_in'] = array( $post_id ); //今開いている投稿を除外
  $args['orderby'] = 'post_date'; //投稿日付順
  $args['order'] = 'DESC'; //新しい順
  return $args;
}

参考
https://www.nxworld.net/wordpress/wp-acf-custom-relationship-query-exclude-post.html

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