【问题标题】:Connecting to Google Cloud SQL in Google App Engine在 Google App Engine 中连接到 Google Cloud SQL
【发布时间】:2019-10-16 14:43:31
【问题描述】:

基本上,我正在部署一个具有注册和登录功能的简单网站。 我已经部署到 AppEngine 并且我的 Cloud SQL 在同一个 AppEngine 项目中。项目:http://cc-lab4.appspot.com/register.php

我在 Cloud SQL 中创建了数据库和表,我希望我的 register.php 连接到云 sql 数据库并执行插入查询。

我真的很想使用 mysqli_connect(),因为我熟悉这个,PDO 连接对我来说是新的。

我还不知道具体的连接方式,完全没有成功。 任何人都知道如何使用 mysqli_connect() 到 Cloud SQL 会很棒。

使用其中一个答案进行编辑后,仍然无法正常工作:

 //Variables for Database connection
 $user = "root";
 $pw = "root";
 $socket = '/cloudsql/'. $ENV{"cc-lab4:australia-southeast1:my-sql-artworks"};
 $dbname = "artworks";

 //Registration values from <Form>
 $username = $_POST['username'];
 $password = $_POST['password'];

 //Database connection
 $db = mysqli_connect(NULL, $user, $pw, $dbname, NULL, $socket);

 if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
 }

 //Table Member (id, username,password,reg_date)
 $q = "insert into member values(null, '$username', SHA('$password'), now())";
 mysqli_query($db, $q); 

【问题讨论】:

标签: php mysql google-app-engine mysqli google-cloud-sql


【解决方案1】:

没有具体原因您不能使用mysqli_connect

我确实看到您的数据库用户变量是 user 而不是 $user,这可能是个问题。

看看cloud sql documentation here,你应该能够适应PHP语法。

Node.js 设置如下所示:

let pool;
const createPool = async () => {
  pool = await mysql.createPool({
    user: process.env.DB_USER, // e.g. 'my-db-user'
    password: process.env.DB_PASS, // e.g. 'my-db-password'
    database: process.env.DB_NAME, // e.g. 'my-database'
    // If connecting via unix domain socket, specify the path
    socketPath: `/cloudsql/${process.env.CLOUD_SQL_CONNECTION_NAME}`,
    // If connecting via TCP, enter the IP and port instead
    // host: 'localhost',
    // port: 3306,

    //...
  });
};
createPool();

因此,关键的观察是套接字的连接名称存储在环境变量中。

您的 PHP 可能如下所示:

$user = "whatever_user";
$password = "whatever_password";
$dbname = "whatever_database";
$socket = '/cloudsql/'.$ENV{"CLOUD_SQL_CONNECTION_NAME"};
$database = mysqli_connect(NULL, $user, $password, $dbname, NULL, $socket);

【讨论】:

  • My Cloud SQL 套接字是:"mysql:unix_socket=/cloudsql/cc-lab4:australia-southeast1:my-sql-artworks;dbname=artworks";我要试试这个: $user = "root"; $pw = "根"; $socket = '/cloudsql/'。 $ENV{"cc-lab4:australia-southeast1:my-sql-artworks"}; $dbname = "艺术品"; $db = mysqli_connect(NULL, $user, $pw, $dbname, NULL, $socket);
  • 您指定的环境变量可能不正确 - 尝试我的示例中列出的 env 变量,或者如果您确信它不会更改,则直接使用套接字作为字符串。
  • 谢谢,我现在正在使用 PDO 连接,并且成功。我放弃了 mysqli_connect() ,但非常感谢你
【解决方案2】:

要将您的 App Engine 连接到您的 Cloud SQL 实例,您只需在 App.yaml 文件中指定您的 Cloud SQL 实例的用户、密码和 DNS,下面是一个示例:

# Use the PHP 7.3 runtime (BETA) by replacing "php72" below with "php73"
runtime: php72

env_variables:
  # Replace USER, PASSWORD, DATABASE, and CONNECTION_NAME with the
  # values obtained when configuring your Cloud SQL instance.
  CLOUDSQL_USER:
  CLOUDSQL_PASSWORD:
  CLOUDSQL_DSN: "mysql:dbname=DATABASE;unix_socket=/cloudsql/CONNECTION_NAME"

更多信息您可以在 php 中查看 App Engine 的quickstart guide

【讨论】:

    【解决方案3】:

    最后,我设法用 PDO 方法连接到我的 Cloud SQL。

    $dsn = getenv('MYSQL_DSN');
    $user = getenv('MYSQL_USER');
    $pw = getenv('MYSQL_PASSWORD');
    
    //Database connection
    $db = new PDO($dsn, $user, $pw);
    
    //register value from <form> inputs
    $username = $_POST['username'];
    $password = $_POST['password'];
    
    //insertion success
    $statement = $db->prepare("insert into member values(null, '$username', SHA('$password'), now())");
    $statement->execute();
    

    我的 .yaml 文件配置

    【讨论】: