【问题标题】:Why doesn't the php page show the same thing in the LogCat?为什么 php 页面在 LogCat 中没有显示相同的内容?
【发布时间】:2013-04-13 20:21:19
【问题描述】:

我的 Logcat (正确地)向我显示了我想要返回的所有消息,但是当我要求代码在另一个 php 页面上显示相同的内容时,它就完全不正常了。

注意是这段代码,$from = "r", and $to = ""。

这是我的代码:

<?php

session_start();

/* connect to database */
$db = mysql_connect("localhost", "root", "root");

if (!$db)
    die('could not connect');

mysql_select_db('androidp2p')
    or die("could not select database");

/* variables */
$from = mysql_real_escape_string($_POST['from']); 
$to = mysql_real_escape_string($_POST['to']);
$message = mysql_real_escape_string($_POST['message']);

/* conditional code */
if (isset ($POST['to']))
{
    /* user wants to send a message */
    $query = "INSERT INTO messages (fromuser, touser, message) VALUES ('$from', '$to', '$message')";

    mysql_query($query)
        or die("\n\ndatabase error!\n". mysql_error());

    echo "ok. Messages have been saved.";
}
else //if (!isset ($POST['to']))
{
    /* user wants to retrieve his messages */
    $query = "SELECT * FROM messages WHERE touser='$from'";

    /* echo test 1 */
    echo $query;

    $result = mysql_query($query)
        or die("\n\ndatabase error!\n". mysql_error());

    $mailbox = array();

    while($row = mysql_fetch_assoc($result))
    {
    $mailbox[] = $row;
    }

    /* echo test 2 */
    echo "{ \"mailbox\":".json_encode($mailbox)." }";

    $name = "{ \"mailbox\":".json_encode($mailbox)." }";

    $_SESSION['myValue']=$name;
}

?>

在第 2 页(test.php):

<?php

session_start();

echo $_SESSION['myValue'];

?>

这是数据库中的条目:

这是我的 logCat:

I/RESPONSE(4591): SELECT * FROM messages WHERE touser='r'

I/RESPONSE(4591): { "邮箱":[{"id":"117","fromuser":"qw","touser":"r","message":"zx","时间戳":"2013-04-13 01:30:59"}] }

现在我想让你看到 touser 是 r。这个条目(在数据库中)是我想要返回的,即字段“touser”包含值“r”的所有条目。

现在,这是我的 test.php 页面:

{ "邮箱":[{"id":"132","fromuser":"r","touser":"","message":"","timestamp":"2013-04-13 15:45:03"},{"id":"123","fromuser":"r","touser":"","message":"","timestamp":"2013-04-13 13 :41:23"},{"id":"122","fromuser":"r","touser":"","message":"","timestamp":"2013-04-13 13: 30:53"},{"id":"133","fromuser":"","touser":"","message":"","timestamp":"2013-04-13 15:45: 21"}] }

已编辑:

如您所见,它返回了所有空白(或 null)的 touser 条目。我对这种行为的解释是,当代码运行时,$from 变量实际上是“r”(这就是它正确保存在 logcat 中的原因),但是在代码执行之后,$from 中目前没有任何值,所以它只是输出 $from = null 的结果。

php 应该这样做吗?我认为当时执行和回显的任何代码都会在页面上输出并留在那里,直到我重新运行代码。有关如何解决此问题的任何建议?

已编辑

所有这一切的重点是使用我从here 获得的 JSONParser 代码,从数据库中获取特定的行,并将它们放入 android 的数据库中的特定字段中。我已经尝试修改我的 JSONParser 代码以使用像 this 这样的 BackgroundTask,您可以查看 this

这是项目试图实现的目标:第一个用户可以将消息发布到服务器数据库,其中包含“来自”(将是用户 1 的手机号码)、“到”(将是目标或用户 2 的号码) ,和一条消息(这是他的位置)。第二个用户使用轮询服务定期从数据库中检索他的消息,即数据库中他的号码将在“to”字段中的所有条目,并将这些条目存储到他手机上的数据库中(并自动从服务器的数据库)。我认为,除了我从服务器的数据库中获取特定条目的部分之外,一切基本上都在工作。

我决定使用 JSONParsing,因为它可以获取一个数据库条目数组并从每个条目中生成一个字符串,从而更容易存储在我的 android 数据库中。但这是它缺乏的地方..找到一种方法来检索数据库的特定条目..我还没有找到一种方法来做到这一点。有什么帮助可以为我指明正确的方向吗?

【问题讨论】:

  • 鉴于 test.php 结果中的所有touser 都是空白的,感觉就像没有$from 值...您确定要在脚本中发布 from 吗?
  • @PhillSparks - 是的 $from 确实有一个值,从 logcat 中的这一行可以看出:I/RESPONSE(4591): SELECT * FROM messages WHERE touser='r'... 'r' 是 $from。
  • @PhillSparks - 但另一方面,当我用 'r' 替换 '$from' 时,在 php 代码中:$query = "SELECT * FROM messages WHERE touser='$from'"; 然后 test.php 输出正确的东西。
  • 使用 test.php 和 logCat 有什么不同?您是从 Android 发帖(我认为这就是 logCat 的位置吗?)并且只是在浏览器中打开 test.php?如果您只是在浏览器中打开 test.php,那么您并没有发布,所以 $_POST 不会有任何值。
  • @PhillSparks - 好的,你所有的问题都是正确的。如果您愿意阅读结尾,我已经修改了我的问题。

标签: java php android echo logcat


【解决方案1】:

会话被设计为对每个访问者都是唯一的,这是通过在 cookie 中记住会话来完成的。您的计算机将与您的 Android 进行不同的会话。事实上,您计算机上的每个浏览器都会有不同的会话,除非它们有共享 cookie 的方式。

此外,脚本化请求(如 Android 代码)不会自动记住 cookie 并在请求之间发送,因此它们可能会为每个请求启动一个新会话,并丢失前一个会话的信息。

有很多解决方案...

  1. 重组您的流程,这样您就不需要以这种方式保留消息 - 只是从删除它们的脚本中返回消息?或者让第一个脚本返回消息并向第二个脚本传递要删除的消息 ID。最后一点也可能“更安全”,因为在您知道应用已收到任何内容之前,您不会删除任何内容。

  2. 找到一种方法来记住 cookie 并将它们与后续请求一起发送。 How do I make an http request using cookies on Android? 可能对此有用。

  3. 从 PHP 获取会话 ID 并将其与您的所有请求一起发送。您可以使用session_id() 在 PHP 中获取和设置会话 ID。

最后两个对于 API 来说不是很好的做法,因为我们的目标是使 API 成为 stateless,但它们可能对您有用。

【讨论】:

  • 非常感谢您的解释。我会进行调查,今天我将实施其中一项,以便最终完成项目!
【解决方案2】:

是的,我看到了这个问题,很奇怪,我以前没有遇到过这个问题,但看起来你可以在 SQL 语句中添加一些东西来纠正它......

SELECT * FROM messages WHERE touser='$from' AND WHERE touser IS NOT NULL

我认为这会阻止显示空行。 IS NOT NULL 应该是关键。

【讨论】:

  • 错误信息:SELECT * FROM messages WHERE touser=''AND WHERE touser IS NOT NULL 数据库错误!您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE touser IS NOT NULL”附近使用正确的语法
  • AND之后你不想WHERE
  • @PhillSparks - 我知道,试过了,但仍然没有改变任何东西,因为就像你说的 $_POST 不会有任何价值。
  • @StuartWickenden - 顺便谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 2011-01-16
  • 2017-11-21
  • 2017-04-09
  • 2021-07-28
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多