首先,命名一個表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
步驟可以(並且經常)在循環中運行,以使語句以不同的值執行。
在給它賦值之前,你可以在'prepare'語句中使用'$ sql'?是對的嗎? – mob
@mob我不認爲它是正確的,但它是真實的;-) – PerlDuck
準備好語句並期望它可以工作後,您無法更改SQL! –