2016-11-18 166 views
0

好吧,我解释你我在做什么,我需要从我的android设备插入一个用户到本地主机,我在php中使用web服务,似乎是这是行不通的,因为它说,我已经装入用户在我的数据库,但是当我去到本地主机我不觉得我的用户..Web服务不能正常工作

这里是我的代码:

的Java(Android版):

public class NewUsuarioPart2Activity extends AppCompatActivity { 

private EditText textoEmail, textoDNI, textoEdad,textoNombreUsu; 
private Button btnHecho; 
private String nom = ""; 
private String apellido = ""; 
private String contra = ""; 
private String contraNew = ""; 
private int id = 1; 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_usuario_nuevo_part2); 

    if (android.os.Build.VERSION.SDK_INT > 9) { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     String str = "*** My thread is now configured to allow connection"; 

     Toast.makeText(getApplication(), str, Toast.LENGTH_LONG).show(); 
    } 

    //LO GUARDADO DE NEWUSUARIOACTIVITY 
    if (savedInstanceState == null) { 
     Bundle extras = getIntent().getExtras(); 
     if(extras == null) { 
      nom = null; 
      apellido = null; 
      contra = null; 
      contraNew = null; 
     } else { 
      nom = extras.getString("STRING_NOM"); 
      apellido = extras.getString("STRING_APELLIDO"); 
      contra = extras.getString("STRING_CONTRA"); 
      contraNew = extras.getString("STRING_CONTRA_NEW"); 
     } 
    } else { 
     nom = (String) savedInstanceState.getSerializable("STRING_NOM"); 
     apellido = (String) savedInstanceState.getSerializable("STRING_APELLIDO"); 
     contra = (String) savedInstanceState.getSerializable("STRING_CONTRA"); 
     contraNew = (String) savedInstanceState.getSerializable("STRING_CONTRA_NEW"); 
    } 

    textoEmail = (EditText)findViewById(R.id.edEmail); 
    textoDNI = (EditText)findViewById(R.id.edDNI); 
    textoEdad = (EditText)findViewById(R.id.edEdad); 
    textoNombreUsu = (EditText)findViewById(R.id.edNomUsu); 

    btnHecho = (Button)findViewById(R.id.btnHecho); 
    btnHecho.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      id++; 
      new Insertar(NewUsuarioPart2Activity.this).execute(); 
      Intent intent = new Intent(NewUsuarioPart2Activity.this, MainActivity.class); 
      v.getContext().startActivity(intent); 

     } 
    }); 

} 

//What I do here is insert my new user to my database 



private boolean insertar(){ 

     HttpClient httpclient; 
     List<NameValuePair> nameValuePairs; 
     HttpPost httppost; 
     httpclient=new DefaultHttpClient(); 
     httppost= new HttpPost("http://192.168.231.88/xabiagame/data/insertarOtroMetodo.php"); // Url del Servidor 
     //Añadimos nuestros datos 
     nameValuePairs = new ArrayList<NameValuePair>(8); 
     nameValuePairs.add(new BasicNameValuePair("id",String.valueOf(id).trim())); 
     nameValuePairs.add(new BasicNameValuePair("nombre",nom.trim())); 
     nameValuePairs.add(new BasicNameValuePair("apellidos",apellido.trim())); 
     nameValuePairs.add(new BasicNameValuePair("email",textoEmail.getText().toString().trim())); 
     nameValuePairs.add(new BasicNameValuePair("dni",textoDNI.getText().toString().trim())); 
     nameValuePairs.add(new BasicNameValuePair("contrasenya",contraNew.trim())); 
     nameValuePairs.add(new BasicNameValuePair("usuario",textoNombreUsu.getText().toString().trim())); 
     nameValuePairs.add(new BasicNameValuePair("edad",textoEdad.getText().toString().trim())); 

     for (int i=0; i<nameValuePairs.size(); i++){ 
      Log.i("User", nameValuePairs.get(i).toString()); 
     } 

     try { 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      httpclient.execute(httppost); 
      return true; 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return false; 
    } 

    //AsyncTask para insertar Personas 
    class Insertar extends AsyncTask<String,String,String> { 

     private Activity context; 

     Insertar(Activity context){ 
      this.context=context; 
     } 
     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generated method stub 
      if(insertar()) 
       context.runOnUiThread(new Runnable(){ 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         Toast.makeText(context, "Persona insertada con exito", Toast.LENGTH_LONG).show(); 

         nom = null; 
         apellido = null; 
         contra = null; 
         contraNew = null; 

         textoEmail.setText(""); 
         textoDNI.setText(""); 
         textoEdad.setText(""); 
         textoNombreUsu.setText(""); 
        } 
       }); 
      else 
       context.runOnUiThread(new Runnable(){ 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         Toast.makeText(context, "No insertado", Toast.LENGTH_LONG).show(); 
        } 
       }); 
      return null; 
     } 
    } 
} 

下面是我的PHP Web服务(我有两个):

而这两个似乎是行不通的。

第一招:

<?PHP 
$hostname_localhost ="localhost"; //nuestro servidor 
$database_localhost ="xabiagame";//Nombre de nuestra base de datos 
$username_localhost ="root";//Nombre de usuario de nuestra base de datos (yo utilizo el valor por defecto) 
$password_localhost ="";//Contraseña de nuestra base de datos (yo utilizo por defecto) 

//'ejemplo.com:3307', 'usuario_mysql', 'contraseña_mysql' 

$localhost = mysql_connect($hostname_localhost,$username_localhost,$password_localhost)//Conexión a nuestro servidor mysql 
or 
trigger_error(mysql_error(),E_USER_ERROR); //mensaaje de error si no se puede conectar 
mysql_select_db($database_localhost, $localhost);//seleccion de la base de datos con la qu se desea trabajar 

