YouTube Data API v3 Video List

Wednesday, July 22, 2015

Ini khas untuk youtube API version 3. Version lain, mungkin lain caranya.

Sebelum nak guna youtube API, perlu create API key dulu guna akaun google sendiri. Pastikan API Key tu aktif. Lepas create, aktifkan.

Rujuk : Youtube Data API

Pada localhost, create satu file php, dan panggil API.

Dalam API ni ada macam-macam fungsi yang berlainan. Boleh rujuk nota bawah tajuk implementation guide. Salah satu adalah videolist.

Contoh kod di bawah,

<?php 
$API_key = 'blablablabla';
$maxResults = 3;

$videoDetail = json_decode(file_get_contents('https://www.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&id=eSwisMEtkBg&key='.$API_key));

print_r($videoDetail);
?>

Andaikan kita dah tahu id video tu, iaitu bfNXb6-fVaM. Tinggal masukkan je dalam request url API.

Pada print_r tu, kita akan dipaparkan result. Jika nak tengok kemas sikit, klik kanan pada page, "View Page Source".

Kita akan dapat lihat result macam ni.

stdClass Object
(
    [kind] => youtube#videoListResponse
    [etag] => "XI7nbFXulYBIpL0ayR_gDh3eu1k/PEcLptKFhu_YmtNgJBdRp5Bp1G8"
    [pageInfo] => stdClass Object
        (
            [totalResults] => 1
            [resultsPerPage] => 1
        )

    [items] => Array
        (
            [0] => stdClass Object
                (
                    [kind] => youtube#video
                    [etag] => "XI7nbFXulYBIpL0ayR_gDh3eu1k/4VEv7O0M0DyhqZy4Ylw7JfD_4Nk"
                    [id] => bfNXb6-fVaM
                    [snippet] => stdClass Object
                        (
                            [publishedAt] => 2017-02-14T17:13:42.000Z
                            [channelId] => UCY_jsmgpHvnYkvT5xTrEEJw
                            [title] => Mummy Birthday 2017
                            [description] => 
                            [thumbnails] => stdClass Object
                                (
                                    [default] => stdClass Object
                                        (
                                            [url] => https://i.ytimg.com/vi/bfNXb6-fVaM/default.jpg
                                            [width] => 120
                                            [height] => 90
                                        )

                                    [medium] => stdClass Object
                                        (
                                            [url] => https://i.ytimg.com/vi/bfNXb6-fVaM/mqdefault.jpg
                                            [width] => 320
                                            [height] => 180
                                        )

                                    [high] => stdClass Object
                                        (
                                            [url] => https://i.ytimg.com/vi/bfNXb6-fVaM/hqdefault.jpg
                                            [width] => 480
                                            [height] => 360
                                        )

                                )

                            [channelTitle] => Mohd Firdaus Mohd Rasidi
                            [categoryId] => 22
                            [liveBroadcastContent] => none
                            [localized] => stdClass Object
                                (
                                    [title] => Mummy Birthday 2017
                                    [description] => 
                                )

                            [defaultAudioLanguage] => ms
                        )

                    [contentDetails] => stdClass Object
                        (
                            [duration] => PT2M11S
                            [dimension] => 2d
                            [definition] => sd
                            [caption] => false
                            [licensedContent] => 
                            [projection] => rectangular
                        )

                    [statistics] => stdClass Object
                        (
                            [viewCount] => 463
                            [likeCount] => 3
                            [dislikeCount] => 0
                            [favoriteCount] => 0
                            [commentCount] => 0
                        )

                )

        )

)


Memandangkan ianya diconvert ke json, dan arraynya cuma satu data sahaja, tidak perlu guna foreach. Direct je panggil. Contoh.
<?php 
echo "<br>1.".$videoDetail->etag; //1."XI7nbFXulYBIpL0ayR_gDh3eu1k/PEcLptKFhu_YmtNgJBdRp5Bp1G8"
echo "<br>2.".$videoDetail->pageInfo->totalResults; //2.1
echo "<br>3.".$videoDetail->{'items'}[0]->{'statistics'}->{'viewCount'}; //3.463
?>


Code penuh.

<?php 
$API_key = 'AIzaScBb1zAdNEaqjDZ2GuiyEGy9ekXtG0q_WDm'; // <- key palsu sebagai contoh sahaja.

$videoDetail = json_decode(file_get_contents('https://www.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&id=bfNXb6-fVaM&key='.$API_key));

//print_r($videoDetail);

echo "<br>1.".$videoDetail->etag; //1."XI7nbFXulYBIpL0ayR_gDh3eu1k/PEcLptKFhu_YmtNgJBdRp5Bp1G8"
echo "<br>2.".$videoDetail->pageInfo->totalResults; //2.1
echo "<br>3.".$videoDetail->{'items'}[0]->{'statistics'}->{'viewCount'}; //3.463
echo "\n\n";

?>

HTML5 Anchor Untuk Aktiviti Lain

Wednesday, April 22, 2015

Anchor dalam HTML biasanya digunakan untuk sambung ke URL atau untuk email. Kini HTML5 sudah ditambah fungsi untuk telefon dan whatsapp. Sebenarnya Whatsapp sediakan listenernya sendiri. Jadi, mana-mana aplikasi jika menyediakan listener, pasti boleh ditambah pada HTML5.

Hyperlink URL

 <a href="test.html">Klik Di Sini</a>  


Email
 <a href="mailto:email@emaildomain.com">email@emaildomain.com</a>
  


Telefon
 <a href="tel:1800886800"><img src="images/phone.png"></a>  

Untuk telefon, tidak perlu ditambah tanda plus '+' pada bahagian depan. Ianya tidak berfungsi.

Whatsapp
Ini digunakan untuk android.
 <a href="intent://send/60123456789#Intent;scheme=smsto;package=com.whatsapp;text=Bla%20bla%20bla;action=android.intent.action.SENDTO;end">Contact Us</a>  

Nombor tidak perlu ditambah '+'.

Untuk text=bla bla bla, tidak diletakkan terlebih dahulu pun tak mengapa.
 <a href="intent://send/60123456789#Intent;scheme=smsto;package=com.whatsapp;action=android.intent.action.SENDTO;end">Contact Us</a>  


Jika IOS, boleh guna
 <a href="whatsapp://send?text=blahblah">Contact Us</a>  

Hantar Email Guna Direct Access URL

Friday, April 03, 2015

Ada satu file php, iaitu sendmail.php. Di dalamnya ada email function, hardcoded. Jadi, untuk test hantar email, cuma akses file php tersebut terus melalui URL.

Bila taip di URL dan ENTER, file tidak dapat di akses.

Jadi, perlu tengok permission untuk file tersebut betul atau tidak. Sepatutnya permission-nya begini.

 # ls -l /var/www/html/sendmail.php   
 -r-xr-xr-x root smmsp /var/www/html/sendmail.php  


Kemudian, tengok pula folder clientmqueue

 # ls -l /var/spool/clientmqueue   
 drwxrwx--- smmsp smmsp /var/spool/clientmqueue  


Jika tidak sama seperti di atas, tukar guna chgrp dan chown, mana-mana yang perlu.

Contoh: Tukar group sendmail.php duduk di bawah group smmsp.

 #chgrp smmsp sendmail.php  
 chmod 555 send.php  


Nota: File ini akan jadi read-only. Jadi, tiada nak edit-edit lagi.

Kemudian, onkan http send mail. Setkan di setsebool.

Tengok status httpd_can_sendmail di getsebool

 # getsebool -a | grep mail  
 allow_postfix_local_write_mail_spool --> on  
 httpd_can_sendmail --> off  
 logging_syslogd_can_sendmail --> off  


Onkan http send mail
 # setsebool httpd_can_sendmail 1  



Sekarang, file sendmail.php sudah boleh diakses melalui URL dan email berjalan seperti biasa.

Buka browser, taip URL http://myurl.com/sendmail.php dan ENTER. Kemudian, semak inbox email.

Sendmail Menggunakan Relayhost Luar

Sunday, March 29, 2015

Situasi: Perlu hantar e-mail kepada 3 domain yang berlainan. Gmail (google), MIMOS (syarikat) dan KPDNKK (kerajaan). Ketiga-tiga tempat ini mempunyai cara berbeza dalam menangani email yang sampai kepada mereka.
OS: Centos
Lokasi Server: Bangunan/Infra kpdnkk
Relayhost: mail.isp.mailgov (bukan kpdnkk), ataupun guna IP mail server. Pilih salah satu.

Install Sendmail

pastikan sudah ada sendmail atau belum

 #service sendmail status  

Jika tiada, install sendmail.
 #yum install sendmail sendmail-cf  

Cari lokasi fail sendmail.mc, mungkin dalam folder /etc/mail/
 #updatedb  
 #locate sendmail.mc  

Edit fail sendmail.mc
 #vi sendmail.mc  

