Showing posts with label php. Show all posts
Showing posts with label php. Show all posts

Semak Key di Dalam Array

Friday, February 19, 2016

Apabila telah disetkan key dan value bagi sesuatu array, value array tersebut boleh dipanggil menggunakan key yang telah dikenalpasti.

Sekiranya key yang diberikan tidak dikenali, akan mendatangkan error pada coding.

Jadi, bagi mengatasi masalah ini, setiap key yang dimasukkan, perlu disemak terlebih dahulu adakah ia wujud. Gunakan fungsi in_array yang PHP sediakan.

Dilihat pada contoh di bawah, pada satu table, terdapat senarai PTJ untuk dirujuk.


+------------+--------------------------------+
| kod_ptj    | nama_ptj                       |
+------------+--------------------------------+
| 123456789  | SEKTOR PENJAGAAN KULIT         |
| 987654321  | BAHAGIAN PENGURUSAN KEWANGAN   |
| 121212312  | BAHAGIAN PENGURUSAN MAKANAN    |
| 345345345  | BAHAGIAN PENGURUSAN PERJALANAN |
| 678678678  | BAHAGIAN PENGURUSAN TANGISAN   |
+------------+--------------------------------+


Select yang pertama untuk dapatkan data tersebut dan dimasukkan ke dalam array.

Kemudian, select senarai data yang dimahukan beserta kod PTJ. Kod tersebut boleh digunakan untuk memaparkan nama PTJ.

Masalah timbul sekiranya dalam senarai tersebut, ada beberapa kod yang tiada di dalam table rujukan di atas. Jadi, array tidak dapat mengesan apa-apa data dan menganggap ianya adalah error.

Apa yang boleh dibuat, sebelum memaparkannya, sila semak terlebih dahulu menggunakan in_array.


<?php 
$sqlptj = "SELECT untuk dapatkan kod PTJ dan nama PTJ";
$resultptj = mysql_query($sqlptj);
while($rowptj = mysql_fetch_array($resultptj))
{
 $kodptj = $rowptj["pt_kod_ptj"];
 $namaptj["$kodptj"] = $rowptj["pt_nama_ptj"];
}

$sql3 = "SELECT semua data dan salah satu data tersebut ada kod PTJ";
$result3 = mysql_query($sql3);
while($row3 = mysql_fetch_array($result3))
{
 $kodptjp = $row3["kr_ptj"];
 $displayptj = "";
 
 if (in_array($namaptj["$kodptjp"], $namaptj)) {
  $displayptj = $namaptj["$kodptjp"];
 } 
 else { 
  $displayptj = "<span class=\"label label-sm label-warning\">".$kodptjp."</span>";
 }
?>
<tr>
 <td><?php echo $row3["xxx"]; ?></td>
 <td><?php echo $row3["xxy"]; ?></td>
 <td><?php echo $row3["$xxz"]; ?></td>
 <td><?php echo $displayptj; ?></td>
</tr>
<?php 
}
?>

Selain menggunakan in_array, boleh juga menggunakan array_key_exists. Cara menggunakannya juga sama. Jika menggunakan contoh code di atas, berikut adalah cara menggunakannya.


<?php
//copy code di atas
//code asal guna in_array
if (in_array($namaptj["$kodptjp"], $namaptj)) {
  $displayptj = $namaptj["$kodptjp"];
} 

//code checking guna key exist. Terus check key, bukan check value
if (array_key_exists($row3["kr_ptj"], $namaptj)) {
    echo "Key untuk array ini telah wujud";
}

Bezanya in_array lebih kepada semakan terhadap value, manakala array_key_exists menyemak key atau index di dalam satu array.

Rollback Restore Last Data

Nota: logid = history ID untuk table history atau table log yang digunakan dalam post ini.

Sambungan post sebelum ini, Rollback Backup Data Secara Manual

Sebelum ini kita membuat rollback merujuk kepada ID backup data (logid) di mana ID itu sudah di pilih siap-siap.

