Tag Archives: php

Mendapatkan ip address windows host dari linux guest di WSL 2

saya punya case, mau menghubungkan PHP yang ada di ubuntu di WSL dengan SQLServer yang ada di Windows 10 sebagai host, kita memerlukan ip address windows nya .

berdasarkan artikel ini, ip windows dapat kita lihat di file /etc/resolv.conf , ip tersebut ada pada value dari key “nameserver”.
hal ini fine fine saja untuk keperluan sehari2 yang adhoc.

namun, kalau seperti ini, kita harus mengganti konfigurasi PHP terkait ip address dari SQLServer tadi. tentu hal ini bukan saya banget.

sebagai anak yang sangat malas akhirnya saya mencari cara agar mendapatkan ip tersebut secara otomatis.

cara saya adalah :

  1. membuat variabel pada environtment variabel di apache2
  2. lokasi point 1 ada di /etc/apache2/envvars
  3. isi dari point 2 adalah export win_ip_addr=$(cat /etc/resolv.conf | grep nameserver | tr -d “nameserver “)
  4. lalu di php nya bisa kita manfaatkan fungsi getenv dengan memanggil variabel win_ip_addr tadi

selesai deh ūüėÄ

cara mudah bulk restore transaction log backup sql server

 

untuk yang kesusahan dalam merestore transaction log backup sql server

dikarenakan banyaknya data log yang akan direstore

dapat menggunakan script saya dibawah ini :

 

untuk menjalankannya membutuhkan php terinstall pada komputer anda

jalankan di command line anda

php -f gen_trans_log_restore.php {dir tempat log file} {nama db}  > hasil_query_anda.sql 

 

psst .. jangan lupa membaca asumsi saya di script ya…

Menampilkan Informasi Detail PHP dan cURL

untuk yang suka pakai PHP dan cURL ,
seringkali saat terjadi trouble kita akan kesusahan untuk mendebug nya,

untuk itu, langkah pertama dari semua proses debugging itu dimulai dari menampilkan seluruh aktivitas dari cURL

hal itu dapat dilakukan dengan script di bawah :

yang perlu diperhatikan untuk ditambahkan pada kode anda adalah bagian didalam if($debug) dan if($result === FALSE && $debug) ..

happy coding

Mengkoneksikan PHP dengan MSSQL , OPENSUSE 11.1

ya , always ada problem ..

opensuse milik kantor versinya 11.1 dan di repository kambing.ui.ac.id sayangnya tidak ada driver untuk PHP-MSSQL. aplikasi sudah kadung dibuat , so solusinya ya harus create driver mssql.so nya..

langkah2nya cukup tricky dengan menggabungkan beberapa sumber.

  1. saya mengikuti langkah yang ditulis oleh forum http://forums.opensuse.org/english/get-technical-help-here/applications/420088-freetds-php-mssql-support-built-please.html#post2237685
  2. di sana saya stuck di bagian saat ingin mengompile PHP ext MSSQL nya
    errornya selalu¬† ‘it wasn't a valid FreeTDS directory...‘¬†
     akhirnya nemu post www.php.net/manual/en/mssql.installation.php#84331
    , saya menggunakan itu dan menyesuaikan sedikit (owh ya directory freeTDS nya saya menggunkan /usr/local) dan akhirnya bisa jadi tuh mssql.so
  3. lalu saya lanjutkan lagi installasinya mengikuti link no 1

 

semoga membantu yang kebingungan seperti saya tadi..

Free Up Memory PHPEXCEL

seringkali saat menggunakan PHPEXCEL dan membaca banyak sekali workbook kita bisa kehabisan memory.. untuk itu sebenarnya ada cara yang bisa dilakukan dengan menghilangkan object workbook tsb dari memory dan sudah ada di manualnya… namun manual yang berupa .doc itu membuat “malas” untuk dibaca 

maka dari itu sesama “pemalas” saya bagikan potongan kode ini semoga membantu :

https://gist.github.com/4696048

fungsi correlation di PHP

ada project yang mengharuskan saya untuk menggunakan fungsi correlation di PHP.

cari cari fungsi yang sudah built in ketemu linknya tetapi masih kok seperti hutan rimba , alhasil membaca komen dari halaman tersebut ya ternyata statusnya masih sangat mengharukan.

ada sedikit cahaya cerah saat membaca komennya ada fungsi buatan salah satu user yang siap pakai. alhasil project akhirnya pakai fungsi tersebut. sebenarnya project berjalan sangat lancar menggunakan fungsi tersebut, namun,  ternyata saat dihadapkan pada data yang besar dan berulang2 fungsi tersebut berjalan cukup lambat. akhirnya mau tidak mau , suka maupun duka akhirnya harus membuat fungsi sendiri deh…

