【问题标题】:Mysql and PHP - Update database from a different serverMysql 和 PHP - 从不同的服务器更新数据库
【发布时间】:2016-06-06 05:30:44
【问题描述】:

我需要从主机“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);

但是当我尝试连接时,我得到了这个错误:

捕获异常:SQLSTATE[HY000] [2013] 丢失与 MySQL 的连接 服务器在“读取初始通信数据包”,系统错误:0

我的数据库的权限如下:

那里的ip是主机“B”的ip

有什么想法吗?

【问题讨论】:

  • 可能是a firewall issue
  • 该 IP 上的连接是否打开,我的意思是该 IP 没有问题。请检查一次
  • 它可能是您要连接的端口。您可以像这样在 PDO 上设置端口:$pdo = new PDO('mysql:host=118.140.84.78;port=$newPortNumber;dbname=$dbname', '$username', '$password');
  • 我也尝试过使用端口 80 但甚至无法正常工作:(

标签: php mysql


【解决方案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 ));

然后在服务器 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 ));

重要提示: 显然,这个实现不是生产就绪的,需要在验证检查、安全性(加密)、扩展 PDO 实现等领域进行一些重大改进等。此示例代码用于演示 API 概念。

【讨论】:

  • 嘿伙计,谢谢你的帮助,好吧,这不是问题,但仍在工作,所以真的很有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 2020-05-26
  • 2016-11-21
  • 2018-03-24
相关资源
最近更新 更多