【问题标题】:Web service doesn't work exactlyWeb 服务无法正常工作
【发布时间】:2016-11-18 08:53:19
【问题描述】:

好吧,我向你解释我正在尝试做什么,我需要将一个用户从我的 android 设备插入到本地主机,我在 php 中使用 Web 服务,它似乎不起作用,因为它说我已经在我的数据库中插入了那个用户但是当我去本地主机时我没有找到我的用户..

这是我的代码:

Java(安卓):

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 网络服务(我有两个):

而且那两个好像不行。

第一个:

<?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();
?>

我不知道我的错误是什么.. 似乎一切都很好,我想..

【问题讨论】:

  • 您的代码很容易受到 SQL-Injection 攻击。想象一下有人发布像'); DROP TABLE usuario; -- 这样的$edad - 请使用参数化语句来保护您的系统。
  • @FranzGleichmann 这是我高中的最后一个项目,我真的不在乎知道一些攻击.. 我知道你说得对,谢谢你的建议,但是,对知道我只是想插入或获取信息..当我已经完成时,我将专注于参数化语句......谢谢你的回答:D
  • 我不可能知道。无论如何:作为一个学校项目是没有编写不安全代码的借口,因为那样,你训练自己在未来编写不安全的代码。另外:当有人插入任何包含' 的值时,您的代码将随时中断。
  • 是的,我知道,我会采取一些方法来确保这一点,没问题.. 就像我之前说的,我更喜欢获取信息或插入,然后我确保......我已经做了一些之前的项目,但不是在 android 中,我已经用准备好的语句或一些方法来保护,而且......谢谢你的回答:D
  • 您确定要从移动设备获取数据到您的 php 脚本吗?尝试打印一些值以交叉检查您的值是否从移动设备传输到脚本。现在忽略插入数据库

标签: java php android mysql mysqli


【解决方案1】:

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

在此处检查您的代码:

private int id = 1;

此变量在您的代码中永远不会更改,因此您尝试保存的所有记录都有id=1。在我看来,您不应该从您的 android 应用程序发送 id,它是您的数据库为每个新插入分配 id 的工作。检查主键策略,例如自动增量。

【讨论】:

  • 感谢您的回答,但我不这么认为,因为当我输入 id 等于 2 时,它向我显示相同...用户已插入但我的数据库中没有人
  • 在您的数据库中,字段id 是否标记为主键?如果是,那么一定要保持相同的id 并插入记录会给你带来问题。所以这是一个肯定的错误。现在,尝试通过在 php 中的 $sql = "INSERT... 语句下方添加 echo $sql; 来调试插入查询,并尝试在数据库中运行它。
  • 是的,id 被标记为主键...当我在 [link]sandbox.onlinephpfunctions.com 中运行该 php Web 服务时,它向我显示:&lt;br /&gt; &lt;b&gt;Fatal error&lt;/b&gt;: Uncaught Error: Class 'mysqli' not found in [...][...]:17 Stack trace: #0 {main} thrown in &lt;b&gt;[...][...]&lt;/b&gt; on line &lt;b&gt;17&lt;/b&gt;&lt;br /&gt;跨度>
【解决方案2】:
<?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();
?>

【讨论】:

  • 你为什么评论 id, nombre, apellidos... 等等?
  • 你尝试以这种方式获取值。$key= $input->value..ex: $id=$input->id;为所有人这样做
  • 我就是这样做的,它告诉我同样的情况,用户插入但在我的数据库中什么都没有......
猜你喜欢
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2015-03-06
  • 2018-01-08
  • 2022-01-13
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多