RSS
email

Senin, 13 Juni 2011

Fakta Seputar Query INSERT di SQL

Kita tentu telah mengenal bentuk query yang satu ini. Ya… query INSERT dalam database yang mendukung SQL digunakan untuk menyisipkan record atau data ke dalam tabel. Saya kira mengenal saja tidak cukup, tapi lebih dari itu kita harus bisa menggunakannya dengan baik dan benar, seperti halnya berbahasa Indonesia :-) (gak nyambung ya…)
Mungkin ada di antara Anda yang protes pada saya, ngapain sih kok nulis artikel ini. Kan query INSERT itu mudah sekali. Iya sih.. mudah bagi Anda yang sudah expert tapi hal baru bagi para newbie. Toh… Anda dulu (yang expert) pernah jadi newbie juga :-)
Alasan ditulisnya artikel ini tak lain adalah sering saya jumpai keluhan baik itu rekan2 sesama programmer pemula, mahasiswa maupun pengunjung blog ini yang sering gagal dalam menjalankan query INSERT ini. Salah satunya adalah pengunjung blog saya ini. Mereka menganggap query SQL yang diberikan sudah benar, tapi mengapa data atau record tak jua tersimpan dalam tabel. Mudah-mudahan dengan artikel ini bisa sedikit menjawab semua kesulitan yg dihadapi tsb.
OK… untuk studi kasus, misalkan saya berikan sebuah tabel sebagai berikut
1.CREATE TABLE sampel (
2.  field1 int(11) auto_increment,
3.  field2 varchar(10),
4.  field3 date,
5.  field4 float,
6.  field5 text,
7.  PRIMARY KEY  (field1)
8.);
Dalam tabel tersebut saya sengaja memberikan beberapa variasi tipe data pada setiap fieldnya, dengan Primary Key nya adalah ‘field1′ dengan tipe data integer dan auto increment.
Nah.. secara umum, bila kita ingin menyisipkan sebuah record ke dalam tabel menggunakan query SQL maka menggunakan sintaks sbb:
1.INSERT INTO namaTabel (field1, field2, field3, ..., fieldn)
2.         VALUES ('value1', 'value2', 'value3', ..., 'valuen');
Sintaks tersebut memiliki makna kita akan menyisipkan data atau record dengan ‘value1′ merupakan nilai yang bersesuaian dengan ‘field1′, ‘value2′ bersesuaian dengan ‘field2′, dst.
Namun… yang menjadi pertanyaan adalah, Apakah susunan urutan penulisan field dalam query INSERT tersebut harus selalu sama dengan urutan field dalam tabel? Jawabnya adalah TIDAK. Anda bisa saja membolak-balik urutan field dalam penulisan query nya, asal… valuenya juga menyesuaikan. Contohnya:
1.INSERT INTO namaTabel (field2, field1, field3, ..., fieldn)
2.         VALUES ('value2', 'value1', 'value3', ..., 'valuen');
Trus.. ada pertanyaan lagi yang lain, Apakah dalam menuliskan query INSERT ini semua field dalam tabel harus dituliskan setelah nama tabel? Jawabnya adalah TIDAK. Anda dapat menyisipkan record hanya pada field-field tertentu saja. Contohnya kita akan menyisipkan record pada tabel studi kasus di atas hanya pada ‘field2′, dan ‘field3′ saja
1.INSERT INTO sampel (field2, field3)
2.         VALUES ('Hallo', '2009-10-12');
Catatan:
khusus untuk tipe data DATE, format value yang bisa disimpan adalah dalam bentuk ‘yyyy-mm-dd’.
Mungkin Anda bertanya lagi, Bagaimana bila tabel tersebut memuat field yang merupakan ‘AUTO INCREMENT’? value dalam query INSERT nya diisi dengan apa?
Ya… karena dia auto increment, nama field dan value tidak usah dituliskan, karena nanti akan diisi secara otomatis oleh sistem. Sebagai contoh adalah query berikut ini yang menyisipkan record pada tabel ‘sampel’ di atas pada semua field kecuali ‘field1′ yang merupakan auto increment.
1.INSERT INTO sampel (field2, field3, field4, field5)
2.         VALUES ('Hallo', '2009-10-12', '2.89', 'Ini Sebuah Text');
Perhatikan contoh query di atas, bahwa untuk semua value, tidak peduli tipe data fieldnya apa, diapit dengan tanda petik.
Oya.. harap hati-hati dengan penggunaan bentuk query ini, karena field-field yang merupakan PRIMARY KEY (namun bukan AUTO INCREMENT) harus diisikan valuenya.
Sebagai contoh, misalkan suatu tabel terdapat 3 field ‘field1′, ‘field2′, dan ‘field3′ dimana ‘field1′ nya merupakan PRIMARY KEY (bukan auto increment).
Jika kita berikan query INSERT sbb:
1.INSERT INTO namaTabel (field2, field3)
2.         VALUES ('value2', 'value3');
maka akan terjadi ERROR, karena ‘field1′ nantinya akan kosong (tidak ada valuenya).
Selain bentuk atau sintaks query yang disebutkan di atas, ada pula query INSERT dengan bentuk sbb:
1.INSERT INTO namaTabel
2.         VALUES ('value1', 'value2', ..., 'valuen');
Perbedaan yang kentara dari query ini dengan sebelumnya hanyalah tidak menyebutkan nama-nama field pada query.
Nah… apa perbedaan makna penulisan query tersebut dengan sebelumnya?
Ya.. perbedaannya adalah, bahwa dengan bentuk query tersebut, Anda harus urut dalam menuliskan valuenya (sesuai urutan field dalam tabel) dan juga jumlah value yang Anda tuliskan harus sama dengan jumlah field yang ada dalam tabel tersebut, atau dengan kata lain bentuk query INSERT tersebut akan mengisi record untuk semua field yang ada dalam tabel.
Sebagai contoh misalkan dalam suatu tabel terdapat field dengan urutan sbb:
field1, field2, field3
dan kemudian Anda memberikan query INSERT sbb:
1.INSERT INTO namaTabel
2.          VALUES ('value1', 'value2', 'value3');
maka ‘value1′ ini akan mengisi ‘field1′, ‘value2′ mengisi ‘field2′ dan ‘value3′ mengisi ‘field3′ (sesuai urutan field dalam tabel)
Sedangkan jika Anda menuliskan query INSERT sbb:
1.INSERT INTO namaTabel
2.          VALUES ('value1', 'value2');
maka akan terjadi error, karena jumlah field dalam tabel tidak sama dengan jumlah valuenya.
Trus… mungkin ada pertanyaan lagi, jadi… bisakah kita gunakan bentuk query INSERT terakhir ini untuk menyisipkan record ke dalam tabel yang di dalamnya terdapat auto increment? Jawabnya adalah.. sebaiknya JANGAN, karena field auto increment ini akan diisi otomatis oleh sistem, jadi.. sebaiknya gunakan bentuk sintaks INSERT pertama di atas.
OK… mudah-mudahan artikel ini bermanfaat bagi Anda, terutama yang masih sering salah dalam menyisipkan record ke dalam tabel.

