我需要从主机"B"连接到主机"A"上的数据库.
我已经读过如何做到这一点,但我找不到正确的方法.所以我写了这个:
$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);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试连接时,我收到了这个错误:
捕获异常:SQLSTATE [HY000] [2013]在"读取初始通信数据包"时丢失与MySQL服务器的连接,系统错误:0
我的数据库的权限如下所示:
ip有主机"B"的ip
任何的想法?
此问题的一种解决方案可能不是建立从服务器 B 到服务器 A 上的 MySQL 数据库的直接连接,而是在服务器 A 上实现安全 API 以在本地运行所有数据库查询,并让服务器 B 使用该 API 来运行查询。
例如,在服务器 A 上,您可以保存api.php类似以下内容的内容:
<?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 ));
Run Code Online (Sandbox Code Playgroud)
然后在服务器 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 ));
Run Code Online (Sandbox Code Playgroud)
重要提示:显然,此实现尚未准备好用于生产,并且需要在验证检查、安全性(加密)、扩展 PDO 实现等领域进行一些重大改进。提供此示例代码是为了演示 API 概念。
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |