在 Google App Engine 中连接到 Google 云 SQL

Connecting to Google Cloud SQL in Google App Engine

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

我在云 SQL 中创建了数据库和 table,我希望我的 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); 

要将您的 App Engine 连接到您的云 SQL 实例,您只需在 App.yaml 文件中指定您的云 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

没有特定原因不能使用 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);

最后,我成功地使用 PDO 方法连接到我的云 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文件配置