Kali ini, kita lihat bagaimana untuk rollback data yang terakhir sahaja di mana logid tidak diketahui yang mana satu. Bagi mendapatkan logid terakhir, gunakan carian pada timestamp.

Pada contoh ini, kita menganggap ID untuk original data telah diberikan. Dapatkan logid menggunakan SQL.


<?php 
$pkid = $_GET['pkid'];
$logid="";

$sql3 = "SELECT a.logid, a.id, a.timestamp FROM data_log a 
   WHERE a.id='$pkid' 
   AND a.timestamp=(SELECT MAX(a1.timestamp) 
   FROM data_log a1 
   WHERE a1.id='$pkid')";
$result3 = mysql_query($sql3);
while($row3 = mysql_fetch_array($result3))
{
 $logid = $row3["logid"];
}
?>

Setelah logid diperoleh, lakuan arahan seperti yang ditunjukkan pada post sebelum ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php 
$result = mysql_query("SELECT * FROM data_log limit 1");
if (!$result) {
    die("Query to show fields from table failed");
}

$sql_rollback = "UPDATE data SET ";

$fields_num = mysql_num_fields($result);
//echo "fields_num=".$fields_num;
for($i=3;  $i<$fields_num; $i++)
{
    $field = mysql_fetch_field($result, $i);
//    echo "{$field->name}".$i."<br>";    
}

$result2 = mysql_query("SELECT * FROM data_log WHERE logid = '$logid'");
if (!$result2) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}
$row2 = mysql_fetch_row($result2);
//0 = running LogID 
//1 = Activity log 
//2 = ID for ori table
//3 ~ n = data
for($i=3; $i<$fields_num; $i++)
{
    $field = mysql_fetch_field($result, $i);
 if($i == ($fields_num - 1)){
  $sql_rollback .= "{$field->name} = '".$row2[$i]."'";
 } else {
  $sql_rollback .= "{$field->name} = '".$row2[$i]."', ";
 }
 //echo $row2[$i]; 
}
$field_id = mysql_fetch_field($result, 2);
$sql_rollback .=" WHERE {$field_id->name} = '".$row2[2]."'";
$resultrb = mysql_query($sql_rollback);
?> 

Membandingkan Antara Data Semasa dan Sebelum

Wednesday, February 17, 2016

Paparkan senarai data, di mana baris data di atas, adakah sama dengan data di bawahnya.

Dalam contoh di bawah, jika data di bawah adalah sama seperti di atas, table tidak perlu diwarnakan.

Jika sebaliknya, letakkan warna supaya pengguna perasan akan perubahan data yang berlaku.

Caranya, jalankan satu SQL untuk satu table yang hendak dipantau akan perubahannya.
Sebelum data tu dikeluarkan menggunakan while(), declare siap-siap color code html untuk table.
Declare juga data untuk $current dan $previous.

Kemudian, setiap kali panggil data di dalam while(), buat perbandingan antara $current dan $previous.

Setelah dapat hasilnya, dan sebelum tutup while() {}, berikan nilai $previous sama seperti nilai $current. Kerana ia akan digunakan apabila membuat semakan data yang seterusnya.

<?php
$sql3 = "SELECT bla bla bla";
$result3 = mysql_query($sql3);
$previousd1 = ""; 
$currentd1="";
$bgwarnad1 = "bgcolor=\"#F7FE2E\"";

while($row3 = mysql_fetch_array($result3))
{
 $currentd1 = $row3["data1"];
 if ($currentd1 === $previousd1) {
   $bgwarnad1 = "";
 }
?>
<tr>
 <td><?php echo $row3["id"]; ?></td>
 <td><?php echo $row3["timestamp"]; ?></td>
 <td <?php echo $bgwarnad1; ?>><?php echo $row3["data1"]; ?></td>
 <td><?php echo $row3["data2"]; ?></td>
 <td><?php echo $aktiviti["$akt"]; ?></td>
 <td><a href="rollback_item.php?logid=<?php echo $row3["logid"]; ?>" class="btn btn-success btn-sm mlm mrm"><i class="fa fa-history"></i>&nbsp;Rollback</a></td>
</tr>
<?php 
$previousd1 = $currentd1;
$bgwarnad1 = "bgcolor=\"#F7FE2E\"";
}
?>
 </tbody>
