【发布时间】:2016-12-28 05:54:00
【问题描述】:
我已按照此link 在Google 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://<db link>.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_collation_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); }就在?>之前,你会得到任何输出吗?如果不尝试用var_dump(mysqli_query($conn,$q));替换以mysqli_query($conn,$q)开头的行,然后再试一次以进行另一次测试。 -
@Hafenkranich 那么这个被扔到哪里了?我试着听从你的建议,但似乎不知道在哪里可以找到有关请求或任何内容的更多信息。
-
1.如果你在浏览器中调用
https://<db link>.appspot.com/fcm/register.php,你应该最终进入else,因为你没有通过POST提供令牌。我会先检查这是否有效。 2. 如果可行,请将 register.php 中的所有$_POST更改为$_REQUEST并调用https://<db link>.appspot.com/fcm/register.php?Token=123。这应该要么向您的数据库发送一个新的假用户,要么打印出有用的调试输出。 3. 如果这有效(数据库中的用户),则 php 部分似乎有效,问题出在您的 java 脚本中的某个地方。 (确保重置我建议更改以进行测试的所有内容) -
@user1871869 如果令牌未在
$_REQUEST中设置,那么它看起来像是您的Java 的问题,而不是您的PHP。您可以发布指向您的Request类的javadoc(或其他文档)的链接吗?查询字符串参数可能需要与另一个链接函数连接,例如.get()或.query()。
标签: php android mysql google-app-engine phpmyadmin