2017-08-11 151 views
0

我有一个方法将值插入到外部数据库。我有一组团队成员名称,这些成员名称随着团队成员团队ID(这是team_members表中的外键)逐个循环发送到数据库。插入脚本返回成功,但没有插入数据库

下面是我简单的数据库设计:

CREATE TABLE team (
team_id int(11) NOT NULL AUTO_INCREMENT, 
unique_id varchar(23) NOT NULL, 
teamName varchar(50) NOT NULL, 
PRIMARY KEY (team_id) 
); 


CREATE TABLE team_member (
team_member_id int(11) NOT NULL AUTO_INCREMENT, 
unique_id varchar(23) NOT NULL, 
fullName varchar(50) NOT NULL, 
team_id int (11) NOT NULL, 
PRIMARY KEY (team_member_id), 
FOREIGN KEY (`team_id`) 
REFERENCES `scratchcard`.`team` (`team_id`) 
); 

以下是我的方法,我用它来实现这一目标:

private void addTeamMember(final List teamMemberArray,final String team_id) { 

    //helps with debugging regarding post requests 
    Gson gson = new GsonBuilder() 
      .setLenient() 
      .create(); 


    //Retrofit is a REST Client for Android and Java by Square. 
    //It makes it relatively easy to retrieve and upload JSON (or other structured data) via a REST based webservice 
    Retrofit retrofit = new Retrofit.Builder() 
      //directing to the localhost which is defined in the Constants Class as BASE_URL 
      .baseUrl(Constants.BASE_URL) 
      //Add converter factory for serialization and deserialization of objects. 
      //Gson passed as a parameter to help with debug 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      //Create the Retrofit instance using the configured values. 
      .build(); 


    //The Retrofit class generates an implementation of the RequestInterface interface. 
    RequestInterface requestInterface = retrofit.create(RequestInterface.class); 




    for (Object x : teamMemberArray) { 



     //create new Team object 
     TeamMember teamMember = new TeamMember(); 


     //setter 
     teamMember.setFullName(String.valueOf(x)); 
     teamMember.setTeam_id(team_id); 

     Toast.makeText(getActivity(), teamMember.getFullName(), 
       Toast.LENGTH_LONG).show(); 


     //create new server object 
     final ServerRequest request = new ServerRequest(); 


     //make a request to set the operation to Team_Member 
     request.setOperation(Constants.Team_Member); 
     //set values entered for the new teamMember to be sent to the server 
     request.setTeamMember(teamMember); 


     Call<ServerResponse> response = requestInterface.operation(request); 


     /** 
     * Enqueue is used to Asynchronously send the request and notify callback of its response or if an error occurred 
     * talking to the server, creating the request, or processing the response. 
     */ 


     response.enqueue(new Callback<ServerResponse>() { 

      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

       ServerResponse resp = response.body(); 


      /*Snackbars provide lightweight feedback about an operation. They show a brief message at the 
      bottom of the screen on mobile and lower left on larger devices. Snackbars appear above all other 
      elements on screen and only one can be displayed at a time. 
      */ 


       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 


       if (resp.getResult().equals(Constants.SUCCESS)) { 
        SharedPreferences.Editor editor = pref.edit(); 


        Log.d("TEST VALUE", "getTeamMemberName() = " + response.body().getTeamMember().getFullName()); 
        Log.d("TEST VALUE", "getTeamMemberUniqueID() = " + response.body().getTeamMember().getUnique_id()); 
        Log.d("TEST VALUE", "getTeamMemberTeamID() = " + response.body().getTeamMember().getTeamID()); 

          editor.putString(Constants.FULL_NAME, resp.getTeamMember().getFullName()); 
          editor.putString(Constants.UNIQUE_ID, resp.getTeamMember().getUnique_id()); 
          editor.putString(Constants.TEAM_ID, resp.getTeamMember().getTeamID()); 
          editor.apply(); 
          goToQuestions(); 

       } 

       progress.setVisibility(View.INVISIBLE); 

      } 

      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 

       progress.setVisibility(View.INVISIBLE); 
       Log.d(Constants.TAG, "failed" + t); 
       Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 


      } 
     }); 
    } 

} 

因为我在同一时间将这些值之一,我有以下简单的插入脚本(使用PDO)

public function insertTeamMember($fullName, $team_id){ 


$unique_id = uniqid('', true); 


$sql = 'INSERT INTO team_member SET unique_id =:unique_id,fullName =:fullName, team_id =:team_id'; 

$query = $this ->conn ->prepare($sql); 
$query->execute(array('unique_id' => $unique_id, ':fullName' => $fullName, ':team_id' => $team_id)); 
$data = $query -> fetchObject(); 


if ($query) { 

    $teamMember["fullName"] = $fullName; 
    $teamMember["unique_id"] = $unique_id; 
    $teamMember["team_id"] = $team_id; 

    return $teamMember; 


} else { 

    return false; 

    } 
} 

我的日志输出使用response.body确认毫秒的价值观到我的插入脚本罚款。

08-11 11:07:49.750 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberName() = 1 
08-11 11:07:49.750 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberUniqueID() = 598d90061b7de5.56364485 
08-11 11:07:49.750 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberTeamID() = 598d8ffd0b9969.94188022 
08-11 11:07:49.754 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberName() = 2 
08-11 11:07:49.754 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberUniqueID() = 598d90061d4347.93277262 
08-11 11:07:49.754 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberTeamID() = 598d8ffd0b9969.94188022 
08-11 11:07:49.759 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberName() = 3 
08-11 11:07:49.759 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberUniqueID() = 598d90061d8bb2.78397401 
08-11 11:07:49.759 3884-3884/com.test.practise D/TEST VALUE: getTeamMemberTeamID() = 598d8ffd0b9969.94188022 

我的回调确认数据(我用MYSQL)作为通过我的日志输出显示,但该数据没有实际插入到我的数据库的成功插入。

我相信我的插入脚本肯定有问题,但我不确定解决方案是什么。我试图用邮递员来帮助我,但是这又不是指向我为什么被告知成功,但实际上并没有让我的数据插入的方向。

回答

1

您的插入查询是错误的。它应该看起来像

$sql = 'INSERT INTO team_member (`unique_id`, `fullName`, `team_id`) VALUES (:unique_id, :fullName, :team_id)'; 

删除下面的行。它用于“SELECT”提取记录。您运行插入查询。

$data = $query -> fetchObject(); 

在同一位置添加下面的行并获取最后一个插入ID。

$insert_id = $this ->conn->lastInsertId();//find last inserted id. 

if($insert_id > 0){ 
    $teamMember["fullName"] = $fullName; 
    $teamMember["unique_id"] = $unique_id; 
    $teamMember["team_id"] = $team_id; 

    return $teamMember; 

} 
+0

感谢您的回答,但我在邮差 - 未定义的属性中出现以下错误:PDostatement :: $ insert_id –

+0

噢好的。你可以申请$ insert_id = $ this - > conn-> lastInsertId();而不是$ insert_id = $ query-> insert_id; –

+0

我现在得到未定义的属性:PDOStatement :: $ num_rows –

相关问题