</table>  

 Hasilnya akan dapat seperti ini



Rollback Backup Data Secara Manual

Tuesday, February 16, 2016

Merujuk kepada post sebelum ini, terdapat dua table. Satu untuk data original, kedua adalah data backup. Di mana table backup tersebut berjalan menggunakan TRIGGER.

Table Original
mysql> select * from data;
+----+---------------------+-----------------------+-------+
| id | timestamp           | data1                 | data2 |
+----+---------------------+-----------------------+-------+
|  1 | 2016-02-15 23:11:34 | masukkan satu manual  |  2.44 |
|  2 | 2016-02-15 14:40:22 | data kedua berubah    |  0.00 |
|  3 | 2016-02-15 13:58:08 | data pertama          |  2.20 |
|  4 | 2016-02-15 13:58:08 | data kedua            |  4.50 |
|  5 | 2016-02-15 23:12:09 | ini baris yang kelima |  5.40 |
+----+---------------------+-----------------------+-------+
 
Table Backup menggunakan trigger
mysql> select * from data_log;
+-------+--------+----+---------------------+-------------------------+-------+
| logid | action | id | timestamp           | data1                   | data2 |
+-------+--------+----+---------------------+-------------------------+-------+
|     1 | I      |  1 | 2016-02-15 14:03:46 | data pertama edit       |  0.00 |
|     2 | I      |  2 | 2016-02-15 13:57:21 | data kedua              |  0.00 |
|     3 | I      |  3 | 2016-02-15 13:58:08 | data pertama            |  2.20 |
|     4 | I      |  4 | 2016-02-15 13:58:08 | data kedua              |  4.50 |
|     5 | U      |  1 | 2016-02-15 14:06:44 | data pertama tidak edit |  2.00 |
|     6 | D      |  1 | 2016-02-15 14:07:43 | data pertama tidak edit |  2.00 |
|     7 | U      |  2 | 2016-02-15 14:40:22 | data kedua berubah      |  0.00 |
|     8 | I      |  1 | 2016-02-15 23:11:34 | masukkan satu manual    |  2.44 |
|     9 | I      |  5 | 2016-02-15 23:12:09 | ini baris yang kelima   |  5.40 |
+-------+--------+----+---------------------+-------------------------+-------+


Sekarang kita mahu membuat rollback (memberikan semula data yang telah diubah kepada table original) untuk satu data.

Kita ambil contoh, table: data, id:1, data1: "masukkan satu manual". Data ini mahu ditukar ke data sebelumnya.

Data yang dirujuk untuk aktiviti rollback adalah, table:data_log, logid:6, id:1, data1:"data pertama tidak edit". Kita akan pulangkan semula data ini ke table:data.

Biasanya, kita boleh membuat rollback dengan satu arahan SQL sahaja. Sebagai contoh,
/* Contoh #1 */
UPDATE data SET 
  timestamp = (SELECT timestamp FROM data_log WHERE logid='6' AND data.id=data_log.id),
  data1=(SELECT data1 FROM data_log WHERE logid='6' AND data.id=data_log.id),
  data2=(SELECT data2 FROM data_log WHERE logid='6' AND data.id=data_log.id);

/* Contoh #2 */
UPDATE data a
SET (a.timestamp, a.data1, a.data2) = (SELECT b.timestamp, b.data1, b.data2 
 FROM data_log b 
WHERE b.id = a.id AND b.logid='6');

