2016-02-24 14 views
6

ホスト "B"からホスト "A"のデータベースに接続する必要があります。MysqlとPHP - 別のサーバからデータベースを更新する

私はそれを行う方法について読んだことがありますが、正しい方法を見つけることができません。だから私は、この書いた:

$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); 

をしかし、私は接続しようとすると、私はこのエラーを得た:

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

私のデータベースの権限は次のようになります。

enter image description here

IPホスト "B"のIPがあります

ご存じですか?

+0

[ファイアウォールの問題](http://stackoverflow.com/questions/5755819/lost-connection-to-mysql-server-at-reading-initial-communication-packet-syste)になる可能性があります。 –

+0

そのIP上での接続は開いていますが、そのIPには問題はありません。一度確認してください – Nehal

+0

あなたが接続しようとしているポートかもしれません。 '$ pdo = new PDO( 'mysql:host = 118.140.84.78; port = $ newPortNumber; dbname = $ dbname'、 '$ username'、 '$ password');' –

答えて

1

サーバーBからサーバーAのMySQLデータベースに直接接続し、サーバーAに安全なAPIを実装してすべてのデータベースクエリをローカルに実行し、サーバーBにAPIを使用させるのではなく、クエリを実行します。

<?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)); 

し、サーバーB上のあなたに似たものを使用してクエリを起動することもできます:

<?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)); 

あなたがに似api.php何かに保存されている可能性があり、サーバーA上の例えば

重要なお知らせ:明らかにこの実装は実稼働環境ではありません。検証チャネルecking、セキュリティ(暗号化)、PDO実装の拡張などが含まれます。このサンプルコードは、APIの概念を示すために提供されています。

+0

あなたの助けてくれてありがとう、よくaswerはありませんが、まだ作業中ですので本当に便利です! –

関連する問題