Terdapat 2 bahagian perlu diubah. Smart_host dan masquerade_as dnl define(`SMART_HOST', `') dnl MASQUERADE_AS(`mykiragst.kpdnkk.gov.my')dnl edit menjadi
 define(`SMART_HOST', `mail.isp.mailgov')  
 MASQUERADE_AS(`mykiragst.kpdnkk.gov.my')dnl  

di mana dnl sama seperti comment. Buang komen dan masukkan value. Kemudian, running make. Ia akan cipta file sendmail.cf.
 #make  
 atau  
 #/etc/mail/make  

sendmail.cf ini adalah file configuration untuk email. Tidak boleh diedit secara terus. Perlu melalui sendmail.mc dan compile. Check fail sendmail.cf, adakah smart_host point ke mail relay server? Jika ya, restart service sendmail
 #service sendmail restart  

Cuba hantar e-mel menggunakan command line.
 #mail firdaus@gmail.com<ENTER>  
 Subject: Test Sendmail<ENTER>  
 Ini adalah email testing <ENTER>  
 .<ENTER>  
 <ENTER>  

Jika tidak mahu guna titik dan ENTER, boleh guna Ctrl+D untuk complete and send. Pastikan email telah dihantar ke gmail. Kalau tak dapat emel, mintak kpdnkk allowkan ip apps server (OS Centos ini) di mail relay server.

3 E-mail berlaian host
Email dihantar kepada 3 tempat berlainan, contoh: firdaus@gmail.com, firdaus@mimos.my, pegawai@kpdnkk.gov.my

Keputusan: Gmail berjaya, mimos dan kpdnkk tidak berjaya.

Lihat pada email log file.
 #tail -f /var/log/maillog  
1:  Mar 18 17:24:44 mimos-app postfix/smtp[1493]: B038441B38: to=<pegawai@kpdnkk.gov.my>, relay=none, delay=55482, delays=55482/0.01/0.04/0, dsn=4.4.1, status=deferred (connect to kpdnkk.gov.my[10.23.150.16]:25: Connection refused)  
2:  Mar 18 17:25:31 mimos-app postfix/smtp[1492]: E570442076: to=<firdaus@mimos.my>, relay=dexter.mimos.my[202.45.138.110]:25, delay=1529, delays=1482/0.02/47/0.12, dsn=4.1.8, status=deferred (host doctors.mimos.my[202.45.138.110] said: 450 4.1.8 <root@mimos-app.localdomain>: Sender address rejected: MX or A record not found (in reply to RCPT TO command))  
3:  Mar 18 17:22:15 mimos-app postfix/smtp[1324]: 5FAE4420B7: to=<firdaus@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.130.26]:25, delay=2.1, delays=0.06/0.01/0.73/1.3, dsn=2.0.0, status=sent (250 2.0.0 OK 1429348876 my10si2599339pdb.33 - gsmtp)  
gmail status=sent.
kpdnkk status=deferred. Connection refuse.
mimos status= deferred. Sender address rejected.

Mungkin gmail terima sahaja email dari root@mimos-app.localdomain. Manakala mimos akan pastikan domain tersebut dikenalpasti. Jika tidak, e-mail itu akan ditolak. MIMOS mengandaikan ini email spam.

kpdnkk pula tidak berjaya dijumpai, lalu connection refuse. Mungkin isu unqualified domain.

Mungkin hostname/nama server ini @mimos-app.localdomain tidak dikenali diinternet, perlu tukar kepada nama yang valid.

Cuba lihat apa hostname server ini
 #hostname  
 atau  
 #hostname -f  

Untuk tukar hostname sementara waktu, jalankan arahan ini.
hostname NEWNAME
 #hostname mykiragst.kpdnkk.gov.my  

Untuk tukar secara kekal, edit /etc/hosts. Selepas tukar, perlu restart OS.

Contoh: 127.0.0.1 domain.com localhost.localdomain
x.x.x.x domain.com
Di mana x.x.x.x adalah IP

1:  --------------/etc/hosts---------------  
2:  127.0.0.1     mykiragst.kpdnkk.gov.my localhost.localdomain localhost  
3:  10.23.155.135     mykiragst.kpdnkk.gov.my mykiragst  

Apabila send e-mail semula, MIMOS sudah berjaya menerima email dari server ini. Tetapi kpdnkk masih gagal dengan error yang sama. Ini kerana pegawai@kpdnkk.gov.my diconnect relayhost. Jadi, bila sendmail, dia cuba connect to kpdnkk.gov.my[10.23.150.16]:25: Connection refused.

Sepatutnya dia connect ke mail.isp.mailgov. Pada status, to=, relay=none. Maksudnya relay masih tidak disetkan dengan betul. 

Memandangkan dari error menunjukkan postfix kata relay=none, ini menunjukkan setting postfix yang perlu diperbetulkan. 

 # vi /etc/postfix/main.cf  

myhostname = localhost
Tukar kepada:
1:  myhostname = mykiragst.kpdnkk.gov.my  
2:  inet_interfaces = all  
3:  relayhost = mail.isp.mailgov  

Kemudian, restart postfix
  # /etc/init.d/postfix restart  

 Hantar semula e-mail ke pegawai@kpdnkk.gov.my, dan ianya berjaya. Jadi, bila dah disetkan relayhost = mail.isp.mailgov di /etc/postfix/main.cf, dan restart postfix, semua email berjaya dihantar.  
TAMBAHAN

Untuk tengok email que list yang belum dihantar
 # postqueue -p  

flush email2 atau re-send semua e-mail yang deferred (sangkut) sebelum ini.
 # postqueue -f  

 Delete semua email yang tersangkut.
 # postsuper -d ALL  

Delete semua email yang berstatus deferred.
 # postsuper -d ALL deferred  

Untuk lihat apa port yang buka di kpdnkk sebab connection ke port 25 refused.
 host -a kpdnkk.gov.my  
 atau  
 dig kpdnkk.gov.my MX  

Sepatutnya dig ke mail.isp.mailgov, bukan kpdnkk. Walaupun hantar email ke kpdnkk, tetapi dia akan check port 25 di relayhost.

Valid Input Latitude dan Longitude

Wednesday, February 04, 2015

Jika dua-dua nilai ada dalam satu variable ($duakordinat).

preg_match('/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?);[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/', $duakordinat);
Andaikan y=longitude dan x=latitude.
$y=4.924155
$x=102.685943
Nak check valid atau tidak, guna regex.

Regex untuk latitude
/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/
Regex untuk longitude
/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/
Contoh, nak check untuk longitude berdasarkan value dari get.
if(isset($_GET['y']) && preg_match('/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/', $_GET['y'])){
 echo "y is coordinate
";
} else {
 echo "masukkan value yang betul";
}
Value datang dari sini.
index.php?x=102.685943&y=4.924155
Buat checking seperti ini.

< ? php
$regexx = '/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/';
$regexy = '/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/';

if(isset($_GET['x'],$_GET['y']) && preg_match($regexx, $_GET['x']) && preg_match($regexy, $_GET['y'])){
 echo "Kordinate yang betul br";
 echo "x=" . $_GET['x'] . " dan y=" . $_GET['y'] ."br";
} else {
 echo "masukkan value yang betul";
}
? >

Boleh fahamkan regex di atas dari sini https://regex101.com/r/bV5fA1/1

Manipulasi Data Pada Blok Array Yang Terpilih

Sunday, October 12, 2014

Kita ada beberapa blok data di dalam satu array, dan hanya beberapa blok terpilih sahaja yang kita mahu manipulasi.

Contoh, katakan di bawah ini ada 10 array yang menyimpan data pekerja. Data yang disimpan adalah, IC, Nama, Alamat, Notelefon, Umur, Bandar, Poskod, Negeri, Jawatan, dan kenderaan.

Terdapat dua (2) data yang hendak dimanipulasi/encrypt iaitu Nama, dan Notelefon.

array semuafield = {IC, Nama, Alamat, Notelefon, Umur, Bandar, Poskod, Negeri, Jawatan, kenderaan}
array selectfield = {Nama, Notelefon}

Contoh data:

 IC | Nama | Alamat | Notelefon | Umur | Bandar | Poskod | Negeri | Jawatan | kenderaan  
 9801 | Faaris | Taman PP | 123 | 27 | Puchong | 56000 | Selangor | CEO | Kereta  
 0102 | Saajidah | Taman PP | 456 | 24 | Puchong | 56000 | Selangor | COO | Kereta  

Nilai g = 10; //jumlah array untuk 'semuafield'
Nilai a = 2; //jumlah array untuk 'selectedfield'

* Sekadar nota (sila abaikan): Data ini diambil dari database postgres, dijalankan menggunakan C++. Data yang terhasil dan yang telah dimanipulasi, akan disimpan ke dalam file data.txt dalam bentuk csv format.

Di bawah adalah contoh source code asal.

 ofstream myfile ("data.txt", std::ios_base::app);  
 if (myfile.is_open())  
 {  
   d = 0;  
   result Rp( Z.exec( sqlp ));  
   for (result::const_iterator c = Rp.begin(); c !=Rp.end(); ++c, d++) {  
    int count;  
    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {  
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
        } else {  
        myfile << c[semuafield[k]].as<string>();  
       }  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  
   }  
  myfile.close();  
  }  
  else cout << "Unable to open file";  


* Sekadar nota (sila abaikan):
if(k < (g-1)) { myfile << ", "; } dan "\n" untuk memenuhi format CSV file. Tanda koma (,) memisahkan antara blok data dan tanda \n untuk membina newline pada baris data baru.

Secara logik mudah, code ini tiada masalah kerana pada gelung pertama, for (k < g), kita sudah keluarkan semua data satu persatu. Kemudian, di dalamnya kita buat checking untuk 'selectedfield' pula. Lihat pada gelung for (m < a) yang berada di dalam gelung yang awal. Di dalam gelung (m < a) ini, kita akan buat checking, jika terjumpa data di dalam blok 'selectedfield', kita akan mula encryptkan data tersebut sebelum dimasukkan ke dalam file. Jika tidak, data akan dimasukkan terus ke dalam file tanpa apa-apa manipulasi.

    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {                        
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
        } else {  
        myfile << c[semuafield[k]].as<string>();  
       }  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  

Tetapi, hasil yang kita dapat tidak menepati syarat. Datanya bertindih dan seolah-oleh encryption berjalan secara tidak konsisten

 9801, uYnudWRXUlhVbGhWYkdoVw==Faaris, Taman PP, 123+4RSU1UxVXhWWGhXV0doWA==, 27, Puchong, 56000, Selangor, CEO, Kereta  
 0102, +4RSU1UxVXhWWGhXV0doWA==Saajidah, Taman PP, 456+4RSU1UxVXhWWGhXV0doWA==, 24, Puchong, 56000, Selangor, COO, Kereta  


Jika diperhatikan, pada nilai yang dapat, ada data berulang. Contoh:

uYnudWRXUlhVbGhWYkdoVw==Faaris

uYnudWRXUlhVbGhWYkdoVw== adalah satu nilai. Faaris adalah satu nilai yang lain. Tetapi keduanya bercantum menjadi satu.

Ini kerana, nilai a=2, dan gelung pada a akan berjalan sebanyak 2 kali. Semakan kali pertama, ia memberi nilai uYnudWRXUlhVbGhWYkdoVw==, dan semakan kali kedua, diberi nilai Faaris.

Ini berlaku kerana selepas checking berlaku dan berjumpa dengan apa yang hendak di cari, gelung berjalan sekali lagi seperti biasa. Bagi mengatasi masalah ini, setiap kali gelung membuat semakan, gunakan fungsi break. Lihat kod di bawah (dengan beberapa perubahan berbanding kod di atas tadi.)

 if (myfile.is_open())  
 {  
   d = 0;  
   result Rp( Z.exec( sqlp ));  
   for (result::const_iterator c = Rp.begin(); c !=Rp.end(); ++c, d++) {  
    int count;  
    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {  
      if (c[semuafield[k]].size()==0)  
      {  
       myfile << "NULL";  
       break;  
      }  
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
         break;  
        } else {  
        count++;  
        //myfile << c[semuafield[k]].as();  
        //break;  
       }  
        if (count == a)  
        myfile << c[semuafield[k]].as();  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  
   }  
  myfile.close();  
  }  
  else cout << "Unable to open file";  

PHP Pagination

Tuesday, May 06, 2014

Bagi meringkaskan paparan pagination. Sambungan dari post sebelum ini.

<table class="table table-hover table-condensed">
 <thead>
 <tr>
  <th>title</th>
  <th>title</th>
  <th>title</th>
 </tr>
 </thead>
 <tbody>
<?php
$limit_rekod=200; //200 rekod akan dipaparkan dalam satu page
$num_range = 3; //jumlah butang page bersebelahan dengan current button di kiri dan kanan. Jika current butang = 6. Kiri papar 3,4 dan 5. Kanan pula papar 7,8 dan 9. Selebihnya tidak dipaparkan. 
$num_limit = $num_range + 4;
$paging_url = "viewdata.php";
if (isset($_GET["page"])) { $page  = $_GET["page"]; } else { $page=1; }; 
$start_from = ($page-1) * $limit_rekod; 

$sql = "SELECT .... 
 LIMIT $start_from, $limit_rekod";
$result = mysql_query($sql,$con);
while($row = mysql_fetch_array($result))
{
?> 
 <tr>
  <td><?php echo $row['xxx']; ?></td>
  <td><?php echo $row['xxx']; ?></td>
  <td><?php echo $row['xxx']; ?></td>
 </tr>
<?php 
}
?>
 </tbody>
</table>

<!-- mula untuk pagination -->
<?php  
$sqlpg = "SELECT ...."; //select tanpa limit  
$rs_result = mysql_query($sqlpg,$con);
$total_records = mysql_num_rows($rs_result); 
$total_pages = ceil($total_records / $limit_rekod); 
?>
<ul class="pagination mtm mbm">
 <li class="<?php if($page == 1) echo "disabled"; ?>"><a href="<?php echo $paging_url; ?>?page=1">«</a></li>
<?php 
if($total_pages < ($num_range))
{
 for ($i=1; $i<=$total_pages; $i++) { 
?>
 <li class="<?php if($page == $i) echo "active"; ?>"><a href="<?php echo $paging_url; ?>?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
<?php 
 };
} elseif($total_pages > $num_limit) {
 if(($page - $num_range) > 1) {
?>
 <li class=""><a href="<?php echo $paging_url; ?>?page=<?php echo ($page - 1); ?>">&lt;</a></li>
 <li class="disabled"><a href="">...</a></li>
<?php 
 }
 
 if(($page + $num_range) < $num_limit) {
  for ($i=1; $i<=($page+$num_limit); $i++) {
?>
 <li class="<?php if($page == $i) echo "active"; ?>"><a href="<?php echo $paging_url; ?>?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
<?php    
  };
 }elseif(($page + $num_range) > $total_pages) {
  for ($i=$page - $num_range; $i<=$total_pages; $i++) {
?>
 <li class="<?php if($page == $i) echo "active"; ?>"><a href="<?php echo $paging_url; ?>?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
<?php    
  };
 }else {
  for ($i=$page - $num_range; $i<=($page + $num_range); $i++) { 
?>
 <li class="<?php if($page == $i) echo "active"; ?>"><a href="<?php echo $paging_url; ?>?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
<?php 
  };
 }
 if(($page + $num_range) < $total_pages){
?>
 <li class="disabled"><a href="">...</a></li>
 <li class=""><a href="<?php echo $paging_url; ?>?page=<?php echo ($page + 1); ?>">&gt;</a></li>
<?php 
 }
}
?>
 <li class="<?php if($page == $total_pages) echo "disabled"; ?>"><a href="<?php echo $paging_url; ?>?page=<?php echo $total_pages; ?>">»</a></li>
</ul>

Paparan yang terhasil seperti di bawah.

Jadi, paparan tidak jadi terlalu panjang. Jika ada 1 juta data pun, tidak dipaparkan sehingga 5 ribu butang. Hanya beberapa butang sahaja.

PHP Pagination Basic

Tuesday, March 04, 2014

Rujukan ringkas untuk membuat paging di PHP.

<table class="table table-hover table-condensed">
 <thead>
 <tr>
  <th>title</th>
  <th>title</th>
  <th>title</th>
 </tr>
 </thead>
 <tbody>
<?php
$limitrekod=200; // 200 data akan dipaparkan dalam satu page.
if (isset($_GET["page"])) { $page  = $_GET["page"]; } else { $page=1; }; 
$start_from = ($page-1) * $limitrekod; 

$sql = "SELECT .... 
 LIMIT $start_from, $limitrekod";
$result = mysql_query($sql,$con);
while($row = mysql_fetch_array($result))
{
?> 
 <tr>
  <td><?php echo $row['xxx']; ?></td>
  <td><?php echo $row['xxx']; ?></td>
  <td><?php echo $row['xxx']; ?></td>
 </tr>
<?php 
$runno++;
}
?>
 </tbody>
</table>

<!-- mula untuk pagination -->
<?php  
$sqlpg = "SELECT ...."; //select tanpa limit  
$rs_result = mysql_query($sqlpg,$con);
$total_records = mysql_num_rows($rs_result); 
$total_pages = ceil($total_records / $limitrekod); 
?>
<ul class="pagination mtm mbm">
 <li class="<?php if($page == 1) echo "disabled"; ?>"><a href="viewdata.php?page=1">«</a></li>
<?php 
for ($i=1; $i<=$total_pages; $i++) { 
?>
 <li class="<?php if($page == $i) echo "active"; ?>"><a href="viewdata.php?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
<?php 
};
?>
 <li class="<?php if($page == $total_pages) echo "disabled"; ?>"><a href="viewdata.php?page=<?php echo $total_pages; ?>">»</a></li>
</ul>

Hasilnya akan dapat seperti di bawah

Jika datanya ada sejuta, maka akan terpaparlah butang page sebanyak (1000000/200) = 5 ribu butang.

Bagi data yang tidak banyak, sesuailah code di atas digunakan. Jika data yang terlalu banyak, perlu diringkaskan cara paparan paging tersebut.

File System PHP

Tuesday, January 28, 2014

Kegunaan fungsi file system di PHP

Nama FungsiKeterangan
basenameMenghasilkan nama file dari satu path
chmodMengubah mode akses file
chownMengubah pemilik file
copyMeng-copy file
dirnameMenghasilkan nama direktori dari suatu path file
disk_free_spaceMenampilkan baki space disk pada satu direktori
disk_total_spaceMenghasilkan jumlah size direktori
fcloseMenutup file yang dibuka
fgetcMengambil karakter-karakter dalam satu file teks
fgetsMengambil baris-baris dari file
file_existsPastikan satu file atau direktori wujud atau tidak
file_get_contentsMembaca isi file keseluruhan
file_put_contentsMenulis teks ke file
fileMembaca isi file ke dalam array
fileatimeMendapatkan waktu akses terakhir suatu file
filesizeMendapatkan ukuran file
filetypeMendapatkan tipe file
fopenMembuka file atau URL
is_dirPastikan satu filename itu adakah satu direktori
is_executablePastikan apakah filename boleh di execute
is_filePastikan apakah filename itu adakah satu file
is_readablePastikan filename boleh dibaca
is_writablePastikan filename boleh ditambah kemaskini kontennya
mkdirMembuat direktori
move_uploaded_fileMemindahkan file yang diupload ke lokasi baru
renameRename file atau direktori
rmdirPadam direktori
unlinkPadam file

basename

Fungsinya : Menghasilkan nama file dari suatu path
Sintaks php :
basename ( string $path [, string $suffix ] )
Parameter :
$path, adalah alamat file dengan lokasi direktorinya, contoh : /var/www/gambar/fileku.jpg
$suffix, akan menghilangkan akhirannya sesuai string $suffix

Contoh penggunaan: 
$path = "/home/httpd/html/index.php";
$file = basename($path);
echo $file;                         //Hasilnya index.php

$file = basename($path, ".php");
echo $file;                         //Hasilnya index
?>

chmod

Fungsinya : Mengubah mode akses file, untuk linux, unix
Sintaks php :

chmod ( string $filename , int $mode )
Contoh penggunaan :
// Read dan write hanya untuk pemilik
chmod("/direktori/filesaya", 0600);
// Pemilik boleh buat apa sahaja, read dan execute untuk others
chmod("/direktori/filesaya", 0755); 
?>

chown

Fungsinya : Mengubah pemilik file
Sintaks php :
chown ( string $filename , mixed $user )
Contoh penggunaan:
$file_name= "foo.php";
$path = "/home/sites/php.net/public_html/sandbox" . $file_name ;
$user_name = "root";
// Set pemilik file
chown($path, $user_name);
?>

copy

Fungsinya : Mengcopy file
Sintaks php :
copy ( string $source , string $dest [, resource $context ] )
Parameter :
$source , adalah file yang akan dicopy
$dest, adalah file tujuan
Contoh penggunaan :
$file = 'upload.php';
$newfile = 'uploadcopy.php';
if (!copy($file, $newfile)) {
    echo "gagal copy file $file...\n";
}else{
    echo "File $file berhasil di copy";
}
?>

dirname

Fungsinya : Menghasilkan nama direktori dari suatu path file
Sintaks php :
dirname ( string $path )
Contoh penggunaan :
$path = "/www/gambar/pic.jpg";
$file = dirname($path);
echo $file;
//Hasilnya /www/gambar
?>

disk_free_space

Fungsinya : Menghasilkan sisa space disk suatu direktori (dalam bytes)
Sintaks php :
disk_free_space ( string $directory )
Contoh penggunaan :
//linux, unix
$df = disk_free_space("/"); 
//Windows:
echo disk_free_space("C:");
echo disk_free_space("D:");
?>

disk_total_space

Fungsinya : Menghasilkan total size direktori (dalam bytes)
Sintaks php :
disk_total_space ( string $directory )
Contoh penggunaan :
//linux , unix
$df = disk_total_space("/");

//Windows:
echo disk_total_space("C:");
echo disk_total_space("D:");
?>

fclose

Fungsinya : Menutup file yang dibuka
Sintaks php :
fclose ( resource $handle )
Contoh penggunaan :
$file = fopen('somefile.txt', 'r');
fclose($file);
?>

fgetc

Fungsinya : Mengambil karakter-karakter suatu file teks
Sintaks php :
fgetc ( resource $handle )
Contoh penggunaan :
Misal anda punya filesaya.txt, yang isinya : 
namaorang
$fp = fopen('filesaya.txt', 'r');
if (!$fp) {
    echo 'filesaya.txt tidak ada';
}
while (false !== ($char = fgetc($fp))) {
    echo "$char";
}
?>
Hasilnya : n a m a o r a n g

fgets

Fungsinya : Mengambil baris-baris dari file
Sintaks php :
fgets ( resource $handle [, int $length ] )
Parameter :
$handle, adalah file yang akan diambil barisnya
$length, adalah panjang/ukuran file, isi aja kira kira yang melebihi panjang file
Contoh penggunaan :
$handle = @fopen("filesaya.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 1000000);
        echo $buffer;
    }
    fclose($handle);
}
?>

file_exists

Fungsinya : Cek apakah file atau direktori tersebut ada
Sintaks php :
file_exists ( string $filename )
Contoh penggunaan :
$filename = 'filesaya.txt'; 
if (file_exists($filename)) {
    echo "File $filename ada";
} else {
    echo "File $filename tidak ada";
}
?>

file_get_contents

Fungsinya : Membaca isi file/ web keseluruhan menjadi string
Sintaks php :
file_get_contents ( string $filename [, int $flags= 0 [, resource $context [, int $offset= -1 
[, int $maxlen= -1 ]]]] )
Parameter :
$filename, file atau web yang akan dibaca isinya
Contoh penggunaan :
$homepage = file_get_contents('http://ayus80.blogspot.com/');
echo $homepage;
?>

file_put_contents

Fungsinya : Menulis teks ke file
Sintaks php :
file_put_contents ( string $filename , mixed $data [, int $flags= 0 [, resource $context ]] )
$filename, file yang akan ditulis
$data, data yang akan ditulis ke file, boleh string atau array
$flags, option, FILE_APPEND (jika file sudah ada, teks akan ditambahkan)
Contoh penggunaan :
$file = 'data.txt';
$nama = 'nama orang';
file_put_contents($file, $nama);
?>
Contoh di atas akan membuat file data.txt dan menuliskan 'nama orang' di dalam data.txt

file

Fungsinya : Membaca isi file perbatis, dimasukkan ke dalam array
Sintaks php :
file ( string $filename [, int $flags= 0 [, resource $context ]] )
Parameter :
$filenama, file yang akan dibaca isinya
$flags, option :
  • FILE_IGNORE_NEW_LINES  : Jangan tambahkan baris baru di akhir elemen array
  • FILE_SKIP_EMPTY_LINES  : Abaikan baris yang kosong
Contoh penggunaan :
$lines = file('filesaya.txt');
print_r($lines);
?>

fileatime

Fungsinya : Mendapatkan waktu akses terakhir suatu file
Sintaks php :
fileatime ( string $filename )
Contoh penggunaan :
$filename = 'filesaya.txt';
if (file_exists($filename)) {
    echo "$filename terakhir kali diakses pada: ";
 echo date("F d Y H:i:s.", fileatime($filename));
}
//filesaya.txt terakhir kali diakses pada: January 28 2014 10:02:12
?>

filesize

Fungsinya : Mendapatkan ukuran file
Sintaks php :
filesize ( string $filename )
Contoh penggunaan:
$filename = 'filesaya.txt';
echo $filename . ': ' . filesize($filename) . ' bytes';
?>

filetype

Fungsinya : Mendapatkan tipe file
Sintaks php :
filetype ( string $filename )
Contoh penggunaan :
echo filetype('filesaya.txt');  // file
echo filetype('/var/');         // dir
?>

fopen

Fungsinya : Membuka file atau URL
Sintaks php :
fopen ( string $filename , string $mode [, bool $use_include_path= false [, resource $context ]] )
$filename, namafile atau URL
$mode :
mode
Description
'r'Dibuka hanya untuk untuk dibaca; pointer diletakkan di awal file
'r+'Dibuka untuk dobaca dan ditulis; pointer diletakkan di awal file
'w'Dibuka hanya untuk ditulis; pointer diletakkan diawal file, jika file tidak ada, akan dibuat automatik
'w+'Dibuka untuk dibaca dan ditulis; pointer diletakkan diawal file, jika file tidak ada, akan dibuat automatik
'a'Dibuka hanya untuk ditulis; pointer diletakkan di akhir file, jika file belum ada, akan dibuat automatik.
'a+'Dibuka hanya untuk dibaca dan ditulis; pointer diletakkan di akhir file, jika file belum ada, akan dibuat automatik.
Contoh penggunaan :
$handle = fopen("/home/pentaho/file.txt", "r+");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>

is_dir

Fungsinya: Cek apakah filename adalah sebuah directori
Sintaks php :
is_dir ( string $filename )
Contoh penggunaan :
if(is_dir('filesaya.txt')){
    echo "Ini adalah direktori";
}else{
    echo "Ini adalah file";
}
?>

is_executable

Fungsinya: Pastikan apakah filename boleh di execute
Sintaks php :
is_executable ( string $filename )
Contoh penggunaan :
$file = 'filesaya.txt';

if (is_executable($file)) {
    echo $file.' boleh diexecute';
} else {
    echo $file.' tidak boleh diexecute';
}
?>

is_file

Fungsinya: Cek apakah filename adalah sebuah file
Sitaks php :
is_file ( string $filename )
Contoh penggunaan :
if(is_file('filesaya.txt')){
    echo "Ini adalah file";
}else{
    echo "Ini bukan file";
}
?>

is_readable

Fungsinya: Pastikan apakah filename boleh dibaca
Sintaks php :
is_readable ( string $filename )
Contoh penggunaan :
if(is_readable('filesaya.txt')){
    echo "file ini boleh dibaca";
}else{
    echo "file ini tidak boleh dibaca";
}
?>

is_writable

Fungsinya: Cek apakah filename boleh ditulis
Sintaks php :
is_writable ( string $filename )
Contoh penggunaan :
if(is_writable('filesaya.txt')){
    echo "file ini boleh ditulis";
}else{
    echo "file ini tidak boleh ditulis";
}
?>

mkdir

Fungsinya: Membuat direktori
Sintaks php:
mkdir ( string $pathname [, int $mode= 0777 [, bool $recursive= false [, resource $context ]]] )
Contoh penggunaan :
mkdir("gambar", 0700);
?>

move_uploaded_file

Fungsinya: Memindahkan file yang diupload ke lokasi baru
Sintaks php :
move_uploaded_file ( string $filename , string $destination )
Contoh penggunaan :
Upload multiple file
$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}
?>

rename

Fungsinya: Rename file atau directori
Sintaks php :
rename ( string $oldname , string $newname [, resource $context ] )
Contoh penggunaan :
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
?>

rmdir

Fungsinya: Delete direktori
Sintaks php :
rmdir ( string $dirname [, resource $context ] )
Contoh penggunaan :
rmdir('examples');
?>

unlink

Fungsinya: Delete file 
Sintaks php :
unlink ( string $filename [, resource $context ] )
Contoh penggunaan :
unlink('test.html');
?>