Download Disini

Perintah SQL (SELECT) untuk Multi Tabel (Bag. 1)

Pada artikel ini akan diberikan beberapa contoh perintah SQL yang diimplementasikan pada multi tabel. Adapun perintah SQL untuk manipulasi data pada satu tabel, saya yakin hal ini cukup mudah bagi Anda. Dalam contoh ini akan diambil studi kasus tentang pengambilan matakuliah mahasiswa.
Tabel-tabel yang dibuat pada studi kasus ini cukup sederhana saja untuk memudahkan pemahaman. Adapun tabel-tabel tersebut adalah:
1.mhs (
2.nim varchar(3),
3.namaMhs varchar(30),
4.primary key(nim)
5.)
1.mk (
2.kodeMK varchar(3),
3.namaMK varchar(30),
4.sks integer,
5.primary key(kodeMK)
6.)
1.ambilMK (
2.nim varchar(3),
3.kodeMK varchar(3),
4.nilai integer,
5.primary key(nim, kodeMK)
6.)
Dalam hal ini, field nim dan kodeMK pada tabel ambilMK merupakan foreign key. Apabila diperhatikan, tabel mhs dengan tabel ambilMK saling berelasi karena nim dalam tabel ambilMK berasal dari nim dalam tabel mhs (master tabel).
Demikian pula antara tabel mk dengan ambilMK. Kedua tabel ini juga berelasi karena kodeMK dalam tabel ambilMK berasal dari kodeMK dalam tabel mk.
Untuk record masing-masing tabel, misalkan diberikan berikut ini:
Tabel : mhs
1.nim    namaMhs
2.001    Joko
3.002    Amir
4.003    Budi
Tabel : mk
1.kodeMK    namaMK        sks
2.A01       Kalkulus      3
3.A02       Geometri      2
4.A03       Aljabar       3
Tabel : ambilMK
1.nim    kodeMK    nilai
2.001    A01         3
3.001    A02         4
4.001    A03         2
5.002    A02         3
6.002    A03         2
7.003    A01         4
8.003    A03         3
Selanjutnya misalkan akan dicari data-data sbb:
  1. Tampilkan nim dan nama mahasiswa yang mengambil Kalkulus (kodeMK = A01)
  2. Tampilkan nim, nama mahasiswa dan jumlah SKS matakuliah yang diambil untuk setiap mahasiswa
  3. Berapakah IPK mahasiswa bernama Budi (NIM: 003)
  4. Tampilkan nim, nama mahasiswa, dan IPK setiap mahasiswa
