【问题标题】:Sending REST Call to Google Cloud PHPMyAdmin Server not working?向 Google Cloud PHPMyAdmin 服务器发送 REST 调用不起作用?
【发布时间】:2016-12-28 05:54:00
【问题描述】:

我已按照此linkGoogle Cloud 上成功部署了phpMyAdmin 服务器。我在尝试写入在 phpMyAdmin 中创建的数据库时遇到问题。我正在尝试基于 Google 发布的新 Firebase Cloud Messaging 创建通知服务。

NotificationInstanceService.java

public class NotificationInstanceService extends FirebaseInstanceIdService {
    private static final String TAG = "NotificationInstance";

    @Override
    public void onTokenRefresh() {

        //Getting registration token
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        //Displaying token on logcat
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        sendRegistrationToServer(refreshedToken);

    }

    private void sendRegistrationToServer(String token) {
        //You can implement this method to store the token on your server
        //Not required for current project
        OkHttpClient client = new OkHttpClient();
        //Create the request body
        RequestBody body = new FormBody.Builder().add("Token", token).build();
        //Know where to send the request to
        Request request = new Request.Builder().url("<db link>.appspot.com/fcm/register.php")
                .post(body)
                .build();
        //Create
        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

我在 https://&lt;db link&gt;.appspot.com 上部署了 /fcm/register.php 下的一个文件,如下所示:

注册.php

<?php
    if (isset($_POST["Token"])) {

           $_uv_Token=$_POST["Token"];
           $conn = mysqli_connect("<db link>.appspot.com","root","","fcm") or die("Error connecting");
           $q="INSERT INTO users (Token) VALUES ( '$_uv_Token') "
              ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';";

      mysqli_query($conn,$q) or die(mysqli_error($conn));
      mysqli_close($conn);
    }
 ?>

我很困惑,因为我似乎没有向名为用户的数据库写入任何内容,我知道我已经在 phpMyAdmin 上创建的MySQL 服务器中创建了这些用户。我知道用户名和密码也已经设置在register.php. 有没有什么办法可以调试我的脚本是否真的进入了 PHP 代码?如何调试 PHP 代码?我还认为实际上正在构建请求,因为我可以通过代码的那部分进行调试。任何帮助,将不胜感激。谢谢!

编辑:我在尝试部署服务器时创建的一些文件可能会有所帮助:

app.yaml:

application: <app server url>
service: default
runtime: php55
api_version: 1
version: alpha-001

handlers:

- url: /(.+\.(ico|jpg|png|gif))$
  static_files: \1
  upload: (.+\.(ico|jpg|png|gif))$
  application_readable: true

- url: /(.+\.(htm|html|css|js))$
  static_files: \1
  upload: (.+\.(htm|html|css|js))$
  application_readable: true

- url: /(.+\.php)$
  script: \1
  login: admin

- url: /.*
  script: index.php
  login: admin

- url: /.*
  script: register.php
  login: admin

config.inc.php:

<?php 
$cfg['blowfish_secret'] = '<Secret>'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

/*
 * Servers configuration
 */
$i = 0;

// Change this to use the project and instance that you've created.
$host = '/cloudsql/<app server url>:us-central1:<database name>-app-php';
$type = 'socket';

/*
* First server
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['socket'] = $host;
$cfg['Servers'][$i]['connect_type'] = $type;
$cfg['Servers'][$i]['compress'] = false;
/* Select mysql if your server does not have mysqli */
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = true;
/*
 * End of servers configuration
 */

/*
 * Directories for saving/loading files from server
 */
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';

$cfg['PmaNoRelation_DisableWarning'] = true;
$cfg['ExecTimeLimit'] = 60;
$cfg['CheckConfigurationPermissions'] = false;
// [END all]

php.ini:

google_app_engine.enable_functions = "php_uname, getmypid"

编辑:浏览器中的文本,转到 .appspot.com/fcm/register.php

array(11) { ["pmaCookieVer"]=> 字符串(1) "5" ["pma_lang"]=> 字符串(2) "en" ["pma_collat​​ion_connection"]=> 字符串(15) "utf8_unicode_ci" ["pma_console_height"]=> 字符串(2) "92" ["SACSID"]=> 字符串(355) “〜AJKiYcFgym76QZfbMX35ddCTdKKf-O7q5koLvNZ0coWTMvw9aNlR5fusNyLRzFyw5DB_t2ygVuTEjHwgrgBco4-wr_V3Eer_Mf0CDuGX2e4IpirCNeiGxkRvaLgRPPyZNZWKUx1mF_DChjsksTirkY5WCzlA3G3MO9bBScrLw8kNOFGnvzkev3-B2x31s_TmnDN5aJ0G3-nPueI4FPpKaaMlPsITziccvXMpiehglQOKoo1Bol3EZSF1tjI9QoJuc-6X_sHgJ0IEppg7K-cBapaEx5CmDD2kWOggnVPWnGj1SiKFUnE3DZD46bjovf5me7IdwfVX22bv5D2PJDPQEN4m3D7yP3-WDG” ["pma_console_config"]=> 字符串(103) "{"alwaysExpand":false,"startHistory":false,"currentQuery":true,"enterExecutes":false,"darkTheme":false}" ["pma_console_mode"]=> 字符串(4) "显示" ["phpMyAdmin"]=> 字符串(40) “cfd814e10982d138c7ed4a3ef510c454c0e5f9b9”[“pma_iv-1”]=> 字符串(24) "bSPnJOOBe5x0iXPbbU5Nww=="["pmaUser-1"]=> 字符串 (24) "oHSLKZ7q6eOaXJ475Q6tzw==" ["pmaPass-1"]=> 字符串(24) "dwKZ9gQPCoe/Uk4sWS4s2g=="}

新的 register.php:

<?php
    if (isset($_REQUEST["Token"])) {

           $_uv_Token=$_REQUEST["Token"];
           $conn = mysqli_connect("/cloudsql/<Database ServerURL>","root","","FCM") or die("Error connecting");
           $q="INSERT INTO users (Token) VALUES ( '$_uv_Token') "
              ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';";
      var_dump(mysqli_query($conn,$q));
      mysqli_query($conn,$q) or die(mysqli_error($conn));
      mysqli_close($conn);
    } else {
        var_dump($_REQUEST);
    }
 ?>

NotificationInstanceService.java

新的 POST 请求:

    Request request = new Request.Builder().url("<Application Server>/fcm/register.php?Token=123")
            .post(body)
            .build();

【问题讨论】:

  • 如果你在 register.php 文件中添加一个else { var_dump($_REQUEST); } 就在?&gt; 之前,你会得到任何输出吗?如果不尝试用var_dump(mysqli_query($conn,$q)); 替换以mysqli_query($conn,$q) 开头的行,然后再试一次以进行另一次测试。
  • @Hafenkranich 那么这个被扔到哪里了?我试着听从你的建议,但似乎不知道在哪里可以找到有关请求或任何内容的更多信息。
  • 1.如果你在浏览器中调用https://&lt;db link&gt;.appspot.com/fcm/register.php,你应该最终进入else,因为你没有通过POST提供令牌。我会先检查这是否有效。 2. 如果可行,请将 register.php 中的所有 $_POST 更改为 $_REQUEST 并调用 https://&lt;db link&gt;.appspot.com/fcm/register.php?Token=123。这应该要么向您的数据库发送一个新的假用户,要么打印出有用的调试输出。 3. 如果这有效(数据库中的用户),则 php 部分似乎有效,问题出在您的 java 脚本中的某个地方。 (确保重置我建议更改以进行测试的所有内容)
  • @user1871869 如果令牌未在$_REQUEST 中设置,那么它看起来像是您的Java 的问题,而不是您的PHP。您可以发布指向您的Request 类的javadoc(或其他文档)的链接吗?查询字符串参数可能需要与另一个链接函数连接,例如 .get().query()
  • 如果您只想测试与 DB 部分(而不是 Java 查询构建部分)的连接,您应该能够将令牌硬编码到 PHP 文件中,或者手动提供令牌在浏览器(或hurl.it,或Postman)中查看返回的内容。

标签: php android mysql google-app-engine phpmyadmin


【解决方案1】:

我不知道你的问题到底是什么,不清楚。但既然你问了:Is there any way I can debug whether or not my script is actually going into the PHP code? How can I debug the PHP code? 这是你的答案:

把你的 php 代码改成这样:

<?php
    if (isset($_POST["Token"])) {

           $_uv_Token=$_POST["Token"];
           $conn = mysqli_connect("<db link>.appspot.com","root","","fcm") or die("Error connecting");
           $q="INSERT INTO users (`Token`) VALUES ( `{$_uv_Token}`) "
              ." ON DUPLICATE KEY UPDATE `Token` = `{$_uv_Token}`;";

      mysqli_query($conn,$q) or die(mysqli_error($conn));
      mysqli_close($conn);
    } else {
        echo "Token is not set!";
    }
?>

然后在NotificationInstanceService.java 中检查OkHttpClient 调用的响应:

...
    try {
        Response response = client.newCall(request).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (!response.isSuccessful()){
        Log.w(TAG, "Unexpected response"+response.toString());
    } else {
        Log.w(TAG, "response: "+response.body().string());
    }
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多