【PHP】PHPでスクレイピングをする

php-simple-html-dom-parserというライブラリを使う。

sourceforge.net

↑からライブラリをダウンロードしてプログラムを書くファイルと同じディレクトリに保存する。

f:id:daaaichifu:20201204033816p:plain
同じディレクト

<?php
// simple_html_dom.phpの読み込み
require_once "simple_html_dom.php";

// スクレイピングしたいサイトのURL
$url = "https://www.example.com";

// $urlからオブジェクトを生成
$html = file_get_html($url);

// 上記URLのページの1つ目のpタグを取得して出力。
// 1つ目のパラメータでタグを指定、2つ目のパラメーターで何番目かを指定
print_r($html->find("p", 0)->plaintext);

【CakePHP3】patchEntityの使い方

よくあるpatchEntityの使い方の例は、

$post = $this->Posts->get(1);
$this->Posts->patchEntity($post, $this->request->getData());
$this->Posts->save($post);

こんな感じで、対象のデータを変数に格納して、そのデータにフォームから送られてきたデータで更新するみたいな感じだと思いますが、

これではフォームから送られてきたデータでそのまま更新されてしまうのでちょっとだけデータをいじりたいときどうやるんだろうってなりました。

調べてみたところ、$this->request->getData()には連想配列で値が格納されているらしいので、自分で連想配列を作って、それをpatchEntityに渡せば更新できるっぽいです。

例えば、postsテーブルのカラムがid, title, contents だとしたら、

$post = $this->Posts->get(1);
$data = [
    'title' => 更新したい値,
    'contents' => 更新したい値,
]
$this->Posts->patchEntity($post, $data)
$this->Posts->save($post);

これでデータを少しいじったりして、値の更新ができます。

また特定のカラムのみ値を更新したい場合は、

$this->Post->patchEntity($post, $data, [
    'fields' => ['カラム1'、'カラム2']
]);

としてあげれば、意図していないカラムの更新を防ぐことができるっぽいです。