Untuk menjawab no. 1, kita harus cari dulu tabel mana yang terkait dengan query tersebut. Apabila kita akan mencari query tersebut berdasarkan nama matakuliah ‘Kalkulus’ maka tabel yang terkait adalah mhs (untuk menampilkan nim dan nama mahasiswa), mk (karena dalam tabel ini terdapat nama matakuliah), serta tabel ambilMK (karena tabel ini berisi data pengambilan matakuliah oleh mahasiswa).
Setelah menentukan tabel mana yang terkait dengan query, selanjutnya dapat dibuat statement SQL nya, yaitu
1.SELECT mhs.nim, mhs.namaMhs
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
4.AND mk.namaMK = 'Kalkulus';
Maksud mhs.nim, maksudnya adalah menampilkan data nim yang berasal dari tabel mhs. Dapat pula Anda menuliskan SQL nya seperti ini
1.SELECT ambilMK.nim, mhs.namaMhs
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
4.AND mk.namaMK = 'Kalkulus';
Hal ini dikarenakan untuk menampilkan nim dapat pula berasal dari tabel ambilMK.
Perhatikan bagian FROM dari kedua statement SQL di atas. Nama-nama tabel yang terkait dengan query dituliskan pada bagian FROM ini.
Selanjutnya apa maksud dari perintah mhs.nim = ambilMK.nim? Perintah ini digunakan untuk merelasikan tabel mhs dan ambilMK, dimana kedua tabel direlasikan melalui field nim di kedua tabel. Hal yang sama juga berlaku untuk perintah mk.kodeMK = ambilMK.kodeMK.
Sedangkan perintah mk.namaMK = ‘Kalkulus’ digunakan sebagai syarat pencarian data (menampilkan data mahasiswa yang mengambil matakuliah Kalkulus).
Apabila pencarian data mahasiswa yang mengambil Kalkulus ini berdasarkan kode matakuliah (A01), maka Anda tidak perlu menggunakan tabel mk, tapi cukup tabel mhs dan ambilMK saja. Hal ini dikarenakan kodeMK dapat diketahui dari tabel ambilMK. Sehingga perintah SQL nya
1.SELECT mhs.nim, mhs.namaMhs
2.FROM mhs, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND ambilMK.kodeMK = 'A01';
Ketiga statement SQL di atas akan menghasilkan hasil yang sama yaitu
1.NIM    namaMhs
2.001    Joko
3.003    Budi
Selanjutnya akan dijawab pertanyaan no. 2. Seperti halnya langkah penyelesaian pertanyaan no. 1, langkah pertama harus kita tentukan dulu tabel apa saja yang terkait dengan query. Dalam hal ini kita akan menggunakan tabel mhs, mk dan ambilMK. Tabel mhs untuk menampilkan nim dan nama mahasiswa. Tabel mk digunakan karena di dalamnya terdapat data SKS. Sedangkan tabel ambilMK digunakan karena berisi data yang menunjukkan pengambilan matakuliah mahasiswa.
Perintah SQL untuk pertanyaan no. 2 adalah
1.SELECT mhs.nim, mhs.namaMhs, sum(mk.sks) as jumlahSKS
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
4.GROUP BY ambilMK.nim
atau
1.SELECT mhs.nim, mhs.namaMhs, sum(mk.sks) as jumlahSKS
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
4.GROUP BY mhs.nim
Untuk mencari jumlah SKS setiap mahasiswa, kita menggunakan perintah sum(mk.sks). Supaya perintah ini bisa jalan, maka harus ditambahkan perintah GROUP BY mhs.nim atau GROUP BY ambilMK.nim. Hal ini dikarenakan proses penjumlahan sks harus dilakukan pada setiap kelompok data. Maksudnya apa ya?
Perhatikan perintah SQL berikut ini
1.SELECT mhs.nim, mhs.namaMhs, mk.sks
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
Perintah di atas akan menampilkan nim, nama mahasiswa serta sks setiap mata kuliah yang diambil. Hasilnya adalah
1.NIM    namaMhs        SKS
2.001    Joko               3
3.001    Joko               2
4.001    Joko               3
5.002    Amir               2
6.002    Amir               3
7.003    Budi               3
8.003    Budi               3
Untuk pertanyaan no. 2 ini, seharusnya akan tampil hasil berikut
1.NIM    namaMhs        jumlahSKS
2.001    Joko              8
3.002    Amir              5
4.003    Budi              6
Sehingga supaya mendapatkan hasil seperti di atas, kita akan menjumlahkan setiap SKS yang diambil mahasiswa, berdasarkan kelompok mahasiswa, dalam hal ini dikelompokkan berdasarkan NIM. Mengapa tidak dikelompokkan berdasarkan nama mahasiswa? Wah bisa gawat kalau ini terjadi, karena ada kemungkinan  nama mahasiswa yang sama. Oleh karena itu harus ada perintah GROUP BY mhs.nim

