Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLOPT_POST定数の使い方

CURLOPT_POST定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURLOPT_POST定数は、PHPのcURL拡張機能において、HTTPのPOSTリクエストを有効にするための定数です。PHPのcURL拡張機能は、様々なプロトコルを利用して他のサーバーと通信を行うための強力な機能を提供しており、ウェブサイトのデータを取得したり、外部のAPIと連携したりする際に広く利用されます。このCURLOPT_POST定数を使用することで、開発者はcURLを通じてデータをサーバーに送信するHTTP POSTメソッドを指定できるようになります。

具体的には、curl_setopt()関数にこの定数とtrue(または1)の値を渡すことで、現在のcURLセッションがHTTP POSTリクエストとして実行されるように設定されます。例えば、ウェブサイトのログインフォームの入力データをサーバーに送信したり、RESTful APIへJSON形式のデータを送ったりする際に、このCURLOPT_POST定数を設定することが不可欠です。

POSTリクエストで実際に送信するデータは、通常CURLOPT_POSTFIELDSという別のオプションを使って指定します。CURLOPT_POST定数はあくまで「これはPOSTリクエストである」という情報をcURLに伝える役割を果たし、データの具体的な内容はCURLOPT_POSTFIELDSが担当します。これにより、クライアントからサーバーへ安全かつ確実にデータを送信する処理を、PHPプログラム内で柔軟に制御することが可能となります。システム開発においてデータのやり取りは非常に重要ですので、この定数の役割を理解しておくことは、ウェブアプリケーション開発の基本となります。

構文(syntax)

1<?php
2$ch = curl_init();
3curl_setopt($ch, CURLOPT_POST, true);
4curl_close($ch);
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURLでPOSTリクエストを送信する

1<?php
2
3/**
4 * 指定されたURLにPOSTリクエストを送信し、その結果を返します。
5 *
6 * この関数はCURLOPT_POSTおよびCURLOPT_POSTFIELDSを使用して、
7 * HTTP POSTメソッドでデータを送信する方法を示します。
8 *
9 * @param string $url POSTリクエストを送信するターゲットURL。
10 * @param array $postData 送信するPOSTデータの連想配列 (例: ['key' => 'value'])。
11 * @return string|false 成功した場合はレスポンス文字列、失敗した場合は false を返します。
12 */
13function sendPostRequest(string $url, array $postData)
14{
15    // cURLセッションを初期化します
16    $ch = curl_init();
17
18    // cURLオプションを設定します
19    // リクエストを送信するURLを設定します
20    curl_setopt($ch, CURLOPT_URL, $url);
21    // HTTPリクエストメソッドをPOSTに設定します
22    curl_setopt($ch, CURLOPT_POST, true);
23    // POSTで送信するデータを設定します。連想配列はcURLによって自動的にURLエンコードされます。
24    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
25    // レスポンスを直接出力せず、文字列として取得するように設定します
26    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
27    // レスポンスヘッダーを結果に含めないように設定します
28    curl_setopt($ch, CURLOPT_HEADER, false);
29    // SSL証明書の検証をスキップする場合(テスト環境などで使用、本番環境では非推奨)
30    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
31    // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
32
33    // cURLセッションを実行し、レスポンスを取得します
34    $response = curl_exec($ch);
35
36    // エラーが発生した場合はエラーメッセージを出力します
37    if (curl_errno($ch)) {
38        echo 'cURLエラー: ' . curl_error($ch) . "\n";
39        $response = false;
40    }
41
42    // cURLセッションを閉じ、リソースを解放します
43    curl_close($ch);
44
45    return $response;
46}
47
48// --- 関数利用のサンプル ---
49
50// テスト用のPOSTエコーサービス(送信されたPOSTデータをJSON形式で返します)
51$targetUrl = 'https://httpbin.org/post';
52
53// 送信するデータ
54$dataToSend = [
55    'username' => 'php_user',
56    'password' => 'secure_password_123',
57    'message' => 'Hello from PHP cURL!',
58];
59
60echo "POSTリクエストを送信中...\n";
61echo "URL: " . $targetUrl . "\n";
62echo "送信データ: " . json_encode($dataToSend) . "\n\n";
63
64// sendPostRequest関数を呼び出し、POSTリクエストを送信します
65$result = sendPostRequest($targetUrl, $dataToSend);
66
67// 結果を表示します
68if ($result !== false) {
69    echo "--- レスポンス --- \n";
70    echo $result . "\n";
71    // レスポンスがJSONの場合、デコードして整形することも可能です
72    // $decodedResponse = json_decode($result, true);
73    // if ($decodedResponse) {
74    //     echo "--- デコードされたレスポンス ---\n";
75    //     print_r($decodedResponse);
76    // }
77} else {
78    echo "POSTリクエストの送信に失敗しました。\n";
79}
80
81?>

