2017-06-16 43 views
0

這個問題比聽起來更簡單(我認爲)。 我有一個名爲table的數據庫表,我試圖在名爲first的列中插入數據。 下面是代碼的一部分:Perl-從數組讀取數據時將數據插入到SQL中?

my $stmt = $dbh->prepare($sql); 
@array=("first","second","third");  
$sql = "INSERT INTO table($array[0]) VALUES(?)"; 
$stmt->execute($some_value); 

程序而不警告運行,但它只是填充0的表,它是從不同$some_value

+1

在給它賦值之前,你可以在'prepare'語句中使用'$ sql'?是對的嗎? – mob

+1

@mob我不認爲它是正確的,但它是真實的;-) – PerlDuck

+4

準備好語句並期望它可以工作後,您無法更改SQL! –

回答

5

首先,命名一個表table是一個壞主意,因爲它可能是你必須不時地逃避它的名字。

其次,您的陳述錯誤的順序。您首先準備一些語句(內容未知),然後只爲該變量分配一條SQL語句。

試試這個:

my @columns = ("first","second","third");  
my $sql = "INSERT INTO table(" . $dbh->quote_identifier($columns[0]) . ") VALUES(?)"; 
my $stmt = $dbh->prepare($sql); 
$stmt->execute($some_value); 

我沒有測試這一點,但它可能必要寫

my $sql = "INSERT INTO `table` (" . $dbh->quote_identifier($columns[0]) . ") VALUES(?)"; 

因爲table是SQL關鍵字。根據它所包含的內容而不是它的形狀來更好地命名它。

正如@ikegami在評論中指出的那樣,最好讓DBI驅動程序引用列名(quote_identifier()而不是直接使用它們),因爲從(不可信)變量構建SQL語句總是很危險。


也許你很困惑語句準備如何工作。基本語句不能以prepare一個電話,這意味着

INSERT INTO mytable (col1, col2) VALUES (?,?) 

只能提供兩個?佔位符不同的值,然後用這些?期不同值重新執行同樣的語句之後變化。 例如,它不可能寫

INSERT INTO ? (?, ?) VALUES (?,?) 

,然後prepare該語句,然後運行

$sth->execute('my_table', 'col1', 'col2', 'val1', 'val2'); 

這是行不通的。


如果你想運行兩個不同的INSERT語句(對於兩個不同的列),那麼你需要準備兩次。根據您的實際情況下,你可以要麼

my $stmt_for_col1 = $dbh->prepare("INSERT INTO my_table (col1) VALUES (?)"); 
my $stmt_for_col2 = $dbh->prepare("INSERT INTO my_table (col2) VALUES (?)"); 

,然後執行兩個語句往往你喜歡的任意順序:

$stmt_for_col1->execute('value_for_col1'); 
$stmt_for_col2->execute('value_for_col2'); 
$stmt_for_col1->execute('value_for_col1'); 

只使用一個聲明在一個時間:

my $stmt = $dbh->prepare("INSERT INTO my_table (col1) VALUES (?)"); 
$stmt->execute('value_for_col1'); 
$stmt->execute('value_for_col1'); 

$stmt = $dbh->prepare("INSERT INTO my_table (col2) VALUES (?)"); 
$stmt->execute('value_for_col2'); 
$stmt->execute('value_for_col2'); 

prepare步驟每語句完成一次, execute步驟可以(並且經常)在循環中運行,以使語句以不同的值執行。

+0

你是對的,我的困惑是由於我不知道如何避免循環中的準備執行序列。 –