On Mon, 2005-07-18 at 11:53, Wiggins d'Anconia wrote: > Charles Farinella wrote: > > I'm sure this is very simple and I am overlooking something. I want to > > read a list of bad email addresses from a file and remove them from my > > database. > > > > If I print $_, the email addresses are correct, if I try to remove them > > from the db I get errors on just the characters before the @. > > > > Are you sure those errors aren't coming from the DB?
I'm getting this: == DBD::Pg::st execute failed: ERROR: column "mmartins" does not exist at delBadEmail.pl line 23, <INFILE> line 378. == If I put the address, '[EMAIL PROTECTED]' in the script, that works fine. If I insert the '\' in front of @ in $_ it throws this: == DBD::Pg::st execute failed: ERROR: syntax error at or near "\" at character 127 at delBadEmail.pl line 23, <INFILE> line 378 (#7) == I'm confused as to what it wants. :-( The solution John Moon sent me didn't work, it send me a bound variable error. > > Here is what I have: > > > > == > > #!/usr/bin/perl -w > > > > use strict; > > use DBI; > > use DBD::Pg; > > > > my $infile = $ARGV[0]; > > > > > > open( INFILE, "<$infile" ); > > while( <INFILE> ) { > > my $dbh = DBI->connect("dbi:Pg:dbname=*, "*", "*") || die; > > > > #s/\@/\\@/; > > #print $_; > > > > my $sth = $dbh->prepare("UPDATE > > table > > SET > > email = '' > > WHERE > > email = $_ ") || die; > > The above value needs to be quoted for the DB not Perl. But it would be > much more efficient to use placeholders and move your statement > preparation outside of the loop and then provide the e-mail address to > the execute. This will take care of your quoting problems and be more > efficient. > > > > > $sth->execute; > > > > finish $sth; > > $dbh->disconnect; > > } > > > > close( INFILE ); > > == > > > > Only do things in the loop that must be done in the loop. Reconnecting, > repreparing, and disconnecting from the DB is a lot of unnecessary work. > > perldoc DBI > > > --Untested-- > #!/usr/bin/perl -w > > use strict; > use DBI; > use DBD::Pg; > > my $infile = $ARGV[0]; > > # no reason to reconnect for every line > my $dbh = DBI->connect("dbi:Pg:dbname=*, "*", "*") || die; > > # statement should only be prepared once > # note use of placeholder ? character > my $sth = $dbh->prepare("UPDATE table SET email = '' WHERE email = ? ") > || die; > > open INFILE, "<$infile" or die "Can't open file for reading: $!"; > while ( <INFILE> ) { > $sth->execute( $_ ); > } > close INFILE; > > $sth->finish; > $dbh->disconnect; -- Charles Farinella Appropriate Solutions, Inc. (www.AppropriateSolutions.com) [EMAIL PROTECTED] 603.924.6079 -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>