重定向不适用于 Cloud SQL

Redirect not working with Cloud SQL

我是编码新手。我的离线软件生成的 php 代码适用于本地主机和 mysql。但是一旦链接到 Google App Engine 标准环境的云 sql,php 表单就不会重定向到成功页面。尽管使用云 sql,表单数据已成功提交,但随后出现空白屏幕,url 中没有任何变化。使用本地主机时,成功页面会在提交表单后出现。为了调整 GAE 云 sql 的代码,我手动插入了 $mysql_port 和 $mysql_Socket 变量,这些在本地主机上工作的原始代码中不存在。

密码是:-

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['formid']) && $_POST['formid'] == 'My-Form-Name')
{
   $success_url = './success-page.html';
   $error_url = './error-page.html';
   $error = '';
   $mysql_server = null;
   $mysql_database = 'My-DB';
   $mysql_table = 'My-Table';
   $mysql_username = 'My-Username';
   $mysql_password = 'My-Password';
   $mysql_port = null;
   $mysql_socket = '/cloudsql/CloudSql-Instance-Connection-Name';
   $eol = "\n";
   $db = mysqli_connect($mysql_server, $mysql_username, $mysql_password, $mysql_database, $mysql_port, $mysql_socket) or die('Failed to connect to database server!<br>'.mysqli_error($db));
   mysqli_set_charset($db, 'utf8');
   mysqli_query($db, "CREATE DATABASE IF NOT EXISTS $mysql_database");
   mysqli_select_db($db, $mysql_database) or die('Failed to select database<br>'.mysqli_error($db));
   mysqli_query($db, "CREATE TABLE IF NOT EXISTS $mysql_table (ID int(9) NOT NULL auto_increment, `DATESTAMP` DATE, `TIME` VARCHAR(8), `IP` VARCHAR(15), `BROWSER` TINYTEXT, PRIMARY KEY (id))");
   foreach($form_data as $name=>$value)
   {
      mysqli_query($db ,"ALTER TABLE $mysql_table ADD $name VARCHAR(255)");
   }
   mysqli_query($db, "INSERT INTO $mysql_table (`DATESTAMP`, `TIME`, `IP`, `BROWSER`, `REFERER`)
                VALUES ('".date("Y-m-d")."',
                '".date("G:i:s")."',
                '".$_SERVER['REMOTE_ADDR']."',
                '".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."',
                '".$_SERVER['HTTP_USER_AGENT']."')")or die('Failed to insert data into table!<br>'.mysqli_error($db)); 
   $id = mysqli_insert_id($db);
   foreach($form_data as $name=>$value)
   {
      mysqli_query($db, "UPDATE $mysql_table SET $name='".mysqli_real_escape_string($db, $value)."' WHERE ID=$id") or die('Failed to update table!<br>'.mysqli_error($db));
   }
   mysqli_close($db);
   header('Location: '.$success_url);
   exit;
}

成功和错误页面是项目的内部页面。 应用程序 yaml 具有以下处理程序:

# TO serve static
- url: /(.*\.(html$|css$|js$|svg$|))
  static_files: 
  upload: (.*\.(html$|css$|js$|svg$))
  application_readable: true


# to serve all php scripts
- url: /(.+\.php)$
  script: 

如何在使用云 sql 提交表单后成功重定向到 success-page.html?另外,成功页面可以是 .php 页面还是必须是 .html 页面?

经过下面的第一个帮助,发现Redirect 或Cloud SQL 同时工作。如果我们删除 cloud sql 部分,Redirect 会起作用,如果我们忽略 Redirect 部分,Cloud SQL 会成功将数据放入 table 但不会重定向。在这里我特别命名 Cloud SQL 因为 Redirect 在本地主机上使用 MySQL。 请进一步帮助了解如何使用云 sql 表单重定向 php 页面。

提前致谢。

空白页表示 php 遇到运行时错误。在您的情况下,这可能是多种情况:

  • 缺少 SQL 创建 table
  • 的权利
  • 缺少 sql 更改 table
  • 的权利
  • 缺少 sql 插入/更新权限
  • mysqli 未加载到您的在线网站上
  • 等等

另外,这一行应该产生一个语法错误:

header('Location: './$success_url);

应该是这样的:

header('Location: /'.$success_url);

或者也可以这样(好像喜欢双引号的风格):

header("Location: /$success_url");

要准确找出问题所在,您有两种可能性:

  • 打开 php.ini
  • 中的显示错误
  • 查看服务器上的错误日志

您可能也不需要在重定向 header 命令中使用前导斜杠。

编辑:由于下面的评论,提问者需要一些额外的帮助来解决这个问题:

  1. 尽量不要在每次打开数据库连接时都创建数据库模式。在外部执行此任务并在您的脚本中假设数据库已经存在。大多数提供商不支持创建数据库。您通常必须通过网络界面执行此操作,该界面由您的提供商提供给您。所以,在你的情况下 Google 的云 SQL.
  2. 尽量不要在每次使用时更改 table。那没有意义。我认为您每次都有相同的 HTML 表格。因此,最好为所有 HTML 个表单字段创建列 一次 。否则,您可以使用 HTML 表单数据表示的序列化形式(例如 PHP 的序列化命令,或者为了更好的可读性和在其他语言中的使用,请使用 json_encode)。

在这里和其他地方的所有支持下,我学会了阅读和理解 App Engine 中的错误日志。我的代码有 3 个漏洞:

1st 在 yaml 中,其中缺少 url 处理程序。我从 yaml 上的 GAE 文档中复制了它。

2nd 是 php 形式的一个隐藏变量。它是从会话数据中检索用户名。我删除了那个变量。 和

第三是 Header 已发送错误。我使用 $File 和 $Line 函数来知道它首先发送到哪里。日志显示是在1号线发送的,找不到原因。尽管在 php 脚本的第 1 行没有回显或打印。虽然 HTML 低于 php 代码,但它以 <!doctype html> 开头。 我尝试了 ob_start()OB-flush()。我也正确使用了 exit 。在 If-Else 的多次变化之后,我最终用 echo "<META http-equiv='refresh' content='0;URL=success_url'>";

的 Meta Refresh 替换了 header('Location: '.$success_url); 函数

成功了 :)

非常感谢包括@alpham8 在内的 Whosebug 社区的所有帮助。