http_build_queryで空文字を送信する

空文字…じゃなくて空に文字

おまとめ三行

http_build_queryに関するお話
値を空にして送信したい場合
「''」を使えってことですね

http_build_queryで配列からクエリ文字列を作成する場合の話です。

普通はこんな感じになる。

$array = array(
  'key1' => 'value1',
  'key2' => 'value2',
);
$query = http_build_query($array);
echo $query;

//生成されるクエリ
key1=value1&key2=value2

ではここで値を空にして送信したい場合、どのパターンならいけるか。「false」「null」「”」「array()」の4パターンに対してhttp_buil_queryを使うとこんなクエリ文字になります。

$array = array(
  'key1' => false,
  'key2' => null,
  'key3' => '',
  'key4' => array(),
);
$query = http_build_query($array);
echo $query;

//生成されるクエリ
key1=0&key3=

nullやarray()はクエリ文字から除外されてしまいます。falseはブール代数的に0なので0になる。だからキーだけ渡したい場合は「”」を使えってことですね。



ちょいおまけの話。

curlを使って多次元配列のデータをPOSTする際、データが「Array」という文字列になってしまうことがあるかと思います。

$post = array(
  'key1' => 'value1',
  'key2' => array('aaa', 'bbb'),
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_URL, '送信先のURL');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_exec($ch);
curl_close($ch);

//key2のArrayが文字列になっている
Array(
  [key1] => value1
  [key2] => Array
)

こういうときは「key2[aaa]」みたい明示的なキーの書き方をしてのも良いのですが、配列が複雑になる可能性があるならhttp_build_queryを使う方が手っ取り早いと思います。

//明示的に書く場合
$post = array(
  'key1' => 'value1',
  'key2[aaa]' => 'bbb',
);

//http_build_queryを使う場合
$post = array(
  'key1' => 'value1',
  'key2' => array('aaa' => 'bbb'),
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_URL, '送信先のURL');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_exec($ch);
curl_close($ch);

//key2の中身も配列になっている
Array(
  [key1] => value1
  [key2] => Array(
    [aaa] => bbb
  )
)

まだコメントはいただけてないみたい……
 もしかしたら何か関連しているかも?