Perl-在从数组读取列时将数据插入 SQL?
Perl- insert data into SQL while reading the columns from an array?
这个问题比听起来简单(我认为)。
我有一个名为 table
的数据库 table,我正在尝试将数据插入名为 first
的列中。
这是代码的一部分:
my $stmt = $dbh->prepare($sql);
@array=("first","second","third");
$sql = "INSERT INTO table($array[0]) VALUES(?)";
$stmt->execute($some_value);
程序运行没有任何警告,只是简单地用0填充table,这与$some_value
不同。
首先,将 table 命名为 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()
而不是直接使用它们),因为构建 [=65= 总是很危险] 来自(不受信任的)变量的语句。
也许您对语句准备的工作方式感到困惑。基本语句在调用 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
步骤可以(并且经常)在循环中 运行 使语句以不同的值执行。
这个问题比听起来简单(我认为)。
我有一个名为 table
的数据库 table,我正在尝试将数据插入名为 first
的列中。
这是代码的一部分:
my $stmt = $dbh->prepare($sql);
@array=("first","second","third");
$sql = "INSERT INTO table($array[0]) VALUES(?)";
$stmt->execute($some_value);
程序运行没有任何警告,只是简单地用0填充table,这与$some_value
不同。
首先,将 table 命名为 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()
而不是直接使用它们),因为构建 [=65= 总是很危险] 来自(不受信任的)变量的语句。
也许您对语句准备的工作方式感到困惑。基本语句在调用 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
步骤可以(并且经常)在循环中 运行 使语句以不同的值执行。