Problema: Estoy tratando de crear un sistema de reserva de vehículos y quiero mostrar la actualización de una base de datos cuando las reservas de usuario de un vehículo particular, que aparecen en la vista de tabla y también eliminar el número de la placa. He comprobado el doble de la consulta, pero no funciona a través del código ni en sql phpmyadmin. El código se muestra a continuación:
public class PrintCar extends Application implements Initializable {
public TableColumn col_plateNum;
public TableColumn col_air;
public TableColumn col_seats;
public TableColumn col_make;
public TableColumn col_miles;
public TableColumn col_year;
public TableColumn col_price;
public TableColumn col_color;
public TableView table;
public TextField plateNum;
public DatePicker dateReserved;
public TableColumn col_ID;
public TableColumn col_reservedDate;
public TableColumn col_reserved;
ResultSet rs;
@Override
public void start(Stage stage) throws Exception {
Parent root= FXMLLoader.load(getClass().getResource("../GUI/PrintCar.fxml"));
stage.setTitle("JavaFX 2 Login");
stage.setScene(new Scene(root, 327,700));
stage.show();
}
ObservableList<Vehicle> obList = FXCollections.observableArrayList();
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
ConnectionClass connectionClass=new ConnectionClass();
Connection connection=connectionClass.getConnection();
PreparedStatement ps;
try {
ps = connection.prepareStatement("select * from cars ");
rs = ps.executeQuery();
obList.clear();
while(rs.next()){
obList.add(new Car(rs.getString(1),rs.getString(2),
rs.getString(3), rs.getString(4), rs.getString(5)
,rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10), rs.getString(11)));
}
} catch (SQLException e) {
e.printStackTrace();
}
col_ID.setCellValueFactory(new PropertyValueFactory<>("ID"));
col_plateNum.setCellValueFactory(new PropertyValueFactory<>("plateNumber"));
col_color.setCellValueFactory(new PropertyValueFactory<>("Color"));
col_price.setCellValueFactory(new PropertyValueFactory<>("pricePerKilometer"));
col_year.setCellValueFactory(new PropertyValueFactory<>("year"));
col_miles.setCellValueFactory(new PropertyValueFactory<>("milesTravelled"));
col_make.setCellValueFactory(new PropertyValueFactory<>("make"));
col_seats.setCellValueFactory(new PropertyValueFactory<>("maxPassengers"));
col_air.setCellValueFactory(new PropertyValueFactory<>("airConditioned"));
col_reserved.setCellValueFactory(new PropertyValueFactory<>("reserved"));
col_reservedDate.setCellValueFactory(new PropertyValueFactory<>("reservedDate"));
table.setItems(obList);
table.getSortOrder().add(col_ID);
table.getSortOrder().add(col_miles);
table.getSortOrder().add(col_make);
table.getSortOrder().add(col_reservedDate);
}
public void reserveCar(ActionEvent actionEvent) throws SQLException {
ConnectionClass connectionClass=new ConnectionClass();
Connection connection=connectionClass.getConnection();
PreparedStatement ps;
PreparedStatement ps1;
String mainSQL="SET SQL_SAFE_UPDATES = 0;";
String sql = "UPDATE `cars` SET `Reserved`= ? ,`Reserved Date`= ? WHERE 'ID' = '"+plateNum.getText()+"'";
try {
ps1 = connection.prepareStatement(mainSQL);
ps = connection.prepareStatement(sql);
ps.setString(1, "Yes");
ps.setString(2, dateReserved.getValue().toString());
ps1.executeQuery();
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Database Confirmation");
alert.setHeaderText("Success!");
alert.setContentText("Data Successfully added to Database");
alert.showAndWait();
plateNum.setText("");
dateReserved.setValue(null);
}
public void deleteCar(ActionEvent actionEvent) {
ConnectionClass connectionClass=new ConnectionClass();
Connection connection=connectionClass.getConnection();
PreparedStatement ps;
String sql = "DELETE FROM `cars` WHERE 'Plate Number' = '"+plateNum.getText()+"'";
try {
ps = connection.prepareStatement(sql);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Database Confirmation");
alert.setHeaderText("Success!");
alert.setContentText("Data Successfully added to Database");
alert.showAndWait();
plateNum.setText("");
dateReserved.setValue(null);
}
}
En MySQL utilizando el " carácter (comilla simple) para especificar un nombre de columna en un predicado de la consulta SQL, se interpreta como una cadena y no como una columna de tabla de base de datos. Es el ` caracteres (tilde) que delimita identificadores.
Así que una consulta como:
SELECT * from cars WHERE 'Plate Number' = 'ABC'
Nunca devuelve ninguna fila, a menos que la cadena que se va a comparar es 'número de matrícula' en sí:
SELECT * from cars WHERE 'Plate Number' = 'Plate Number'
en cuyo caso se le da todo el conjunto de filas de la tabla. Así que la forma correcta de escribir la consulta es:
SELECT * from cars WHERE `Plate Number` = 'ABC'
es decir, con el ** ** (backtick) character. In your case in
reserveCar` la consulta se debe especificar en esta forma:
String sql = "UPDATE `cars` SET `Reserved`= ? ,`Reserved Date`= ? WHERE `ID` = '"+plateNum.getText()+"'";
y en deleteCar
el método:
String sql = "DELETE FROM `cars` WHERE 'Plate Number' = '"+plateNum.getText()+"'";
Otra cosa importante a destacar es que para evitar problemas de seguridad como la inyección SQL, es preferible utilizar el PreparedStatement
forzando la entrada del usuario para ser manejado como el contenido de un parámetro y no como parte del comando SQL. Así, por ejemplo, sería mejor modificar el deleteCar
método de la siguiente manera:
public void deleteCar(ActionEvent actionEvent) {
ConnectionClass connectionClass=new ConnectionClass();
Connection connection=connectionClass.getConnection();
PreparedStatement ps;
String sql = "DELETE FROM `cars` WHERE `Plate Number` = ? ";
try {
ps = connection.prepareStatement(sql);
stmt.setString(1, plateNum.getText());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Database Confirmation");
alert.setHeaderText("Success!");
alert.setContentText("Data Successfully added to Database");
alert.showAndWait();
plateNum.setText("");
dateReserved.setValue(null);
}