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.
[Güvenlik duvarı sorunu] (http://stackoverflow.com/questions/5755819/lost-connection-to-mysql-server-at-reading-initial-communication-packet-syste) olabilir. –
Bu IP'deki bağlantı açık, yani bu IP'de bir sorun yok. Lütfen bir kez – Nehal
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'); –