PG WORKS

PHPやLinux(サーバー)などのノウハウや、便利なツールを紹介していきます。

【Laravel】大量INSERTする際に使う関数(chunk)

INSERT時にテーブルのカラム数が異常なほど多い場合やテキストデータのサイズが大きいと下記のエラーが出ます。

<?php
//General error: 1390 Prepared statement contains too many placeholders
?>

調べてみると、Laravelに何回か分けてINSERTできる関数があるそうでそれが「chunk」というものだそうです。

500件ずつデータを追加する場合

<?php
//サンプルの配列は1つですが、$inserts配列に1000個以上あるのと過程します。
$inserts[] = array('id'=>1’,'name'=>'テスト'); 
$insert_data = collect($inserts);
foreach ($insert_data->chunk(500) as $chunk) {
   DB::table('sample')->insert( $chunk->toArray());
}
?>

【CentOS】SSHの不正アクセスをBANするFail2banの設定

SSHからの不正アクセスを監視するFail2banの設定手順になります。

ほぼ海外からの総当たり攻撃なので、随時SSHの接続ログを確認して不正アクセスがないか確認しましょう。
※あまりにも多い場合、契約した先に確認し報告することをおすすめします。

不正アクセスがないかログから確認

less /var/log/secure

Fail2banのインストールと設定手順

yum install fail2ban
vi /etc/fail2ban/fail2ban.local
[Definition]
loglevel = NOTICE
vi /etc/fail2ban/jail.local
# 1時間以内に5回不審なアクセスがあったら1日BAN
bantime  = 86400
findtime  = 3600
maxretry = 5

#CentOS7の場合systemd
backend = systemd

# SSHのアクセスに対する設定
[sshd]
enabled = true
banaction = firewallcmd-ipset
# 起動コマンド
systemctl start fail2ban

# 停止コマンド
systemctl stop fail2ban

# 自動起動を有効
systemctl enable fail2ban

# 自動起動の確認
systemctl is-enabled fail2ban

#現在のBAN状況
fail2ban-client status sshd

参考サイト様

qiita.com

【Laravel】PDO(mysql)を使ったSQL操作

Laravel版のPDOを紹介。

最初は使い方がわからず戸惑いましたが、今はページ送りやGET/POST関連の操作が気軽に実装できて重宝しています。

1件だけデータを取得

<?php
$sample = $DB::table('テーブル名')->where('id',1)->first();
// IDを表示
echo $sample->id;
?>

あいまい検索(sampleという名前がつくものすべてを検索)

<?php
$sample = $DB::table('テーブル名')->where('name','like','%sample%')->first();
// IDを表示
echo $sample->name;
?>

名前がNULLになっている番号を検索

<?php
$sample = $DB::table('テーブル名')->whereNull('name')->first();
// IDを表示
echo $sample->id;
?>

名前がNOT NULLの番号を検索

<?php
$sample = $DB::table('テーブル名')->whereNotNull('name')->first();
// IDを表示
echo $sample->id;
?>

複数のデータを取得

<?php
$samples = $DB::table('テーブル名')->get();
if( isset($samples) && count($samples)>=1){
  // あるだけIDを表示
  foreach( $samples as $row ){
    echo $sample->id;
  }
}
?>

ページ送り付きで検索

<?php
// Contoroller内で定義
// samplesview.bladeというファイルがあることを前提
$limit = 30;
$samples = $DB::table('テーブル名')->paginate($limit);
return view('samplesview',compact('samples'));

// samplesview.blade内で定義
// ページ送りを表示
{{ $samples->render(); }}

//検索したinputデータを引き継ぎしたい場合
{{ $samples->appends('id', @$inputs['id'])->render(); }}
?>

OFFSETとLIMITの指定

<?php
$samples = $DB::table('テーブル名')->offset(0)->limit(5)->get();
if( isset($samples) && count($samples)>=1){
  // あるだけIDを表示
  foreach( $samples as $row ){
    echo $sample->id;
  }
}
?>

データ編集系(トランザクション込み)

<?php
// データの追加
DB::beginTransaction();
try
{
   $DB::table('テーブル名')->insert(array('id'=>1));
   $id = DB::getPdo()->lastInsertId();  //新規追加したIDを取得
   DB::commit();
} catch( \exception $e ) {
   DB::rollback();
}

// データ更新
DB::beginTransaction();
try
{
   $DB::table('テーブル名')->where('id',1)->update(array('name'=>'samplename'));
   DB::commit();
} catch( \exception $e ) {
   DB::rollback();
}

// データ削除
DB::beginTransaction();
try
{
   $DB::table('テーブル名')->where('id',1)->delete();
   DB::commit();
} catch( \exception $e ) {
   DB::rollback();
}
?>

Let’s Encrypt(レッツエンクリプト)でワイルドカードを設定する方法

#「ドメイン名」は設定するドメインに変更
#「*」はワイルドカード指定
#「メールアドレス」こちらも自前のアドレスに変更
./certbot-auto certonly --manual -d 「*.ドメイン名」 -m 「メールアドレス」 --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

上記のコマンドを流すと、TXTレコードにドメインと、認証コードを設定してくださいと案内が表示されますので、レジストラにて設定します。
↑(認証コードは、コマンドを流すたびに変更されるため、浸透されるまでそのまま放置)

ムームードメインだと下記の記述になります。

サブドメイン 種別 内容
_acme-challenge TXT 認証コード

即時反映されないため、下記のコマンドで確認します。

#「ドメイン名」は確認するドメインに変更
nslookup -q=txt _acme-challenge.「ドメイン名」

下記の内容が表示されれば、浸透したことになります。
※浸透に時間かかる場合もあるため、何回か試すことをおすすめします。

Non-authoritative answer:
_acme-challenge.「設定したドメイン」    text = 「設定した認証コード」

確認出来た後、認証コードが表示された画面で放置したのを進めることで、証明書が発行されます。

【PHP】CSVファイルの操作サンプル集

CSVファイルのプログラムを作るとき毎回忘れるためメモ。
※随時更新していきます。

CSVファイルの読み込み

<?php
$readPath = "ファイルのパス";
$filename = "ファイル名";
$file = new SplFileObject($readPath.$filename); 
$file->setFlags(SplFileObject::READ_CSV); 
foreach ( $file as $line ) {
	$records[] = $line;
}
?>

LaravelでSplFileObjectを使う場合

<?php
$readPath = "ファイルのパス";
$filename = "ファイル名";
$file = new \SplFileObject($readPath.$filename); 
$file->setFlags(\SplFileObject::READ_CSV); 
foreach ( $file as $line ) {
	$records[] = $line;
}
?>

「new \SplFileObject」「\SplFileObject::READ_CSV」に変更する。