Adapun pertanyaan no. 3  adalah bagaimana perintah SQL untuk menampilkan IPK dari mahasiswa berNIM ’003′?
Untuk membuat SQL dari query di atas, lagi-lagi langkah pertama adalah menentukan di tabel mana kita akan bekerja. Apabila Anda perhatikan, maka tabel yang dipilih adalah mk dan ambilMK. Mengapa demikian? Tabel mk digunakan untuk mengambil informasi terkait dengan sks matakuliah yang diambil mahasiswa dan tabel ambilMK berisi informasi daftar matakuliah yang diambil mahasiswa.
Nah… , setelah Anda menentukan tabel yang digunakan, selanjutnya Anda harus tahu formula untuk menghitung IPK. Apa rumusnya? yaitu jumlah dari perkalian sks dan nilai yang diambil mahasiswa dibagi dengan jumlah sks yang diambil mahasiswa.
OK begitu Anda tahu rumusnya, langsung dapat diimplementasikan ke SQL, yaitu
1.SELECT sum(ambilMK.nilai * mk.sks)/sum(mk.sks) as IPK
2.FROM ambilMK, mk
3.WHERE ambilMK.kodeMK = mk.kodeMK
4.AND ambilMK.nim = '003';
Dari SQL di atas, Anda akan memperoleh hasil IPK mhs bernim ’003′ adalah 3.5
Hikmah dari contoh kasus pencarian IPK ini adalah, apabila Anda membuat sistem untuk pencatatan nilai siswa seperti sistem informasi akademik dan sejenisnya, sebaiknya data IP atau IPK jangan disimpan dalam tabel, melainkan melalui proses query. Apabila data IP atau IPK tersimpan ke dalam tabel, maka kemungkinan terjadi ketidakkonsistenan data semakin besar. Bisa jadi IP atau IPK yang tersimpan di tabel berbeda dengan kenyataan berdasarkan nilai-nilai matakuliah yang diperoleh siswa. Lagipula jika data-data IP dan IPK disimpan dalam tabel, maka hanya akan menambah penuh database Anda :-)
OK… selanjutnya akan kita bahas untuk pertanyaan no. 4, yaitu bagaimana statement SQL untuk menampilkan nim, nama dan nilai IPK semua mahasiswa.
Nah… kalau pertanyaan ini, kita harus menggunakan semua tabel, yaitu mhs, mk dan ambilMK.Tabel mhs diperlukan karena untuk menampilkan nama mahasiswa, bisa juga untuk nim. Tapi nim juga dapat ditampilkan melalui tabel ambilMK.
Bagaimana statement SQL nya?
1.SELECT mhs.nim, mhs.namaMhs, 
2.       sum(ambilMK.nilai * mk.sks)/sum(mk.sks) as IPK
3.FROM mhs, ambilMK, mk
4.WHERE mhs.nim = ambilMK.nim AND ambilMK.kodeMK = mk.kodeMK
5.GROUP BY mhs.nim
Mengapa harus ada perintah GROUP BY mhs.nim? Hal ini karena perhitungan IPK dapat dilakukan setelah data dikelompokkan berdasarkan nim, mengingat seorang mahasiswa dapat mengambil matakuliah lebih lebih dari satu.

