2012-03-06 2 views
0

Новичок здесь. Просто пытайтесь привязать значения, чтобы исключить SQL-инъекции. У меня есть следующий код, но я получаю эту ошибку ... вызывается с 1 переменных связывания, когда 47 необходимы на my.cgi линии 803. и результат выглядит ..bind values ​​INSERT INTO mysql perl

$new_row='53616c7465645f5fd8b88f6a16704f8ebc0a2002dfg45633617bbb0446fa', 'test12', 'user', '2012-03-06', 'xcvb', 'xb', 'xcvbb', 'xcvbb', 'UT', 'US', '4566', '4564564566', '[email protected]', 'vbn', '', '200', 'Monthly', 'eBook', 'WebStore', '9.95', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'http://my.com', 'my.com', '', '', '', '', '', '', '', '', '2012-03-06', '30-Day-Trial' 
$questionmarks=?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? 

Я пробовал он с/без кавычек и запятых. Любые идеи оценили.

foreach my $field (@account_field_order) { 
$new_row .= "'" . param($field) . "', "; 
$questionmarks .="?, "; 
}#foreach 
$new_row .= "'$status'"; 
$questionmarks .= "? "; 
my $dsn = "DBI:mysql:$database"; 
my $dbh = DBI->connect($dsn, $MYSQLuserid, $MYSQLpassword) 
      or die $DBI::errstr; 
my $sth = $dbh->prepare(qq(INSERT INTO $table VALUES ($questionmarks))) 
or die $DBI::errstr; 
$sth->execute(qq($new_row)) or die $DBI::errstr; 

ответ

0

Во-первых, позволяет устранить первые заявления:

@new_row=('53616c7465645f5fd8b88f6a16704f8ebc0a2002dfg45633617bbb0446fa', 'test12', 'user', '2012-03-06', 'xcvb', 'xb', 'xcvbb', 'xcvbb', 'UT', 'US', '4566', '4564564566', '[email protected]', 'vbn', '', '200', 'Monthly', 'eBook', 'WebStore', '9.95', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'http://my.com', 'my.com', '', '', '', '', '', '', '', '', '2012-03-06', '30-Day-Trial'); 
$questionmarks="?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"; 

Это создаст массив значений и одну строку со всеми s?.

Далее в заявлении выполнения:

$sth->execute(@new_row) or die $DBI::errstr; 

, который будет проходить в массиве значений в строке выполнения, а не один аргумент, как вы делали раньше.

+0

Спасибо. Это имеет смысл, но когда я его модифицировал, я получаю эту ошибку ... вызвал с двумя переменными связывания, когда 0 необходимо в строке account.cgi 752. –

+0

'foreach my $ field (@account_field_order) {' \t '$ new_row. = "" ". param ($ field). «» ";' ' \t $ questionmarks =" ?, «;.' ' \t} # foreach' ' @ NEW_ROW = $ NEW_ROW; '' толчок (@new_row, " '$ статус'"); ' ' $ questionmarks. = "?"; ' ' my $ sth = $ dbh-> prepare (qq (INSERT INTO $ table VALUES "$ questionmarks")) или die $ DBI :: errstr; ' ' $ sth -> выполнить (@new_row) или умереть $ DBI :: errstr; ' –

+0

Ок. Выяснил это. 'Foreach my $ field (@account_field_order) { \t push (@new_row," 'param ($ field)', "); \t $ questionmarks. = "?,"; \t} #foreach push (@new_row, "'$ status'"); $ questionmarks. = "?"; my $ dsn = "DBI: mysql: $ database"; my $ dbh = DBI-> connect ($ dsn, $ MYSQLuserid, $ MYSQLpassword) или die $ DBI :: errstr; my $ sth = $ dbh-> prepare (qq (INSERT INTO $ table VALUES ($ questionmarks))) или die $ DBI :: errstr; $ sth-> execute (@new_row) или die $ DBI :: errstr; ' –

2

Вы должны предоставить список аргументов, по одному для каждого вопросительного знака, а не один скалярный аргумент, содержащий строки аргументов. Когда я answered your question раньше, я сказал вам сделать:

my @values = map param($_), @account_field_order; # add values to array 
push @values, $status;     # for simplicity 
$new_row = join ", ", ("?") x @values; # add ? for each value 

... # basically same code as before, except the execute statement: 

$sth->execute(@values);  # arguments given will be inserted at placeholders 

Где $new_row ваш заполнитель строка, а не ваш список аргументов. Не:

$new_row .= "'" . param($field) . "', "; 
... 
$new_row .= "'$status'"; 
$sth->execute(qq($new_row)) or die $DBI::errstr; 

Потому что $new_row считается как один аргумент, так как он является скаляром. Вам нужен массив или список той же длины, что и количество вопросительных знаков.

+0

Я использовал ваш код и получил ошибку, так как« значения не совпадают с количеством столбцов », поскольку он выполнял только 22 параметра/значений. Таблица содержит 47 полей/столбцов. НО, это дало мне идею для вышеуказанного кода, который, кажется, ближе. –

+0

Возможно, это ошибка SQL. Трудно сказать, так как вы не даете мне много информации. – TLP