【问题标题】:Status 200 = HttpPut works?状态 200 = HttpPut 有效吗?
【发布时间】:2016-07-30 07:02:47
【问题描述】:

我正在尝试修改我的数据库 (MySQL) 的值。对于这个问题,我在我的Android 应用程序上使用HttPutSlim framework 作为PHP 的微框架,XAMPP 用于管理数据库。

问题在于它没有修改我的数据库,但是当我使用 response.getStatusLine().getStatusCode() 时它给了我状态 200。

如果我不理解,当您收到状态 200 时,那是因为请求已成功。正如你在这里看到的:status 200 OK

请求成功。

我错过了什么吗?我理解错了吗?为什么数据库没有变化?

P.S.如果您需要我提供一些代码,请在评论中告诉我。

编辑:这是我在PHP script 中的put 方法。

$app->put("/cars/",function() use($app)
{
    $name = $app->request->put("name");
    $description = $app->request->put("description");
    $idCar = $app->request->put("idCar");

    try{
        $connection = getConnection();
        $dbh = $connection->prepare("UPDATE cars SET name = ?, description = ? WHERE idCar = ?");
        $dbh->bindParam(1,$name);
        $dbh->bindParam(2,$description);
        $dbh->bindParam(3,$idCar);

        $dbh->execute();
        $connection = null;

        header("HTTP/1.1 200");
        header("Content-Type:application/json; charset=utf-8");
        echo json_encode(array('status' => true),JSON_UNESCAPED_UNICODE );

    }catch(PDOException $e)
    {
        echo "Error: " . $e->getMessage();
    }
});

编辑 2:这是我使用 HttpPut 的代码。

class EditCar extends AsyncTask<Void, Integer, Void> {

    private Car editCar;

    EditCar(Car editCar) {
        this.editCar = editCar;
    }

    protected void onPreExecute() {
    }

    protected Void doInBackground(Void... params) {

        try {

            String url = "http://IP of my computer/project/cars/";

            HttpClient httpClient = new DefaultHttpClient();
            HttpPut method = new HttpPut(url);

            List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();

            nameValuePairList.add(new BasicNameValuePair("name", editCar.getName()));
            nameValuePairList.add(new BasicNameValuePair("description", editCar.getDescription()));
            nameValuePairList.add(new BasicNameValuePair("idCar", Integer.toString(editCar.getIdCar())));

            method.setEntity(new UrlEncodedFormEntity(nameValuePairList));
            HttpResponse response = httpClient.execute(method);

        } catch (Exception ex) {
            Log.e("Error", ex.toString());
        }

        return null;
    }

    protected void onProgressUpdate() {
    }

    protected void onPostExecute() {
    }
}

【问题讨论】:

  • 你能显示php代码吗?此外,根据您设置的标题(如果有),如果它找到并运行 php 文件,它会返回 200 OK。另外,尝试将 PHP 错误报告放在脚本的顶部 - ini_set('display_errors', 1); error_reporting(-1);
  • @Darren 当然,我现在将使用put 方法编辑我的问题。我必须把你的ini_seterror_reporting 放在哪里?在我所有的方法之前?
  • 是的,在您的&lt;?php 开始标签之后的第一件事。
  • UPDATE 不会返回 $connection-&gt;lastInsertId(),因为没有插入任何内容,这可能会导致问题(返回的 json 将为空。)。您究竟需要什么才能返回您的应用程序?
  • @Darren 我以前没有,但如果没有,我不知道我要穿什么echo json_encode(//here,JSON_UNESCAPED_UNICODE);

标签: php android mysql slim


【解决方案1】:

200 状态没有说明您的更新。

  • 您是否选择了正确的数据库连接?
  • 您的查询看起来很正常,但我看不到参数值。您确定它们包含正确的值吗?
  • 您可以通过 bindParam 方法指定数据类型
  • 您执行“更新”,因此 lastInsertId 用于“插入”

但是,你可以这样做:

print_r([$name,$description,$idCar]); // temporaly line for debugging!

$dbh = $connection->prepare("UPDATE cars SET name = ?, description = ? WHERE idCar = ?");
$dbh->execute([$name,$description,$idCar]);

如果你使用

【讨论】:

  • 现在我编辑了关于lastInsertId 问题的问题,我知道连接数据库是正确的,因为我使用GETPOSTDELETE 方法而我没有任何问题。当你说parameter values 时,你想看到什么?我向查询发送什么?
  • 是的,你确定每个参数变量都有正确的值吗?
  • 当我将它们添加到nameValuePairList 时,我必须将它们转换为String(因为它不接受其他类型的值)。我需要在 php 脚本上再次转换吗?
  • 让我们先检查一下:如果这样做,输出是什么: print_r([$name,$description,$idCar]);
  • 我必须把它放在哪里?在我的 php 脚本上?
【解决方案2】:

终于,我得到了解决方案。我不知道如何在我的HttpPut 方法上查看我的应用程序正在使用哪些数据,所以通过互联网搜索,我终于找到了一种查看正在使用哪些数据的方法。如下:

执行你的响应后,你可以把这两行:

HttpEntity entity = response.getEntity();
String responseText = EntityUtils.toString(entity);

然后您可以通过Log 看到它在您的HttpPut 中发送的数据:

Log.d("response",responseText);

使用该方法,我看到了正在发送的数组,它也给了我一个错误,它告诉我我 cannot add or update a child row。这是因为$idCar 在另一个表中有一个引用(级联),而我发送的值在另一个表中不存在。

当我发送第二个表中存在的值时,它可以正常工作!

编辑:要查看您正在使用的值的数组,您必须输入

print_r([$name,$description,$idCar]);

在你的 php script 你的 put 方法中和设置你的变量值之后。像这样:

$name = $app->request->put("name");
$description = $app->request->put("description");
$idCar = $app->request->put("idCar");

print_r([$name,$description,$idCar]);

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多