/* Contoh #3 */
UPDATE data_log
INNER JOIN
data
ON data.id = data_log.id
SET data.timestamp = data_log.timestamp, 
 data.data1 = data_log.data1,
 data.data2 = data_log.data2
WHERE data_log.logid='6'

/* dan pelbagai cara lagi */

Tetapi dalam situasi ini, ia tidak dibenarkan. SQL akan error. Kerana table:data_log merupakan table yang sentiasa di INSERT oleh TRIGGER, manakala table:data sentiasa dikawal oleh TRIGGER.

Apabila kedua-dua table ini diakses dengan serentak, malah mahu mengemaskini juga dalam masa yang sama, SQL tidak benarkan perkara ini berlaku. SELECT + COMPARE + UPDATE dalam satu arahan.

Apa yang boleh dibantu adalah dengan membuat programming. Contoh di sini kita menggunakan PHP.

Apa yang akan kita buat adalah:
  1. Dapatkan nama field yang mahu diupdate dari table data_log
  2. Sediakan SQL query untuk UPDATE table data
  3. Dapatkan nilai setiap data terlibat pada table data_log guna logid=6
  4. Cantumkan dapatan di langkah (1) dan (3) ke dalam SQL query di langkah (2) menjadi SQL yang lengkap.
  5. Jalankan SQL query tersebut untuk membuat kemaskini.
Secara programmingnya begini,

<?php 

$logid = $_GET['logid']; //output = 6

//1. Dapatkan nama field. Limit =1 bertujuan untuk ambil data terkecil, query tidak makan masa.
$result = mysql_query("SELECT * FROM data_log limit 1");
if (!$result) {
    die("Query to show fields from table failed");
}
//   Jumlah field dari arahan di atas.
//   fields_num = 5 
$fields_num = mysql_num_fields($result);

//   Sekadar nak lihat nama field.
//   Bermula dengan nilai $i=3, kerana:
//   0 = running ID log 
//   1 = Activity log 
//   2 = ID for original table
//   3 ~ n = data yang dimahukan.
for($i=3;  $i<$fields_num; $i++)
{
    $field = mysql_fetch_field($result, $i);
    echo "{$field->name}".$i."<br>";    
}
//   Di sini kita menggunakan mysql_fetch_field($result, $i)
//   Supaya namafield yang dipaparkan bermula dengan field data-data.
//   Jika sekadar guna mysql_fetch_field($result) tanpa $i, 
//   Ia akan memaparkan field bermula dari 0
//   Walaupun telah diberitahu, for($i=3..)

//2. SQL query untuk UPDATE table:data
$sql_rollback = "UPDATE data SET ";

//3. Dapatkan nilai setiap data yang terlibat.
//   masukkan ke dalam row2[];
$result2 = mysql_query("SELECT * FROM data_log WHERE logid = '$logid'");
if (!$result2) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}
$row2 = mysql_fetch_row($result2);


//4. Cantumkan dapatan di atas menjadi SQL yang lengkap.
//   Setiap nama field ({$field->name}) dan data ($row[]) digabungkan
//   Pastikan tiada tanda ',' pada nama field yang terakhir. Guna if($i == ($fields_num - 1))
for($i=3; $i<$fields_num; $i++)
{
    $field = mysql_fetch_field($result, $i);
 if($i == ($fields_num - 1)){
  $sql_rollback .= "{$field->name} = '".$row2[$i]."'";
 } else {
  $sql_rollback .= "{$field->name} = '".$row2[$i]."', ";
 }
}

//   Dapatkan field ID untuk table:data.
$field_id = mysql_fetch_field($result, 2);

//   Lengkapkan SQL Query
//   Gunakan field ID tadi untuk WHERE
//   Dan running SQL Query guna mysql_query()
$sql_rollback .=" WHERE {$field_id->name} = '".$row2[2]."'";
$resultrb = mysql_query($sql_rollback);
?>

Lihat hasilnya di database. Data telah dikemaskini, dan data_log juga sudah bertambah satu lagi baris data.

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

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.