PHPのCURLOPT_POSTは、HTTPリクエストをPOSTメソッドで送信するために使用されるcURLオプションです。このオプションにtrueを設定することで、cURLは指定されたURLに対し、データを付加したPOSTリクエストを発行するようになります。

提供されたサンプルコードでは、sendPostRequest関数が定義されており、引数として送信先のURL(string $url)と、POSTするデータを含む連想配列(array $postData)を受け取ります。この関数は、POSTリクエストの実行結果を文字列(成功時)またはfalse(失敗時)として返します。

関数内でcurl_init()によりcURLセッションが初期化された後、curl_setopt()関数を使って様々な設定が行われます。 curl_setopt($ch, CURLOPT_POST, true);という行は、このリクエストがPOSTメソッドで行われることをcURLに指示するものです。これにより、データ送信の準備が整います。 続いて、curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);によって、実際に送信するデータが指定されます。このオプションには、キーと値のペアを持つ連想配列を渡すことができ、cURLは自動的にそのデータを適切な形式にURLエンコードしてPOSTします。

その他の重要な設定として、CURLOPT_URLでリクエストの送信先URLを指定し、CURLOPT_RETURNTRANSFERtrueにすることで、cURLの実行結果を直接出力するのではなく、文字列として取得できるようにしています。 これらの設定を組み合わせることで、PHPから柔軟にHTTP POSTリクエストを送信し、Webサービスとの連携を実現できるのです。

このサンプルコードでは、CURLOPT_POSTでHTTP POSTメソッドを有効にし、CURLOPT_POSTFIELDSで送信データを設定します。CURLOPT_POSTFIELDSに連想配列を渡すと、cURLが自動でURLエンコードを行うため、一般的なフォームデータ送信に便利です。しかし、JSON形式などでデータを送信する場合は、データの手動エンコードと適切なContent-Typeヘッダー(例: application/json)の設定が必要になることに注意してください。

セキュリティ上、コメントアウトされているCURLOPT_SSL_VERIFYPEERなどのSSL証明書検証スキップオプションは、テスト環境でのみ一時的に利用し、本番環境では必ず有効にする必要があります。検証を無効にすると、通信が危険にさらされる可能性があります。また、curl_exec後のcurl_errnoでエラーを必ず確認し、処理の最後にはcurl_closeでcURLセッションのリソースを確実に解放しましょう。これらの点を守ることで、安全で安定したコード運用が可能です。

PHP cURLで配列POST送信する

