2016-02-24 18 views
6

Bir ana bilgisayardan "B" ana bilgisayarındaki bir veritabanına bağlanmam gerekiyor.Mysql ve PHP - Farklı bir sunucudan veritabanını güncelle

Nasıl yapılacağını okudum ama doğru yolu bulamıyorum. Bu yüzden bu yazdım:

$servername = "118.140.84.78"; //host"A" ip 
$username = "lpq"; 
$password = "*****"; 
$dbname = "cc"; 

$cc = new PDO("mysql:host=$servername;dbname=$dbname", "$username", "$password"); 
$cc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Ama bağlanmaya çalıştığınızda bu hata var:

Caught exception: SQLSTATE[HY000] [2013] Lost connection to MySQL server at 'reading initial communication packet', system error: 0

benim veritabanının ayrıcalıkları şöyle:

enter image description here

ip "B" ana bilgisayarının ipi var.

Herhangi bir fikir var mı?

+0

[Güvenlik duvarı sorunu] (http://stackoverflow.com/questions/5755819/lost-connection-to-mysql-server-at-reading-initial-communication-packet-syste) olabilir. –

+0

Bu IP'deki bağlantı açık, yani bu IP'de bir sorun yok. Lütfen bir kez – Nehal

+0

numaralı telefona bağlanın, bağlantı kurduğunuz bağlantı noktası olabilir. PDO üzerindeki portu şu şekilde ayarlayabilirsiniz: $ pdo = yeni PDO ('mysql: host = 118.140.84.78; port = $ newPortNumber; dbname = $ dbname', '$ kullanıcı adı', '$ password'); –

cevap

1

Bu soruna bir çözüm, A sunucusundaki MySQL veritabanına doğrudan bir bağlantı kurmak yerine, tüm veritabanı sorgularını yerel olarak çalıştırmak için A sunucusunda güvenli bir API uygulamak ve sunucu B'yi API kullanmak yerine olabilir. sorguları çalıştırmak için

<?php 
/* Configuration */ 
define('DB_HOSTNAME', '127.0.0.1'); 
define('DB_USERNAME', 'dbuser'); 
define('DB_PASSWORD', 'dbpass'); 
define('DB_DATABASE', 'dbname'); 

/* Process JSON request */ 
$aRequest = (array)json_decode(file_get_contents("php://input")); 
if(isset($aRequest['query']) && isset($aRequest['params'])) { 

    /* Connect to database and run requested query */  
    try { 
    $oPDO = new PDO(sprintf('mysql:host=%s;dbname=%s', DB_HOSTNAME, DB_DATABASE), 
     DB_USERNAME, DB_PASSWORD); 
    $oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $hStatement = $oPDO->prepare((string)$aRequest['query']); 
    $hStatement->setFetchMode(PDO::FETCH_ASSOC); 
    $hStatement->execute((array)$aRequest['params']); 
    $aResponse = array('success' => true, 'data' => (array)$hStatement->fetchAll()); 
    } catch(PDOException $oError) { 
    $aResponse = array('success' => false, 'error' => (string)$oError->errorInfo[2]); 
    } 
} else { 
    $aResponse = array('success' => false, 'error' => 'Invalid request'); 
} 

/* Process JSON response */ 
header('Content-Type: application/json'); 
echo(json_encode($aResponse)); 

Sonra sunucu B Eğer benzer bir şey kullanarak sorguları başlatabilecek:

<?php 
/* Configuration */ 
define('PATH_API', 'http://118.140.84.78/api.php'); 

class RemotePDO { 
    private $sURL = ''; 

    function __construct($sURL) { 
    $this->sURL = $sURL; 
    } 

    function exec($sQuery, $aParams) { 
    $sRequest = json_encode(array('query' => $sQuery, 'params' => $aParams)); 
    $aHttpOptions = array('http' => array('header' => 
     "Content-Type: application/json", 'method' => 'POST', 'content' => $sRequest)); 
    $oHttpContext = stream_context_create($aHttpOptions); 
    return json_decode(@file_get_contents($this->sURL, false, $oHttpContext)); 
    } 
} 

/* Testing */ 
$sSQL = "SELECT * FROM orders WHERE order_id=:order_id"; 
$aParams = array(':order_id' => 1); 
$oRemotePDO = new RemotePDO(PATH_API); 
print_r($oRemotePDO->exec($sSQL, $aParams)); 

Eğer benzer api.php şey kurtarabilirdi sunucu A Örneğin

Önemli Not: Açıkçası bu uygulama üretime hazır değildir ve doğrulama ch gibi alanlarda bazı önemli geliştirmelere gereksinim duyar PDE uygulamasının genişletilmesi, güvenlik (şifreleme), vb. Bu örnek kod, API konseptini göstermek için sağlanmıştır.

+0

hey adam, yardımınız için teşekkürler, iyi değil, ama yine de hala işe yaramaz! –

İlgili konular