inti dari fungsi ini adalah me demodularisasi dari fungsi sebelumnya sehingga membuat looping dalam fungsi dilakukan hanya sekali saja tidak berkali kali.. 

langsung saja ditampilkan fungsinya :

Implementasi Table Data Gateway di PHP

Dari blog saya memahami-table-gateway-pattern saya akan mencoba mencontohkan implementasi SEDERHANA pada PHP,

Implementasi ini menggunakan teknik pemrograman Metaprogramming bagi yang memang merasa tidak suka bisa mencoba teknik code generation namun

Kalo menggunakan code generation ya silakan dicoba sendiri.. hehehe

  

Ok langsung 2 the point, pertama buat dulu table mahasiswa dengan field2 yang seperti di bawah ini :

  

mysql> desc mahasiswa;

+——–+————–+——+—–+———+——-+

| Field | Type | Null | Key | Default | Extra |

+——–+————–+——+—–+———+——-+

| nrp | int(10) | NO | PRI | NULL | |

| nama | varchar(255) | YES | | NULL | |

| gender | tinyint(1) | YES | | NULL | |

+——–+————–+——+—–+———+——-+

3 rows in set (0.23 sec)

  

Lalu tahap kedua saya membuat class TableGateway secara umum terlebih dahulu yang nantinya akan dijadikan parent class untuk class Gateway per table :

  

<?php

/**

@author radityo pw ([email protected])

**/

class TableGateway{

      

    protected $db;

      

    protected $table;

      

    public function __construct($db,$table){

        $this->db = $db;

        $this->table = $table;

    }

      

¬†¬†¬†¬†protected function generate_sql($mode,$data=array(),$where=”1=1″){

$sql = “”;

         $table = $this->table;

switch($mode){

case “add” :

$sql = “INSERT INTO $table”;

$akey = array();

$avalue = array();

foreach ($data as $key => $value) {

$akey[] = $key;

$avalue[] = “‘”.$value.”‘”;

}

$skey = implode(“,”,$akey);

$svalue = implode(“,”,$avalue);

$sql .= “(“.$skey.”) values(“.$svalue.”)”;

break;

  

case “del” :

$sql = “DELETE FROM $table WHERE $where”;

break;

  

case “edit” :

$sql = “UPDATE $table SET”;

$aupdate = array();

foreach ($data as $key => $value) {

$aupdate[] = “$key=’$value'”;

}

$supdate = implode(“,”,$aupdate);

$sql .= ” $supdate WHERE $where”;

break;

}

return $sql;

}

      

    public function search($where_condition,$order_by = null,$offset = null,$size = null){

¬†¬†¬†¬†¬†¬†¬†¬†$sql = “SELECT * FROM “.$this->table.” WHERE “.$where_condition;

        if($order_by != null){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$sql = $sql.” ORDER BY “.$order_by;

        }else if($offset != null){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$sql = $sql.” LIMIT “.$offset.”,”.$size;

        }

        $sth = $this->db->prepare($sql);

        $sth->execute();

        return $sth->fetchAll(PDO::FETCH_ASSOC);

    }

      

    protected function find_by($prefix,$arguments,$order_by = null,$offset = null,$size = null){

¬†¬†¬†¬†¬†¬†¬†¬†$sql = “SELECT * FROM “.$this->table.” WHERE “.$prefix.” = ‘”.$arguments.”‘”;

        if($offset != null){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$sql = $sql.” LIMIT “.$offset.”,”.$size;

        }

        if($order_by != null){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$sql = $sql.” ORDER BY “.$order_by;

        }

        $sth = $this->db->prepare($sql);

        $sth->execute();

        return $sth->fetchAll(PDO::FETCH_ASSOC);

    }

      

    protected function delete_by($prefix,$arguments){

¬†¬†¬†¬†¬†¬†¬†¬†$sql = $this->generate_sql(“del”,array(),$prefix.” = ‘”.$arguments.”‘”);

        $sth = $this->db->prepare($sql);

        $sth->execute();

    }

      

    protected function edit_by($prefix,$value,$arguments){

¬†¬†¬†¬†¬†¬†¬†¬†$sql = $this->generate_sql(“edit”,$arguments,$prefix.” = ‘”.$value.”‘”);

        $sth = $this->db->prepare($sql);

        $sth->execute();

    }

      

    public function add($data){

¬†¬†¬†¬†¬†¬†¬†¬†$sql = $this->generate_sql(“add”,$data);

        $sth = $this->db->prepare($sql);

        $sth->execute();

    }

      