//variables que almacenan los valores que enviamos por nuestra app, (observar que se llaman igual en nuestra app y aqui) 
$id=$_POST['id']; 
$nombre=$_POST['nombre']; 
$apellidos=$_POST['apellidos']; 
$email=$_POST['email']; 
$dni=$_POST['dni']; 
$contrasenya=$_POST['contraseña']; 
$usuario=$_POST['usuario']; 
$edad=$_POST['edad']; 

$query_search = "insert into usuario(id,nombre,apellidos,email, dni, contraseña, usuario, edad) values ('".$id."','".$nombre."','".$apellidos."','".$email."','".$dni."','".$contrasenya."','".$usuario."','".$edad."')";//Sentencia sql a realizar 
$query_exec = mysql_query($query_search) or die(mysql_error());//Ejecuta la sentencia sql. 

/* Consignar la transación */ 
if (!mysqli_commit($localhost)) { 
    print("Falló la consignación de la transacción\n"); 
    exit(); 
} 
/* Cerrar la conexión */ 
mysqli_close($localhost); 

?> 

另一种:

<?php 

$id=$_POST['id']; 
$nombre=$_POST['nombre']; 
$apellidos=$_POST['apellidos']; 
$email=$_POST['email']; 
$dni=$_POST['dni']; 
$contrasenya=$_POST['contraseña']; 
$usuario=$_POST['usuario']; 
$edad=$_POST['edad']; 

$servername = "localhost"; 
$username = "root"; 
$password = ""; 
$dbname = "xabiagame"; 
// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection fallida: " . $conn->connect_error); 
} 
$sql = "INSERT INTO usuario (id,nombre,apellidos,email, dni, contraseña, usuario, edad) 
VALUES ('$id','$nombre','$apellidos','$email','$dni','$contrasenya','$usuario','$edad')"; 
if ($conn->query($sql) === TRUE) { 
    echo "se creo el usuario"; 
} else { 
    echo "Error: " . $sql . "<br>" . $conn->error; 
} 
$conn->close(); 
?> 

我不知道什么是我的错误。它似乎是所有罚款,我想..

+0

您的代码对** SQL注入**攻击广泛开放。想象一下,像“'发布$ edad的人); DROP TABLE usuario; - ' - 请使用参数化语句来保护您的系统。 –

+0

@FranzGleichmann这是我高中的最后一个项目,我真的不在乎知道一些攻击..我知道你说得很对,并且非常感谢你的建议,但是,我知道我只是想插入或获取信息..当我已经完成了,我将专注于参数化的语句...谢谢你的回答:D – AlbusAllDay

+2

以及我不能知道这一点。无论如何:作为一个学校项目是**没有**编写不安全的代码的借口,因为这样,你训练自己在将来编写不安全的代码。另外:当有人插入任何包含'''的值时,您的代码将随时中断。 –

回答

0

问题在于,您始终将相同的id分配给您试图保存在数据库中的记录。因此用户已经存在的错误。

这里检查你的代码:

private int id = 1; 

这个变量在你的代码永远不会改变,所以你要保存有id=1记录。在我看来,你不应该从你的android应用程序发送id,你的数据库的工作是为每个新插入分配id。检查主要关键策略自动递增。

+0

谢谢你的答案,但它不是我认为,因为当我把ID等于2它显示我一样...用户插入,但没有人在我的数据库 – AlbusAllDay

+0

在您的数据库中,标记为主键的字段“id”?如果确实保持相同的'id'并且插入记录会导致问题。所以这是一个肯定的错误。现在,尝试通过在'$ sql =“INSERT ...'语句正下方的'php'中添加'echo $ sql;'来调试插入查询,并尝试在您的数据库中运行它。 – pleft

+0

是的_id_被标记作为主键......当我在[链接] http://sandbox.onlinephpfunctions.com/中运行该php web服务时,它显示我:'
致命错误:未捕获错误:未找到类'mysqli' [...] [...]:17 堆栈跟踪: #{0}主抛出 在[...] [...]上线
' – AlbusAllDay

0
<?php 
$data = json_decode(file_get_contents('php://input'), true); 
    $key= $input->value; //try like this for all below. 
    /* $id=$_POST['id']; 
$nombre=$_POST['nombre']; 
$apellidos=$_POST['apellidos']; 
$email=$_POST['email']; 
    $dni=$_POST['dni']; 
$contrasenya=$_POST['contraseña']; 
$usuario=$_POST['usuario']; 
$edad=$_POST['edad']; 
*/ 
$servername = "localhost"; 
    $username = "root"; 
    $password = ""; 
    $dbname = "xabiagame"; 
    // Create connection 
    $conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
die("Connection fallida: " . $conn->connect_error); 
} 
$sql = "INSERT INTO usuario (id,nombre,apellidos,email, dni, contraseña, usuario, edad) 
    VALUES ('$id','$nombre','$apellidos','$email','$dni','$contrasenya','$usuario','$edad')"; 
if ($conn->query($sql) === TRUE) { 
echo "se creo el usuario"; 
} else { 
echo "Error: " . $sql . "<br>" . $conn->error; 
} 
$conn->close(); 
?> 
+0

为什么你评论的ID, nombre,apellidos ... etc? – AlbusAllDay

+0

您试图通过这种方式获取值。$ key = $ input-> value..ex:$ id = $ input-> id;做这个w唉所有 –

+0

我这样做,它告诉我相同的用户插入,但在我的数据库中没有... – AlbusAllDay