Download Disini

Membuat Script PHP Import Data MS. Excel Ke MySQL

Sebenarnya topik tentang cara membuat script import data excel ke mysql sudah banyak ditanyakan rekans pengunjung setia blog ini. Namun… maaf baru sempat kali ini membuat artikelnya :-)
Mengapa script import data Excel ke MySQL ini perlu dibuat? ya.. karena tool-tool seperti phpMyAdmin belum mendukungnya. Kalau tidak salah phpMyAdmin hanya mendukung import data dalam bentuk format SQL maupun CSV. Sebenarnya ada sih tool yang mendukung import data dalam format Excel, seperti Navicat dan SQLyog. Namun keduanya adalah tool berbayar :-(
Nah… untuk membuat script import data Excel ke MySQL ini nanti kita akan memanfaatkan class PHPExcelReader yang dibuat oleh Vadim Tkachenko. Class ini sebenarnya hanya diperuntukkan untuk membaca file Excel saja, namun dengan sedikit modifikasi dan pengembangan dapat kita gunakan untuk melakukan import data Excel ke MySQL.
Oya… file Excel yang bisa dibaca oleh class PHPExcelReader ini untuk sementara hanya yang di bawah MS. Office 2007 atau Office 97-2003 saja. Dengan kata lain class ini tidak bisa digunakan untuk membaca file Excel yang berekstensi (*.xlsx). Oleh karena itu pastikan file Excel yang akan Anda import berekstensi *.xls.
Sebelum kita membuat script import datanya, silakan download terlebih dahulu class PHPExcelReader nya di bawah ini
Selanjutnya, kita akan membuat script import datanya. Dalam script yang akan kita buat ini, class tersebut nantinya akan kita includekan di dalamnya.
Untuk contoh kasus yang akan kita pilih di sini adalah import data mahasiswa. Berikut ini struktur tabel MySQL nya.
1.CREATE TABLE `mhs` (
2.  `nim` varchar(10),
3.  `namamhs` varchar(30),
4.  `alamat` text,
5.  PRIMARY KEY  (`nim`)
6.)
Kemudian andaikan kita memiliki file data Excel seperti gambar di bawah ini
Script PHP Import Excel ke MySQL
Dalam proses import data nanti, kita akan menggunakan bentuk form upload file. Oleh karena itu, pertama kita buat form uploadnya sbb:
import.php
1.<h1>Import Data Asrama</h1>
2. 
3.<form method="post" enctype="multipart/form-data" action="proses.php">
4.Silakan Pilih File Excel: <input name="userfile" type="file">
5.<input name="upload" type="submit" value="Import">
6.</form>
Selanjutnya, kita buat script untuk proses upload dan import datanya. Oya… meskipun kita menggunakan form upload file, namun file Excel yang kita upload tersebut tidak akan tersimpan di server secara permanen namun hanya bersifat temporary yang otomatis akan terhapus setelah proses import datanya selesai.
proses.php
01.<?php
02.// menggunakan class phpExcelReader
03.include "excel_reader2.php";
04. 
05.// koneksi ke mysql
06.mysql_connect("dbHost", "dbUser", "dbPass");
07.mysql_select_db("dbname");
08. 
09.// membaca file excel yang diupload
10.$data = new Spreadsheet_Excel_Reader($_FILES['userfile']['tmp_name']);
11. 
12.// membaca jumlah baris dari data excel
13.$baris = $data->rowcount($sheet_index=0);
14. 
15.// nilai awal counter untuk jumlah data yang sukses dan yang gagal diimport
16.$sukses = 0;
17.$gagal = 0;
18. 
19.// import data excel mulai baris ke-2 (karena baris pertama adalah nama kolom)
20.for ($i=2; $i<=$baris; $i++)
21.{
22.  // membaca data nim (kolom ke-1)
23.  $nim = $data->val($i, 1);
24.  // membaca data nama (kolom ke-2)
25.  $nama = $data->val($i, 2);
26.  // membaca data alamat (kolom ke-3)
27.  $alamat = $data->val($i, 3);
28. 
29.  // setelah data dibaca, sisipkan ke dalam tabel mhs
30.  $query = "INSERT INTO mhs VALUES ('$nim', '$nama', '$alamat')";
31.  $hasil = mysql_query($query);
32. 
33.  // jika proses insert data sukses, maka counter $sukses bertambah
34.  // jika gagal, maka counter $gagal yang bertambah
35.  if ($hasil) $sukses++;
36.  else $gagal++;
37.}
38. 
39.// tampilan status sukses dan gagal
40.echo "<h3>Proses import data selesai.</h3>";
41.echo "<p>Jumlah data yang sukses diimport : ".$sukses."<br>";
42.echo "Jumlah data yang gagal diimport : ".$gagal."</p>";
43. 
44.?>
Setelah script di atas dijalankan, maka berikut ini isi tabel mhs setelah proses import datanya
Script PHP Import Excel ke MySQL
Nah.. mudah bukan?? Oya.. pastikan class phpExcelReader tersebut terletak dalam folder yang sama dengan kedua script di atas.
Dalam membuat file Excel, Anda tetap bisa menggunakan Office 2007 asal ketika menyimpan filenya, pastikan formatnya adalah Excel 97-2003 worksheet (pilih Save As Type: Excel 97-2003 Worksheet).
Semoga artikel ini bermanfaat…

Download Disini

Membuat Script SMS Auto Forward dengan PHP

Maaf ya.. lama saya gak update lagi nih blog, semoga pengunjung setia blog ini gak berpindah ke lain blog :-) OK deh… pada artikel SMS gateway kali ini, saya akan mencoba memaparkan cara membuat script SMS Gateway yang dapat digunakan untuk melakukan auto forwarding SMS dengan script PHP.
Apa sih auto forwarding SMS itu?? Misalkan Anda memiliki sejumlah nomor hp teman atau member yang jumlahnya banyak sekali, bisa ratusan atau ribuan yang tersimpan di database SMS center. Nah… jika Anda ingin mengirim pesan SMS ke semua nomor tersebut, Anda tinggal kirim SMS ke SMS center yang Anda buat sendiri dengan format pesan misalnya: FWD#PESAN maka otomatis pesan akan diteruskan oleh SMS center ke semua nomor hp yang ada di database.
Kalau sudah paham apa itu SMS Auto Forwarding, bagaimana cara membuatnya? Untuk membuat SMS auto forwarding ini, yang Anda butuhkan adalah PC server yang di dalamnya sudah terinstal Gammu sebagai gateway untuk SMS nya, web server (saya sarankan menggunakan AppServ). Di dalam AppServ ini sudah terdapat Apache sebagai webserver, PHP server dan juga mysql. Oya sampai lupa, untuk keperluan sms gateway ini Anda juga harus punya modem untuk pengiriman sms nya.
Adapun langkah pertama yang Anda harus lakukan untuk membuat sms auto forwarding ini adalah instalasi Gammu nya. Setelah instalasi Gammu, Anda akan mendapatkan beberapa buah tabel di database mysql seperti pada gambar berikut ini (gunakan phpmyadmin)
SMS gateway auto forwarding
Di antara beberapa tabel di atas, terdapat sebuah tabel bernama ‘pbk’. Tabel ini merupakan singkatan dari ‘phonebook’ yang nantinya digunakan untuk menyimpan data nomor hp yang nantinya bisa dikirimi pesan SMS auto forwarding ini. Silakan isi beberapa data nomor hp beserta nama pemiliknya.
SMS gateway auto forwarding
Selanjutnya kita buat script PHP untuk memproses SMS auto forwarding ini. Script PHP ini nanti harus senantiasa berjalan di browser. Anda bisa menggunakan teknik auto refresh pada browser atau menggunakan teknik AJAX.
Ide pembuatan script PHP untuk memproses SMS auto forwarding ini kita harus memecah keyword FWD#PESAN terlebih dahulu. Bila diawali dengan keyword FWD maka barulah proses forwarding ini dilakukan. Selanjutnya bila keywordnya benar-benar diawali dengan FWD, maka PESAN akan dikirim ke semua nomor hp yang ada di tabel ‘pbk’. Tanda # digunakan untuk memisahkan keyword dengan pesan yang akan dikirim. Untuk memecah string dari SMS, kita bisa menggunakan function explode() di PHP.
Berikut ini adalah script PHP untuk SMS autoforwarding ini.
run.php
01.<?php
02. 
03.// koneksi ke database gammu
04.mysql_connect("dbhost", "dbuser", "dbpass");
05.mysql_select_db("dbname");
06. 
07.// membaca sms yang masuk dan belum diproses
08.$query = "SELECT * FROM inbox WHERE Processed = 'false'";
09.$hasil = mysql_query($query);
10.while ($data = mysql_fetch_array($hasil))
11.{
12.   // membaca id sms
13.   $id = $data['ID'];
14.   // membaca isi sms
15.   $sms = $data['TextDecoded'];
16. 
17.   // memecah isi sms berdasarkan karakter #
18.   $pecah = explode("#", $sms);
19. 
20.   // cek keywordnya apakah sama dengan 'FWD'?
21.   if (strtoupper($pecah[0]) == "FWD")
22.   {
23.       // jika keywordnya FWD maka lakukan proses forwarding
24. 
25.       // membaca data phonebook dari tabel 'pbk'
26.       $query2 = "SELECT * FROM pbk";
27.       $hasil2 = mysql_query($query2);
28.       while ($data2 = mysql_fetch_array($hasil2))
29.       {
30.         // membaca nomor hp
31.         $nohp = $data2['Number'];
32.         // membaca isi pesan yang akan diforward
33.         $pesan = $pecah[1];
34.         // proses pengiriman pesan ke setiap no hp
35.         $query3 = "INSERT INTO outbox (DestinationNumber, TextDecoded, CreatorID) VALUES ('$nohp', '$pesan', 'Gammu')";
36.         mysql_query($query3);
37.       }
38.   }
39. 
40.   // menandai sms telah diproses
41.   $query2 = "UPDATE inbox SET Processed = 'true' WHERE ID = '$id'";
42.   mysql_query($query2);
43.}
44. 
45.?>
Keterangan:
Mungkin Anda bertanya-tanya, mengapa di pengecekan keywordnya saya menggunakan strtoupper()? ya… hal ini dikarenakan cara penulisan sms bisa berbeda-beda pada besar kecilnya huruf. Oleh karena itu saya buat menjadi besar semua (kapital). Namun kapitalisasi huruf ini hanya saya berikan pada keywordnya saja, sedangkan untuk pesan yang akan diforward tidak perlu. Kapitalisasi huruf pada keyword ini penting karena di PHP penulisan huruf kecil dan besar pada suatu string itu berbeda (case sensitive). Sebagai contoh penulisan ‘FWD’ dengan ‘Fwd’ atau ‘fwd’ atau ‘fwD’ semuanya berbeda.
Nah… selanjutnya script di atas harus dijalankan terus menerus di web server. Jika secara manual, Anda musti merefresh script di atas pada browser terus menerus supaya bisa memproses SMS yang masuk. Namun hal ini tentu tidak mungkin bukan? So… kita harus membuat sistem otomatisasi supaya script di atas bisa melakukan refresh sendiri. Anda bisa menggunakan teknik auto refresh atau menggunakan AJAX.
Untuk kali ini kita mencoba menggunakan AJAX untuk menjalankan script run.php di atas secara otomatis. Oleh karena itu perlu kita buat script index.html yang di dalamnya kita sisipkan script AJAX untuk menjalankan script run.php.
index.html
01.<html>
02.<head>
03.   <title>SMS Auto Forwarding</title>
04.   <script type="text/javascript">
05. 
06.  function ajax()
07.  {
08.  if (window.XMLHttpRequest)
09.  {
10.     xmlhttp=new XMLHttpRequest();
11.  }
12.  else
13.  {
14.     xmlhttp =new ActiveXObject("Microsoft.XMLHTTP");
15.  }
16. 
17.  xmlhttp.open("GET","run.php");
18.  xmlhttp.send();
19.  setTimeout("ajax()", 5000);
20.  }
21.  </script>
22. 
23.</head>
24. 
25.<body onload="ajax()">
26.      <h1>SMS Auto Forwarding running...</h1>
27.</body>
28.</html>
Script AJAX di atas secara otomatis akan melakukan refresh script run.php setiap selang 5 detik (5000 milisekon). Lantas… dari kedua script di atas manakah yang nantinya akan dijalankan di browser? Anda cukup menjalankan index.html nya saja.
Mudah bukan membuatnya? script di atas dijalankan dengan sukses di Gammu 1.25.0, menggunakan modem Wavecom dan dengan browser Firefox.

Download Disini