    public function findAll($order_by = null,$offset = null,$size = null){

¬†¬†¬†¬†¬†¬†¬†¬†$sql = “SELECT * FROM “.$this->table;

        if($order_by != null){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$sql = $sql.” ORDER BY “.$order_by;

        }

        if($offset != null){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$sql = $sql.” LIMIT “.$offset.”,”.$size;

        }

        $sth = $this->db->prepare($sql);

        $sth->execute();

        return $sth->fetchAll(PDO::FETCH_ASSOC);

    }

      

    public function deleteAll(){

¬†¬†¬†¬†¬†¬†¬†¬†$sql = $this->generate_sql(“del”);

        $sth = $this->db->prepare($sql);

        $sth->execute();

    }

      

    public function __call($name, $arguments) {

          

¬†¬†¬†¬†¬†¬†¬†¬†if(strpos($name, “find_by_”) !== FALSE){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$prefix = str_replace(“find_by_”, “”, $name);

              

            if(count($arguments) == 1){

                return $this->find_by($prefix,$arguments[0]);

            }else if(count($arguments) == 2){

                return $this->find_by($prefix,$arguments[0],$arguments[1]);

            }else if(count($arguments) == 4){

                return $this->find_by($prefix,$arguments[0],$arguments[1],$arguments[2],$arguments[3]);

            }

¬†¬†¬†¬†¬†¬†¬†¬†}else if(strpos($name, “delete_by_”) !== FALSE){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$prefix = str_replace(“delete_by_”, “”, $name);

            $this->delete_by($prefix,$arguments[0]);

¬†¬†¬†¬†¬†¬†¬†¬†}else if(strpos($name, “edit_by_”) !== FALSE){

¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†$prefix = str_replace(“edit_by_”, “”, $name);

            $this->edit_by($prefix,$arguments[0],$arguments[1]);

        }

    }

}

/*END OF FILE*/

  

Dari kode di atas dapat dilihat saya menggunakan magic method __call(…) dimana tujuannya adalah memberikan fleksibilitas dalam pemanggilan dan pengesetan attribute dari class

Misalnya seperti contoh di atas bahwa table mahasiswa terdapat field nrp, maka nanti saya dapat mencari mahasiswa yang bernrp tertentu menggunakan

$class->find_by_nrp(…..) , yang sebenarnya ini dimapping ke fungsi find_by(,…..). untuk koneksi database dalam hal ini menggunakan PDO.

  

Langkah selanjutnya tinggal membuat class gateway per table yang diinginkan, dalam hal ini yaitu MahasiswGateway.php :

<?php

require_once(“TableGateway.php”);

class MahasiswaGateway extends TableGateway{

      

    public function __construct($db){

¬†¬†¬†¬†¬†¬†¬†¬†parent::__construct($db,’mahasiswa’);

    }

      

    public function search_top_ten(){

        return $this->findAll(null,0,10);

    }

}

/*END OF FILE*/

  

Dari class MahasiswaGateway dapat dilihat melakukan penurunan dari class TableGateway berarti nantinya kemampuan TableGateway akan diturunkan ke MahasiswaGateway, sekarang mari buat Test Class nya :

  

<?php

require_once(‘MahasiswaGateway.php’);

$dsn = ‘mysql:dbname=test_for_blog;host=127.0.0.1’;

$user = ‘root’;

$password = ”;

  

try {

$dbh = new PDO($dsn, $user, $password,array( PDO::ATTR_PERSISTENT => true));

} catch (PDOException $e) {

echo ‘Connection failed: ‘ . $e->getMessage();

     exit(1);

}

  

$mhs_gateway = new MahasiswaGateway($dbh);

  

$data = array(

¬†¬†¬†¬†‘nrp’=>’5202100002’,

¬†¬†¬†¬†‘nama’=>’radityo prasetianto wibowo’,

¬†¬†¬†¬†‘gender’=>0

);

  

$mhs_gateway->add($data);

  

var_dump($mhs_gateway->find_by_nama(‘radityo prasetianto wibowo’));

/*END OF FILE*/

  

Nah dari Test Class diatas dapat diluihat untuk menginsert data saya hanya membutuhkan sebuah associative array (HashMap kalo di Java) lalu saya tinggal memasukkan dalam method add..

Jika ingin melakukan pencarian dengan filter sebuah field , maka tinggal melakukan pemanggilan layaknya memanggil atribut biasa.. (find_by_nama(…..)) seperti pada contoh diatas.

Masih banyak fungsi2 yang belum tercover pada Test class ini namun dapat anda coba langsung..

Jika anda tertarik dan ingin berdiskusi jangan sungkan untuk mengemail saya di radityo_pw[at]is.its.ac.id