Blog Posts » PHP » Sempat dibuat pusing oleh http_build_query

Sempat dibuat pusing oleh http_build_query

Fungsi http_build_query adalah untuk membuat URL-encoded query string dari sebuah array/object. Lihat contoh berikut ini:
[Textarea][RAW][Download]

  1. $data = array('foo'=>'bar',
  2.               'baz'=>'boom',
  3.               'cow'=>'milk',
  4.               'php'=>'hypertext processor');
  5. echo http_build_query($data);


Contoh diatas pada PHP 5.2.x (server website ini) menghasilkan:
[Textarea][RAW][Download]

  1. foo=bar&baz=boom&cow=milk&php=hypertext+processor


Sedangkan kasus pada script saya, setelah http_build_query saya tambahkan htmlspecialchars sehingga & (ampersand) akan berubah menjadi &:
[Textarea][RAW][Download]

  1. echo htmlspecialchars(http_build_query($data));
  2. // Hasil: foo=bar&baz=boom&cow=milk&php=hypertext+processor


Namun berhubung di localhost saya menggunakan PHP versi 5.3.x ternyata hasilnya jadi seperti ini:
[Textarea][RAW][Download]

  1. foo=bar&baz=boom&cow=milk&php=hypertext+processor

Sebelumnya saya tidak tahu perbedaan tsb. Saya cek berulang-ulang kode saya sampai pusing tetapi belum juga menemukan kesalahan yang saya buat. Anehnya, jika saya menghilangkan htmlspecialchars akan normal hasilnya seperti di PHP 5.2.x. Apakah ini berarti di PHP 5.3.x pemisah standarnya tidak & tetapi &?? Maka jika menambahkan htmlspecialchars jadinya &.

Ternyata benar, saya baca lagi php.net nemu komentar dari v0idnull begini: "on my install of PHP 5.3, http_build_query() seems to use & as the default separator..." *whata :D

Nah jalan satu-satunya adalah tidak lagi menggunakan htmlspecialchars tetapi menetapkan separator/pemisah standar di opsi yang telah disediakan pada fungsi http_build_query. Seperti ini:
[Textarea][RAW][Download]

  1. echo http_build_query($data, '', '&');


Hasilnya akan sama baik di PHP 5.2.x maupun PHP 5.3.x:
[Textarea][RAW][Download]

  1. foo=bar&baz=boom&cow=milk&php=hypertext+processor

Sekian dulu curhatnya :D