1<?php
2
3/**
4 * 指定されたURLに配列データをHTTP POSTリクエストで送信します。
5 *
6 * この関数はCURL拡張機能を使用して、WebサービスやAPIにデータを送信する基本的な方法を示します。
7 * 特に、CURLOPT_POST オプションを true に設定してPOSTリクエストを有効にし、
8 * CURLOPT_POSTFIELDS オプションに連想配列を渡してフォームデータを送信する例です。
9 *
10 * @param string $url リクエストを送信するターゲットURL。
11 * @param array $postData POSTで送信する連想配列形式のデータ。
12 * @return string|false 成功した場合はサーバーからのレスポンス本文、失敗した場合は false。
13 */
14function sendPostRequestWithArray(string $url, array $postData)
15{
16    // 1. cURLセッションを初期化します。
17    $ch = curl_init();
18
19    // 初期化に失敗した場合はエラーログを出力し、処理を終了します。
20    if ($ch === false) {
21        error_log('cURLセッションの初期化に失敗しました。');
22        return false;
23    }
24
25    // 2. cURLセッションのオプションを設定します。
26
27    // リクエストの送信先URLを設定します。
28    curl_setopt($ch, CURLOPT_URL, $url);
29
30    // HTTP POST リクエストを使用することを cURL に指示します。
31    // CURLOPT_POST を true に設定することで、POSTメソッドが有効になります。
32    curl_setopt($ch, CURLOPT_POST, true);
33
34    // POSTで送信するデータを設定します。
35    // 連想配列を CURLOPT_POSTFIELDS に渡すと、cURLは自動的にデータを
36    // "application/x-www-form-urlencoded" 形式でエンコードして送信します。
37    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
38
39    // サーバーからのレスポンスを文字列として受け取るように設定します。
40    // これを true にしない場合、レスポンスは直接出力されます。
41    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
42
43    // 3. 設定したオプションでリクエストを実行し、レスポンスを取得します。
44    $response = curl_exec($ch);
45
46    // 4. エラーが発生したかどうかを確認します。
47    if (curl_errno($ch)) {
48        $error_message = curl_error($ch);
49        error_log('cURLエラーが発生しました: ' . $error_message);
50        curl_close($ch); // エラー時はセッションを閉じてから終了します。
51        return false;
52    }
53
54    // 5. cURLセッションを終了し、リソースを解放します。
55    curl_close($ch);
56
57    // 成功したレスポンスを返します。
58    return $response;
59}
60
61// ---------- 関数使用例 ----------
62
63// POSTリクエストを送信するターゲットURLを指定します。
64// これは一般的なテスト用の公開APIエンドポイントです。
65// 例: JSONPlaceholderはダミーのPOSTリクエストを受け付け、
66// 送信されたデータを含むレスポンスを返します。
67$targetUrl = 'https://jsonplaceholder.typicode.com/posts';
68
69// POSTで送信したいデータを連想配列として準備します。
70$dataToSend = [
71    'title' => 'PHP cURL Example',
72    'body' => 'This is a test POST request with array data.',
73    'userId' => 101,
74];
75
76echo "POSTリクエストを送信中... URL: " . $targetUrl . "\n";
77echo "送信データ: " . json_encode($dataToSend, JSON_UNESCAPED_UNICODE) . "\n\n";
78
79// sendPostRequestWithArray 関数を呼び出してリクエストを実行します。
80$responseContent = sendPostRequestWithArray($targetUrl, $dataToSend);
81
82// レスポンスの内容に応じて結果を表示します。
83if ($responseContent !== false) {
84    echo "--- 成功: サーバーからのレスポンス ---\n";
85    echo $responseContent . "\n";
86} else {
87    echo "--- 失敗: POSTリクエストの送信に失敗しました ---\n";
88}
89
90?>

このPHPサンプルコードは、CURL拡張機能を利用して、指定されたURLへHTTP POSTリクエストで配列データを送信する方法を示しています。システムエンジニアにとって、WebサービスやAPI連携でデータを送受信する際の基本的な実装パターンとなります。

中心となるのはsendPostRequestWithArray関数です。この関数は、引数としてリクエストを送信するターゲットURLと、POSTで送信したいデータを連想配列形式で受け取ります。内部ではまずcurl_init()でcURLセッションを初期化し、様々なオプションを設定します。

特に重要なのはcurl_setopt($ch, CURLOPT_POST, true);という設定です。これはcURLに対して、このリクエストをHTTP POSTメソッドで送信するように指示するもので、CURLOPT_POSTtrueにすることでPOSTリクエストが有効になります。また、curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);では、実際に送信するデータとして連想配列$postDataを指定しています。cURLは連想配列を受け取ると、自動的にデータを「application/x-www-form-urlencoded」形式にエンコードして送信してくれるため、非常に手軽にフォームデータを扱えます。

その他の設定として、CURLOPT_RETURNTRANSFERtrueにすることで、サーバーからのレスポンスを直接出力せず、関数の戻り値として文字列で受け取れるようにしています。オプション設定後、curl_exec()でリクエストを実行し、エラーがなければサーバーからのレスポンス本文が関数の戻り値として返されます。もしエラーが発生した場合はfalseが返される設計です。最後にcurl_close()でcURLセッションを終了し、リソースを解放します。

コードの後半には、https://jsonplaceholder.typicode.com/postsという公開APIエンドポイントを例に、実際にこの関数を使ってデータを送信し、レスポンスを表示する具体的な使用例が示されており、一連の処理の流れを学ぶことができます。

CURLOPT_POSTはPOSTリクエストを有効にする設定です。CURLOPT_POSTFIELDSに配列を渡すと自動的にURLエンコードされますが、JSON形式でデータを送りたい場合は、json_encodeで文字列化しContent-Typeヘッダー設定も必須です。ネットワーク通信ではエラーが頻発するため、curl_initcurl_execのエラーはcurl_errnoで確認し対処しましょう。使用後はcurl_closeでリソース解放を忘れずに。CURLOPT_RETURNTRANSFERtrueでないとレスポンスが直接出力されるため注意が必要です。

関連コンテンツ