php - 当我使用 httpPost 从 android 设备调用它时,我的 php 代码出错

标签 php android apache http-post

我正在为 Android 设备编写一个程序,它将调用日志发送到主机中的数据库。我使用 httpPost 方法来执行此操作,另一方面我有一个 php 代码。

当我尝试根据请求运行这段代码时,我主要看到了一个页面:

500 Internal Server Error

Apache Error Log 中我给出了这个错误:

PHP Startup: Suhosin Extension does not officially support PHP 5.2 and below anymore, because it is discontinued. Use it at your own risk. in Unknown on line 0

我的主机提供商不允许我直接更改 php.ini 文件。

我的一些 php 代码方面:

function callLogSyncToCount()
{
global $serverAddress, $DBusername, $DBpassword, $DBname;
$userID = $_POST['userID'];
$data   = $_POST['data'];
$logs = explode('`second`', $data);
foreach($logs as $item)
{
    //list($number, $duration, $date, $type) = explode("`first`", $item);

    $counter = 0;

    $con = mysql_connect($serverAddress, $DBusername, $DBpassword) or die (mysql_error());
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
        return false;
    }
    mysql_select_db($DBname, $con);mysql_query("SET NAMES 'utf8'");
    $result = mysql_query("SELECT * FROM `call_log` WHERE `user_id` = '".$userID."' AND `number` = '".$number."' AND `date` = '".$date."' AND `type` = '".$type."'") or die (mysql_error());
    while($row = mysql_fetch_array($result))
    {
        $counter++;
    }
    if ($counter < 1)
    {
        mysql_query("INSERT INTO `call_log`(`user_id`, `date`, `duration`, `number`, `type`) VALUES ('".$userID."', '".$date."', '".$duration."', '".$number."', '".$type."')") or die (mysql_error());
    }
    mysql_close($con) or die (mysql_error());
}
return true;

我的一些 androide 端代码是:

private class SyncToCount extends AsyncTask<String, Void, String> {
    @SuppressLint("SimpleDateFormat")
    @Override
    protected String doInBackground(String... param) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(param[0]);
        SimpleDateFormat mySQLFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mySQLFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        long ID = Long.parseLong(param[1]);
        List<callLogType> calls = new ArrayList<CallLogUtility.callLogType>();

        calls = getCallList();
        String sendStr = "";
        globalVars.syncLogSize = calls.size();
        try {
            int j = 0;
            for(int i = 0; i < calls.size() && j < 20; i++) 
            {           
                if(calls.get(i).ID <= ID)
                    continue;
                j++;
                sendStr += calls.get(i).PhoneNumber + "`first`";
                sendStr +=Integer.toString(calls.get(i).Duration)+ "`first`";
                Date newDate = new SimpleDateFormat("d MMM yyyy hh:mm:ss z").parse(calls.get(i).Date);
                sendStr +=mySQLFormat.format((newDate))+ "`first`";
                sendStr +=Integer.toString(calls.get(i).Type)+ "`second`";
                globalVars.syncLogUntil+=1;
            }

        } catch (Exception e) {

        }
        try
        {
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("syncType", "calllogtocount"));
            nameValuePairs.add(new BasicNameValuePair("userID", param[1]));
            nameValuePairs.add(new BasicNameValuePair("data", sendStr));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            @SuppressWarnings("unused")
            HttpResponse response = httpclient.execute(httppost);

            BufferedReader in = new BufferedReader
            (new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String line = "";
            String NL = System.getProperty("line.separator");
            while ((line = in.readLine()) != null) {
                sb.append(line + NL);
            }
            in.close();
        }
        catch(Exception ex)
        {
        }
        return null;
    }       
}

这段代码不起作用,但我的登录代码使用像这样的语法以及来自这个 android 代码和那个服务器以及 php 和数据库的语法可以正常工作。

帮帮我,我对 php 和 android 不明确...

最佳答案

我的直觉是你没有初始化你正在使用的变量,这是令人不安的事情。我没有关注命名变量的来源我假设这里没有 Register_globals(希望没有)。如果你是,它会解释为什么系统正在检查正在使用的 PHP 版本的错误,尽管我认为这只是注释掉的行的副作用。

我进一步的直觉是担心未转义的数据被放入 SQL 语句中,但如果可以使用 mysql_real_escape_string() 这可能会分散注意力,那么它应该防止(故意)不良用户数据,因为它不是。我想知道您是否发送了格式错误的数据(例如来自表单)是否会触发错误(或导致其他错误,例如 SQL 注入(inject))?

您是否使用能够完全按照您的预期提交数据的基本表单测试 PHP?这将允许您将输出数据调试到文件或屏幕以查看发生了什么,但从这里看来,PHP 代码需要这些变量明确设置为 $_POST 中的值。

在我看来,变量需要填充,但由于列表行已被注释掉,这并没有发生,这可能会给您留下未初始化的变量,这些变量可能会或可能不会让事情变得不愉快。

除此之外,如果您阻止注释掉 foreach 中的代码,它会返回 true 吗?如果是,那么我可能是对的,问题就在那里,所以一点一点地把它带回来,直到错误抛出。如果不是,那么它在外面,您已经从查询中删除了一半的代码。

我希望这能给你一些有用的东西。找到问题的根源,一切顺利。

关于php - 当我使用 httpPost 从 android 设备调用它时,我的 php 代码出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17846028/

相关文章:

php - 与 MariaDB 服务器建立连接,但无法将数据存入数据库?

php - 如何避免php代码执行后重新加载?

php - 按日期从 MySQL 中的另一行中减去行

java - Websocket服务器检测数据库中的数据变化

apache - 301重定向重写规则用连字符替换下划线并删除子目录

php - 使用 Telegram Bot 运行根脚本

android - 无法为 Unity 2019.3 和 Unity 2020.1.0a14 找到合适的 Android NDK

android - 带 Lint 的StackOverflowError

python - 简单的网络服务器和 Apache 服务器有什么区别?

windows - Apache 服务器的端口 80 正在被 PID 4(系统)使用,无法停止