PHP DataSnap + Rest Client (EVA - PHP İstemcisi) - 002 - İstemci Uygulaması - mad85 - 20-11-2017
Merhabalar,
"Datasnap + Rest Server -> Evrensel Veri Adaptörü - 001 - Sunucu Uygulaması" konusunun devamı niteliğinde olan bu konuda PHP ile 1. konuda bahsettiğim sunucudan sorgulama ve CRUD işlemlerinin nasıl gerçekleşeceğini anlatacağım. "Evrensel Veri Adaptörü - PHP İstemcisi" olarak nitelendiriyorum ben.
Daha önce de belirttiğim gibi, bağlanmakta zorluk çektiğiniz, direkt dışarı açmak istemediğiniz veri tabanlarına bağlanmak için kullanabileceğiniz bir yapı.
Öncelikli olarak PHP tarafında cURL' ün aktif olması gerekmekte.
Burada Query ve Execute olarak iki metodumuz mevcut. Bu metodları aşağıda anlatacağım sınıflarda rahat kullanacağınız hale getirdim.
Şimdi gelelim PHP dosyalarımıza...
dbHelper_DataSnap.php içeriği;
PHP Kod:
<?php
class dbHelper_DataSnap {
private $ds_db_type = ''; private $ds_db_host = ''; private $ds_db_port = 0; private $ds_db_database = ''; private $ds_db_user = ''; private $ds_db_password = ''; private $ds_db_additional_specs = '';
private $data_snap_server = ''; private $data_snap_port = 0; private $data_snap_protocol = ''; private $data_snap_user = ''; private $data_snap_password = '';
public function __construct($db_type, $host, $port, $database, $user, $password, $additional_specs, $ds_server, $ds_port, $ds_protocol, $ds_user, $ds_password) { $this->ds_db_type = $db_type; $this->ds_db_host = $host; $this->ds_db_port = $port; $this->ds_db_database = $database; $this->ds_db_user = $user; $this->ds_db_password = $password; $this->ds_db_additional_specs = $additional_specs;
$this->data_snap_server = $ds_server; $this->data_snap_port = $ds_port; $this->data_snap_protocol = $ds_protocol; $this->data_snap_user = $ds_user; $this->data_snap_password = $ds_password; }
public function query($sql, $params = array()) { $sql = Tool::CRUDControl($sql);
$connection_info = new stdClass(); $connection_info->db_type = $this->ds_db_type; $connection_info->host = $this->ds_db_host; $connection_info->port = $this->ds_db_port; $connection_info->database = $this->ds_db_database; $connection_info->user = $this->ds_db_user; $connection_info->password = $this->ds_db_password; $connection_info->additional_specs = $this->ds_db_additional_specs;
$query_info = new stdClass(); $query_info->query = $sql; $query_info->params = $params;
$all_parameters = new stdClass(); $all_parameters->connection_info = $connection_info; $all_parameters->query_info = $query_info; $all_parameters->type = 'Q';
$base_url = ($this->data_snap_protocol == 'H' ? 'http://' : 'https://') . $this->data_snap_server . ':' . $this->data_snap_port . '/madds/rest/TServerMethods/%22Query%22';
$ret = Tool::callServiceWithPostParametersDataSnap($base_url, json_encode($all_parameters), $this->data_snap_user, $this->data_snap_password);
if ($ret->data == null) { $ret->data = array(); }
return $ret->data; }
public function exec($sql, $params = array()) { $sql = Tool::CRUDControl2($sql); $sql = Tool::QueryControl($sql);
$connection_info = new stdClass(); $connection_info->db_type = $this->ds_db_type; $connection_info->host = $this->ds_db_host; $connection_info->port = $this->ds_db_port; $connection_info->database = $this->ds_db_database; $connection_info->user = $this->ds_db_user; $connection_info->password = $this->ds_db_password; $connection_info->additional_specs = $this->ds_db_additional_specs;
$query_info = new stdClass(); $query_info->query = $sql; $query_info->params = $params;
$all_parameters = new stdClass(); $all_parameters->connection_info = $connection_info; $all_parameters->query_info = $query_info; $all_parameters->type = 'E';
$base_url = ($this->data_snap_protocol == 'H' ? 'http://' : 'https://') . $this->data_snap_server . ':' . $this->data_snap_port . '/madds/rest/TServerMethods/%22Execute%22';
$ret = Tool::callServiceWithPostParametersDataSnap($base_url, json_encode($all_parameters), $this->data_snap_user, $this->data_snap_password);
return $ret; }
}
dbHelper isminden de anlaşılacağı üzere veri tabanına bağlantı ve sorgulama için kullanacağımız metodları içeren sınıf.
Tool.php içeriği;
PHP Kod:
<?php
require_once 'dbHelper_DataSnap.php';
class Tool { public static function callServiceWithPostParametersDataSnap($url, $parameters, $user, $password, $returns_json = true){ $ch = curl_init(''); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, '500'); curl_setopt($ch, CURLOPT_USERPWD, "$user:$password"); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($parameters)) ); try { $result = curl_exec($ch); // self::AddDebugLog($result,'DataSnap - Curl - Success'); } catch (Exception $e) { // self::AddDebugLog($e->getMessage(),'DataSnap - Curl - Error'); } curl_close($ch); if ($returns_json) { return json_decode($result); } else { return $result; } }
public static function CRUDControl($str) { $rejected = array('CREATE', 'ALTER', 'DROP', 'TRUNCATE', 'INSERT', 'UPDATE', 'DELETE', 'create', 'alter', 'drop', 'truncate', 'insert', 'update', 'delete'); foreach ($rejected AS $r) { $str = str_replace($r,'',$str); } return $str; }
public static function CRUDControl2($str) { $rejected = array('CREATE', 'ALTER', 'DROP', 'TRUNCATE', 'create', 'alter', 'drop', 'truncate'); foreach ($rejected AS $r) { $str = str_replace($r,'',$str); } return $str; }
public static function QueryControl($str) { $rejected = array('*'); foreach ($rejected AS $r) { $str = str_replace($r, '', $str); } return $str; }
public static function GetRemoteConnection() { $conn = null;
try { $conn = new dbHelper_DataSnap( 'PostgreSQL', 'localhost', 5433, 'delphican_db', 'delphican', '123', '', 'dış ip adresiniz', 1234, 'H', 'admin', 'abc' ); // Burada bağlantı bilgilerini set ediyoruz. } catch (Exception $e) { $conn = null; unset($conn); return null; }
return $conn; }
}
?>
Tool.php, bazı yardımcı fonksiyonları barındıran araçlar sınıfı.
Sync_Model.php içeriği;
PHP Kod:
<?php
require_once 'Tool.php'; require_once 'dbHelper_DataSnap.php';
class Sync_Model { private $datasnap = null;
function __construct() { $this->datasnap = Tool::GetRemoteConnection(); // Burada bağlantıyı alıyor gibi yapıyor ama almıyoruz. Set ediyoruz... }
function __destruct() { unset($datasnap); }
public function testQuery1() { $qry = $this->datasnap->query("SELECT * FROM test ORDER BY id");
return $qry; }
public function testQuery2() { $qry = $this->datasnap->query("SELECT * FROM test where ad = :param1", array( 'param1'=>'aaa' ) );
return $qry; }
public function testExec() { $exc = $this->datasnap->exec("UPDATE test SET ad = :param1 where id = :param2", array( 'param1'=>'xyz', 'param2'=>2 ) );
return $exc; } }
?>
Sync_Model.php, veri tabanı işlemlerinin yapıldığı, model sınıfı.
Sync_Controller.php içeriği;
PHP Kod:
<?php
require_once 'Sync_Model.php';
error_reporting(E_ALL); ini_set('display_errors', 1);
class Sync_Controller { public function testQueries() { $model = new Sync_Model(); // Model sınıfımızdan bir tane oluşturduk. echo 'testQuery1 ->' . json_encode($model->testQuery1()); // Uzak sunucuda sorgumuzu çalıştırdık (query) ve sonucu json olarak ekrana bastık. echo '<br/><br/><br/>'; echo 'testQuery2 ->' . json_encode($model->testQuery2()); // Uzak sunucuda sorgumuzu çalıştırdık (query) ve sonucu json olarak ekrana bastık. echo '<br/><br/><br/>'; echo json_encode($model->testExec()); // Uzak sunucuda sorgumuzu çalıştırdık (execute) ve sonucu json olarak ekrana bastık. unset($model); } }
$c = new Sync_Controller(); $c->testQueries();
?>
Sync_Controller, Controller sınıfıdır. Veri tabanı sorgularını, vs barındırmaz. Model sınıfını kullanarak yapar gerekli veri tabanı işlemlerini.
Faydalı olacağını umuyorum...
PHP DataSnap+Rest Client (EVA - PHP İstemcisi) - 002 - İstemci Uygulaması - uparlayan - 20-11-2017
Merhaba,
Fikrinize sağlık, Bu kodlar PHP'nin hangi versiyonunda yazıldı? Spesifik olarak en düşük versiyon hangisi?
Cvp: PHP DataSnap+Rest Client (EVA - PHP İstemcisi) - 002 - İstemci Uygulaması - mad85 - 20-11-2017
(20-11-2017, Saat: 14:18)uparlayan Adlı Kullanıcıdan Alıntı: Merhaba,
Fikrinize sağlık, Bu kodlar PHP'nin hangi versiyonunda yazıldı? Spesifik olarak en düşük versiyon hangisi?
Ben PHP 7 kullanıyorum. Bu kodlar PHP "5.3.0" ve üstünde sorun çıkarmaz ("namespace" kullanımından ötürü. "5.3.0" sürümünde kullanılmaya başlandı...).
PHP DataSnap + Rest Client (EVA - PHP İstemcisi) - 002 - İstemci Uygulaması - mad85 - 10-12-2017
Merhaba,
"namespace" kullanımını kaldırdım. Yine söylediğim gibi 5.3 ve üstü sürümlerde sorun olmayacaktır.
PHP DataSnap + Rest Client (EVA - PHP İstemcisi) - 002 - İstemci Uygulaması - quiet1day - 10-12-2017
Php 7 de çogu sorun giderilmiş durumda
|