【问题标题】:Redirect not working with Cloud SQL重定向不适用于 Cloud SQL
【发布时间】:2018-08-24 17:41:45
【问题描述】:

我是编码新手。我的离线软件生成的 php 代码在 localhost 和 mysql 上运行良好。但是一旦链接到 Google App Engine 标准环境的云 sql,php 表单就不会重定向到成功页面。虽然使用云sql,表单数据提交成功,但是出现一个空白屏幕,url没有变化。使用 localhost 时,提交表单后会显示成功页面。为了适应 GAE 云 sql 的代码,我手动插入了 $mysql_port 和 $mysql_Socket 变量,这些在 localhost 上工作的原始代码中没有。

代码是:-

<?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: \1
  upload: (.*\.(html$|css$|js$|svg$))
  application_readable: true


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

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

在下面的第一个帮助之后,发现重定向或 Cloud SQL 一次可以工作。如果我们删除 cloud sql 部分,则重定向工作,如果我们忽略重定向部分 Cloud SQL 成功地将数据放入表中,但不会重定向。在这里,我专门命名 Cloud SQL,因为 Redirect 在 localhost 上使用 MySQL。 请进一步帮助如何使用云 sql 表单重定向 php 页面。

提前谢谢你。

【问题讨论】:

    标签: php mysql yaml google-cloud-sql


    【解决方案1】:

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

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

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

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

    应该是这样的:

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

    或者也可以是这样的(好像是双引号的样式):

    header("Location: /$success_url");
    

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

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

    您可能也不需要重定向标题命令中的前导斜杠。

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

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

    【讨论】:

    • 根据您的指示,我尝试更改 Header 语法。不幸的是,这三个都没有成功(第一个单引号,第二个双引号,第三个没有前导斜杠)。由于该应用程序在 Google App Engine 标准环境上运行,我不太确定如何更改 php.ini 并通过其文档了解如何获取错误日志。当用户拥有所有权限并且即使使用 Cloud SQL 也将数据插入表中时,是否仍会认为 SQL 权限缺失。因此表单提交正在工作,但只是它不会导致下一个 url。 yaml 是否正确?
    • 删除所有的 sql 内容,然后进行重定向(在自己的 php 测试文件中)。然后你应该看到,它有效。
    • 是的!你就在这里。当我删除所有 Cloud SQL 时,它起作用了。再帮我一点,请指导我如何以正确的方式将云 sql 合并到这里。因为这甚至适用于本地主机上的 MySQL。只有当我使用 cloud sql 部署它时,事情才会变得复杂。使用 GAE,我必须跟踪和解决云 sql 问题。
    • @Veebee 我已经编辑了我的答案。请仔细看看,它应该可以帮助您解决问题。
    • 如果我做对了,我删除了 Mysqli 的 Create DB、Create Table 和 Alter Table 函数。虽然我保留了插入表和更新表。在关于 Google Cloud SQL 的类似讨论之后,我还尝试将 Cloud SQL 的最大允许数据包大小增加到 20 MB。仍然重定向失败。我真的很感谢所有的帮助。我希望我有足够的积分可以在这里看到我对你的投票。
    【解决方案2】:

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

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

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

    第三个是标头已发送错误。我使用 $File 和 $Line 函数来知道它首先被发送到哪里。日志显示它是在1号线发送的。我找不到原因。尽管 php 脚本的第 1 行没有回显或打印。虽然 HTML 低于 php 代码,但它以 &lt;!doctype html&gt; 开头。 我试过ob_start()OB-flush()。我也正确使用了exit。经过多次 If-Else 变体,我终于将 header('Location: '.$success_url); 函数替换为 Meta Refresh 即 echo "&lt;META http-equiv='refresh' content='0;URL=success_url'&gt;";

    这工作:)

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

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2021-09-25
      • 2012-03-27
      • 2013-10-31
      • 2014-12-02
      相关资源
      最近更新 更多