Mysql和PHP - 从不同的服务器更新数据库

Tom*_*ena 6 php mysql

我需要从主机"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

任何的想法?

ric*_*oke 1

此问题的一种解决方案可能不是建立从服务器 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 概念。