見出し画像

[PHPでnotionAPI]データベースの更新

前回の記事でデータベースにデータを挿入する方法を紹介しました。

今回はnotionのAPIを使ってデータを更新する方法を紹介します。

データベースのデータを取得する

データベースにあるデータは1つ1つがpageになっています。タイトルのところのpageをクリックする事で、URLの中にpageのIDがあり、データを更新するときはそのIDを使いますが、URLから毎回取得するのは面倒なので、APIで取得していきます。

データを取得する公式ドキュメント

上記のドキュメントでは早速取得するためのPHPのプログラムを書きます

<?php
define('SECRET_KEY', '*********************************');

$target_db_id = "*********************************";

$post_data = [
   "filter"=>[
       "property"=> "Name",
       "text"=>[
           "equals"=>""
           ]
       ],
   ]
];


$header = array(
   'Authorization: Bearer ' . SECRET_KEY,
   'Content-Type: application/json',
   'Notion-Version: 2021-05-13',
);
$url = 'https://api.notion.com/v1/databases/' . $target_db_id . '/query';

$curl = curl_init($url);
//ヘッダー
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//POST
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post_data));

//tls1.2対応
curl_setopt($curl, CURLOPT_SSLVERSION, 6);


$result = curl_exec($curl);
echo "<pre>";
print_r(json_decode($result,true));
echo "</pre>";

上記のプログラムを実行すると、全てのデータが取得できます。条件を絞りたい場合は、

$post_data = [
   "filter"=>[
       "property"=> "Name",
       "text"=>[
           "equals"=>"●●●"
           ]
       ],
   ]
];

とすれば、タイトル(Name)に●●●が含まれるものだけ取得ができます。

また、

$post_data = [
   "filter"=>[
       "property"=> "Name",
       "text"=>[
           "equals"=>"●●●"
           ]
       ],
   "sorts"=> [//ソート
       [
           "property"=> "Name",
           "direction"=> "ascending"
       ]
   ]
];

と書くことで、Nameを基準に昇順に、並び替えをすることできます。降順に並べたいときはdescendingとすればOK。

上記は、Nameを基準に検索&並べ替えをしましたが、他の列を基準に同様に書くことで可能ですので是非試してみてください。

上記を実行することで以下のようなレスポンスを得られます。(jsonを配列に書き換えています)

Array
(
   [object] => list
   [results] => Array
       (
           [0] => Array
               (
                   [object] => page
                   [id] => 294c07bc-7fe6-43cf-96d9-9d2f52c532a2
                   [created_time] => 2021-06-02T08:03:56.256Z
                   [last_edited_time] => 2021-06-02T12:30:00.000Z
                   [parent] => Array
                       (
                           [type] => database_id
                           [database_id] => 012b79ee-5f83-4303-8155-99b10554c061
                       )

                   [archived] => 
                   [properties] => Array
                       (
                           [Tags] => Array
                               (
                                   [id] => HIBe
                                   [type] => select
                                   [select] => Array
                                       (
                                           [id] => X}FA
                                           [name] => a
                                           [color] => default
                                       )

                               )

                           [Name] => Array
                               (
                                   [id] => title
                                   [type] => title
                                   [title] => Array
                                       (
                                           [0] => Array
                                               (
                                                   [type] => text
                                                   [text] => Array
                                                       (
                                                           [content] => 連休の予定
                                                           [link] => 
                                                       )

                                                   [annotations] => Array
                                                       (
                                                           [bold] => 
                                                           [italic] => 
                                                           [strikethrough] => 
                                                           [underline] => 
                                                           [code] => 
                                                           [color] => default
                                                       )

                                                   [plain_text] => 連休の予定
                                                   [href] => 
                                               )

                                       )

                               )

                       )

               )

       )

   [next_cursor] => 
   [has_more] => 
)

この、idの部分が欲しいpageのIDになります。
これを使って、編集をしていきます。

編集してみる

公式ドキュメントはこちら

私はここで、かなり苦労しました。実際は単純なミスだったのですが、、、実際にエラーが出るプログラムは以下

<?php
define('SECRET_KEY', '*********************************');

$page_id = "294c07bc-7fe6-43cf-96d9-9d2f52c532a2";

$post_data = [
   "properties"=>[
       "Name"=>[
           "title"=>[
               [
                   "text"=>[
                       "content"=> "2342"
                   ]
               ]
           ]
       ],
   ]
];


$header = array(
   'Authorization: Bearer ' . SECRET_KEY,
   'Notion-Version: 2021-05-13',
   'Content-Type: application/json',
);
echo $url = 'https://api.notion.com/v1/pages/' . $page_id;

$curl = curl_init($url);
//ヘッダー
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//POST
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post_data));

//tls1.2対応
curl_setopt($curl, CURLOPT_SSLVERSION, 6);


$result = curl_exec($curl);
echo "<pre>";
print_r(json_decode($result,true));
echo "</pre>";

何が間違っているかわかりますか?エラー内容は、

Array
(
   [object] => error
   [status] => 400
   [code] => invalid_request_url
   [message] => Invalid request URL.
)

こんな感じ。リクエストしているURLが違うっぽい。pageのIDを間違えたか?何度見直してもあってる。pageのIDのハイフン(-)を消したり、、、色々試したのですがダメ。。。

問題がすぐにわかった方すごい!私は30分以上かかりました。。。
わかってしまうと、簡単すぎるのですが是非考えてみてください。

答えはワンコインの有料にさせていただきますm(_ _)m

エラーの原因(有料)

正解のスクリプトは、、、

ここから先は

1,061字

¥ 777

この記事が気に入ったらサポートをしてみませんか?