2016-02-24 15 views
6

Potrzebuję połączyć się z bazą danych na hoście "A" z hosta "B".Mysql i PHP - Aktualizacja bazy danych z innego serwera

Przeczytałem o tym, jak to zrobić, ale nie mogę znaleźć właściwej drogi. Więc napisałem tak:

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

Ale gdy próbuję się połączyć mam ten błąd:

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

Przywileje mojej bazy danych wygląda następująco:

enter image description here

OD tam jest ip hosta "B"

Każdy pomysł?

+0

Może być [problem z zaporą ogniową] (http://stackoverflow.com/questions/5755819/lost-connection-to-mysql-server-at-reading-initial-communication- pack-syste). –

+0

Czy połączenie w tym IP jest otwarte, to znaczy, że nie ma problemu w tym IP. Sprawdź go raz – Nehal

+0

może to być port, do którego chcesz nawiązać połączenie. Możesz ustawić port w PDO w ten sposób: '$ pdo = new PDO ('mysql: host = 118.140.84.78, port = $ newPortNumber, dbname = $ dbname', '$ username', '$ password');' –

Odpowiedz

1

Jednym z rozwiązań tego problemu może być raczej ustanowienie bezpośredniego połączenia z serwera B do bazy danych MySQL na serwerze A, aby zaimplementować bezpieczny interfejs API na serwerze A, aby uruchomić wszystkie zapytania do bazy danych lokalnie i aby serwer B korzystał z interfejsu API do uruchamiania zapytań.

Na przykład na serwerze A mogłeś zapisane w api.php coś podobnego do:

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

A potem na serwerze B można uruchomić zapytania używając coś podobnego do:

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

Ważna uwaga: Oczywiście ta implementacja nie jest gotowa do produkcji i wymagałaby znacznej poprawy w obszarach takich jak ecking, bezpieczeństwo (szyfrowanie), rozszerzenie implementacji PDO itd. Ten przykładowy kod jest dostarczony w celu zademonstrowania koncepcji interfejsu API.

+0

Hej człowieku, dziękuję za pomoc, nie jest to prawda, ale nadal działa, więc będzie naprawdę użyteczny !! –

Powiązane problemy