嗯,这是我的问题。
我需要在三个tabblas nid,name,dir中插入数据,这些数据是使用正则表达式从文件中过滤出来的,并且有数千个,使用循环来实现三分之三。
文件/ home / lola / locatebookmarks中的内容
"date_added": "12988591842733282",
"id": "1706",
"name": "Xenode Systems Blog: \u00BFQu\u00E9 Hacer despu\u00E9s de instalar Fedora 15?",
"type": "url",
"url": "http://otrolink.com.ar/lola.html"
"date_added": "12988591842733884",
"id": "1707",
"name": "Install Google Chrome in Fedora 16 / 15 / 14 using YUM | HowOpenSource",
"type": "url",
"url": "http://www.howopenlola.com/2011/11/"
"date_added": "12988591842734487",
"id": "1708",
"name": "Linuxant - Linux drivers for Conexant chipsets - ALSA driver with improved support for Conexant chipsets",
"type": "url",
"url": "http://urlllola.com/alsa-driver/"
这个代码在perl中。
use DBI;
use DBD::mysql;
$host = "localhost";
$database = "bookmarks";
$tablename = "test";
$user = "lola";
$pwd = "pass";
$connect = DBI->connect("DBI:mysql:$database:$host", $user, $pwd);
open(FILE, '/home/lola/locatebookmarks');
my @array;
my $var;
while ($i = <FILE>) {
if ($i =~ /(id|name|http)/) {
if ($i =~ s/("|:|,|name|id|url)//g) {
($key) = $i;
push(@array, $var);
}
}
}
close(FILE);
$n=@array;
$n=($n/=3);
$count = 0;
for ($x = 0; $x < $n; $x++) {
while ($count <= 3) {
$nid = pop(@array);
$nombre = pop(@array);
$dir = pop(@array);
$query_insert = "INSERT INTO $tablename (nid, nombre, dir)
VALUES ('$nid', '$nombre', '$dir')";
$query = $connect->prepare($query_insert);
$query->execute();
$count++;
}
}
在mysql中保存这个,但那个不好,因为保存“,”!!
, Linuxant - Linux drivers for Conexant chipsets - ALSA driver with improved support for Conexant chipsets
, 1708
, Install Google Chrome in Fedora 16 / 15 / 14 using YUM | HowOpenSource
, 1707
, Xenode Systems Blog u00BFQuu00E9 Hacer despuu00E9s de instalar Fedora 15?
, 1706
, ,
如果更改代码perl中的VALUES。
('$nid', '$nombre', '$dir')"; > VALUES ('$nid' '$nombre' '$dir')";
错误,在控制台中。
DBD::mysql::st execute failed: Column count doesn't match value count at row 1 at exp-b.pl line 38.
DBD::mysql::st execute failed: Column count doesn't match value count at row 1 at exp-b.pl line 38.
DBD::mysql::st execute failed: Column count doesn't match value count at row 1 at exp-b.pl line 38.
DBD::mysql::st execute failed: Column count doesn't match value count at row 1 at exp-b.pl line 38.
我需要在mysql中。
nid nombre dir
1708 Linuxant - Linux drivers for Conexant chipsets - ALSA driver with improved support for Conexant chipsets http://urlllola.com/alsa-driver/
1707 Install Google Chrome in Fedora 16 / 15 / 14 using YUM | HowOpenSource http://www.howopenlola.com/2011/11/
1706 Xenode Systems Blog: \u00BFQu\u00E9 Hacer despu\u00E9s de instalar Fedora 15? http://otrolink.com.ar/lola.html
我希望你明白,问候
答案 0 :(得分:1)
所以这个:
open(FILE, '/home/lola/locatebookmarks');
my @array;
my $var;
while ($i = <FILE>) {
if ($i =~ /(id|name|http)/) {
if ($i =~ s/("|:|,|name|id|url)//g) {
($key) = $i;
push(@array, $var);
}
}
}
close(FILE);
永远不要将任何值设置到$ var中,所以当你将它推到@array上时,你什么都不推。因此,你可能想要将$ i推入@array并忘记$ key。
此:
$n=($n/=3);
应该是:
$n /= 3
和我第二个@TLP关于在SQL中使用占位符而不是变量插值。
$query_insert = "INSERT INTO $tablename (nid, nombre, dir)
VALUES ('$nid', '$nombre', '$dir')";
$query = $connect->prepare($query_insert);
$query->execute();
变为:
$query_insert = "INSERT INTO $tablename (nid, nombre, dir) VALUES (?, ?, ?)";
$query = $connect->prepare($query_insert);
$query->execute($nid, $nombre, $dir);