Как проверить вставку повторяющихся записей в 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();
}
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.