问题比听起来更简单(我认为).我有一个名为的数据库表table,我正在尝试在名为的列中插入数据first.这是代码的一部分:
my $stmt = $dbh->prepare($sql);
@array=("first","second","third");
$sql = "INSERT INTO table($array[0]) VALUES(?)";
$stmt->execute($some_value);
Run Code Online (Sandbox Code Playgroud)
该程序在没有警告的情况下运行,但它只是用0填充表,这是不同的$some_value.
首先,命名表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);
Run Code Online (Sandbox Code Playgroud)
我没有测试这个,但可能有必要写
my $sql = "INSERT INTO `table` (" . $dbh->quote_identifier($columns[0]) . ") VALUES(?)";
Run Code Online (Sandbox Code Playgroud)
因为table是SQL中的关键字.更好地根据它包含的东西命名,而不是它的形状.
正如@ikegami在评论中指出的那样,让DBI驱动程序引用列名称(quote_identifier()而不是直接使用它们)也更好,因为从(不可信的)变量构建SQL语句总是很危险的.
也许你对语句准备的工作方式感到困惑.调用后,基本陈述不能改变prepare,这意味着在
INSERT INTO mytable (col1, col2) VALUES (?,?)
Run Code Online (Sandbox Code Playgroud)
您只能为两个?占位符提供不同的值,然后使用不同的值重新执行相同的语句?.例如,它不可能写
INSERT INTO ? (?, ?) VALUES (?,?)
Run Code Online (Sandbox Code Playgroud)
然后prepare然后运行该语句
$sth->execute('my_table', 'col1', 'col2', 'val1', 'val2');
Run Code Online (Sandbox Code Playgroud)
这不行.
如果要运行两个不同的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 (?)");
Run Code Online (Sandbox Code Playgroud)
然后按照您的喜好并以任意顺序执行这两个语句:
$stmt_for_col1->execute('value_for_col1');
$stmt_for_col2->execute('value_for_col2');
$stmt_for_col1->execute('value_for_col1');
Run Code Online (Sandbox Code Playgroud)
或者一次只使用一个陈述:
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');
Run Code Online (Sandbox Code Playgroud)
prepare每个语句执行一次该步骤,该execute步骤可以(并且经常)在循环中运行以使语句以不同的值执行.
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |