Как проверить вставку повторяющихся записей в MySql и Android?


Мне нужно проверить, существует ли запись, чтобы она не была вставлена снова, плюс я хотел бы, чтобы мне сказали, как центрировать сообщения(echo), поскольку они появляются на экране моего монитора. Это мой PHP-код.

<?php

try {
    $usuario  = "698193_admin";
    $password = "1234admin";
    $conn     = new PDO('mysql:host=fdb3.runhosting.com;dbname=698193_admin', $usuario, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "ERROR: " . $e->getMessage();
}

try {
    $Code     = $_POST['Code'];
    $consulta = $conn->prepare("SELECT * FROM  Usuarios WHERE Code=" . $Code);
    $consulta->execute();

    if ($consulta->rowCount() == 1) {
        echo 'Ya  existe un Usuario con este  código';
    } else {
        $sql = $conn->prepare("INSERT INTO Usuarios(Code,user,Pass,TipoUsuario) VALUES (:Code, :user, :Pass, :TipoUsuario)");
        $sql->bindParam(':Code', $_POST['Code']);
        $sql->bindParam(':user', $_POST['user']);
        $sql->bindParam(':Pass', $_POST['Pass']);
        $sql->bindParam(':TipoUsuario', $_POST['TipoUsuario']);
        $sql->execute();

        echo 'Usuario  agregado   correctamente';
    }
} catch (PDOException $e) {
    echo 'No  se pudo  agregar  el Usuario ' . $e->getMessage();
}
?>

я также добавляю свой код android. Я думаю, что теперь ошибка здесь.

Аддусуарий.java

    private void addUsuario() {

    final String Code = et1.getText().toString().trim();
    final String User = et2.getText().toString().trim();
    final String Pass = et3.getText().toString().trim();
    final String TipoUsuario = muestraUser.getSelectedItem().toString();

    class AddUsuario extends AsyncTask<Void, Void, String> {

        ProgressDialog loading;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loading = ProgressDialog.show(addUsuario.this, "Adding...", "Wait...", false, false);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            loading.dismiss();
            Toast.makeText(addUsuario.this, s, Toast.LENGTH_LONG).show();
        }

        @Override
        protected String doInBackground(Void... v) {
            HashMap<String, String> params = new HashMap<>();
            params.put(Config.KEY_USER_CODE, Code);
            params.put(Config.KEY_USER_USUARIO, User);
            params.put(Config.KEY_USER_PASS, Pass);
            params.put(Config.KEY_USER_TIPOUSER, TipoUsuario);

            RequestHandler rh = new RequestHandler();
            String res = rh.sendPostRequest(Config.URL_ADD_USER, params);
            return res;
        }
    }

    AddUsuario ae = new AddUsuario();
    ae.execute();
}

introducir la descripción de la imagen aquí

Author: UselesssCat, 2017-03-03

1 answers

Для вашего вопроса о сообщениях Toast это, вероятно, поможет вам:

Toast toast = Toast.makeText(addUsuario.this, s, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();

В (How to display Toast at center of screen..

Теперь для Проблемы с базой данных. Обратите внимание, что существуют indices как первичные ключи, индексированные столбцы и уникальные столбцы и т. д.

Чтобы объявить таблицу с первичным ключом и "уникальными" столбцами, вы можете использовать выражение, такое как далее:

CREATE TABLE Usuarios (
    code INT NOT NULL AUTO_INCREMENT, # No puede ser nulo y se incrementa en cada inserción
    user VARCHAR(100) NOT NULL,
    pass VARCHAR(40) NOT NULL,
    tipo_usuario INT NOT NULL,
    PRIMARY KEY ( code ),            # Modifica 'code' para que sea primaria
    UNIQUE KEY user_idx ( user )     # Añade un indice a 'user' llamado 'user_idx'
);

дополнительная информация в Table creation reference.

Проблема с indices заключается в том, что это повышает производительность вашего приложения. При вставке нового пользователя, если он имеет то же имя, он терпит неудачу. Если вы попытаетесь сделать это в PHP, вам придется перебирать результаты запроса по строкам, чтобы выполнить сравнение. Представьте, если у вас есть миллион пользователей в базе данных ! Mysql и базы данных используют методы реализованы на более низком уровне для индексирования столбцов и определения того, существует ли он уже почти мгновенно, в то время как PHP не получает индексированных строк, поэтому выполняет последовательный поиск.

Поэтому для проверки вставки повторяющихся данных в PHP вы должны:

  • определить константу для кода ошибки в заголовке файла или в одном для всех констант:
    define('MYSQL_ERROR_DUPLICATE_KEY', '1062');

О объявлении констант в PHP.net.
Информация о кодах ошибки Server Error Codes and Messages.

  • проверка ошибки в блоке catch вставки:
    try {
        /* Código de inserción */
    }
    catch (PDOException $e) {
        if ($e->errorInfo[1] == MYSQL_ERROR_DUPLICATE_KEY) {
            //La inserción ha fallado por que el usuario ya existe!
        }
    }

подробная информация в Detect mysql update/insertion failure due to violated unique constraint.
подробная информация об исключениях PDO в PHP.net.

 1
Author: UselesssCat, 2017-05-23 12:39:23