#r #parameter-passing #pool
#r #передача параметров #Бассейн
Вопрос:
Я пытаюсь передать фрейм данных в новый параметр, а затем ОБНОВИТЬ до SQL. Я застрял при передаче параметра
library(pool)
library(RMySQL)
library(DT)
library(DBI)
ui <- actionButton("edit_button", "Copy", icon("copy"))
server <- function(input, output, session) {
#load staff and make reactive to input
staff <- reactive({
input$submit
input$submit_edit
dbReadTable(pool, "staff")
})
#Form for data entry
entry_form <- function(button_id){
showModal(
modalDialog(
div(id=("entry_form"),
tags$head(tags$style(".modal-dialog{ width:400px}")),
tags$head(tags$style(HTML(".shiny-split-layout > div {overflow: visible}"))),
fluidPage(
fluidRow(
splitLayout(
cellWidths = c("250px", "100px"),
cellArgs = list(style = "vertical-align: top"),
textInput("userName", labelMandatory("userName"), placeholder = ""),
selectInput("picker", "picker", multiple = FALSE, choices = c("", "admin","basic"))
),
textInput("email", "email", width = "354px"),
selectInput("approval", "approval", multiple = FALSE, choices = c("", "approve", "not approve")),
selectInput("permission", "permission", multiple = FALSE, choices = c("", "1", "0")),
helpText(labelMandatory(""), paste("Mandatory field.")),
actionButton(button_id, "Submit")
),
easyClose = TRUE
)
)
)
)
}
#save form data into data_frame format
formData <- reactive({
formData <- data.frame(row_id = UUIDgenerate(),
userName = input$userName,
picker = input$picker,
email = input$email,
approval = input$approval,
permission = input$permission,
stringsAsFactors = FALSE)
return(formData)
})
#edit data
observeEvent(input$edit_button, priority = 20,{
SQL_df <- dbReadTable(pool, "staff")
showModal(
if(length(input$staff_table_rows_selected) > 1 ){
modalDialog(
title = "Warning",
paste("Please select only one row." ),easyClose = TRUE)
} else if(length(input$staff_table_rows_selected) < 1){
modalDialog(
title = "Warning",
paste("Please select a row." ),easyClose = TRUE)
})
if(length(input$staff_table_rows_selected) == 1 ){
entry_form("submit_edit")
updateTextInput(session, "userName", value = SQL_df[input$staff_table_rows_selected, "userName"])
updateSelectInput(session, "picker", selected = SQL_df[input$staff_table_rows_selected, "picker"])
updateTextInput(session, "email", value = SQL_df[input$staff_table_rows_selected, "email"])
updateSelectInput(session, "approval", selected = SQL_df[input$staff_table_rows_selected, "approval"])
updateSelectInput(session, "permission", selected = SQL_df[input$staff_table_rows_selected, "permission"])
}
})
#The dataframe should be passing at this moment
observeEvent(input$submit_edit, priority = 20, {
SQL_df <- dbReadTable(pool, "staff")
row_selection <- SQL_df[input$staff_table_row_last_clicked, "userName"]
update <- dbExecute(pool, sprintf("UPDATE staff SET 'userName' = ?, 'picker' = ?, 'email' = ?,
'approval' = ?, 'permission' = ? WHERE row_id = '%s';", row_selection),
param = list(input$userName,
input$picker,
input$email,
input$approval,
input$permission),
)
removeModal()
})
Когда я нажимаю кнопку отправки. Появляется предупреждение.
Предупреждение: ошибка в .local: неиспользуемые аргументы (alist(param = list(«haris», «basic», «haris12@gmail.com «, «одобрить», «0»), ))
80: dbSendQuery
78: dbSendStatement
76: DBI::dbExecute
74: dbExecute
72: observeEventHandler [C:/Users/Desktop/Task/adminaccess.R#220 ]
1: runApp
Заранее спасибо
Комментарии:
1. Я всегда использовал
params=
, а неparam=
. Может ли это быть причиной проблемы?2. Есть ли особая причина, по которой вы используете привязку параметров для пяти параметров (хорошо!), Но шестой параметр, с которым вы используете интерполяцию строк
sprintf
? (нехорошо) Просто сделайdbExecute(pool, "...", params=list(input$userName, ..., row_selection))
.3. Я попробовал ваше решение, но оно все равно не сработало для меня. Итак, мое решение — удалить параметры и просто поместить переменную в запрос.
Ответ №1:
Итак, я удаляю параметры и помещаю их в запрос. Этот метод сработал для меня.
observeEvent(input$submit_edit, priority = 20, {
SQL_df <- dbReadTable(pool, "staff")
row_selection <- SQL_df[input$staff_table_row_last_clicked, "userName"]
dbExecute(pool, paste0("UPDATE staff SET userName = '",input$userName,"', picker = '",input$picker,"', email = '",input$email,"',
approval = '",input$approval,"', permission = '",input$permission,"' WHERE userName = '",input$userName,"'")
)
Спасибо за советы.
Комментарии:
1. Вы перешли от в основном хорошего (подписка на «хорошие практики») к плохому (встраивание данных в строки вашего запроса). Хотя существуют опасения по поводу вредоносной SQL-инъекции (например, эксплойты XKCD для Mom , известного как «Таблицы Little Bobby»), также вызывает беспокойство искаженные строки или ошибки Unicode-vs-ANSI, даже если запрос выполняется одним аналитиком данных. Оба
DBI
(сodbc
) иRODBC
поддерживают параметризованные запросы .