in reply to Re: Error in insertion of MULTIPLE FILENAMES & CONTENTS INTO DATABASE
in thread Error in insertion of MULTIPLE FILENAMES & CONTENTS INTO DATABASE

i swithed it to:
foreach (@files) { open FILE, "<$ENV{'DOCUMENT_ROOT'}/data/text/$_" or die "error open +ing $ENV{'DOCUMENT_ROOT'}/data/text/$_: $!";
then i got this error error opening D:/www/data/text/D:/www/data/text/Ένα μήνυμα σε όλους τους άπιστους.txt: Invalid argument at D:\www\cgi-bin\init.pl line 70.

$ENV{DOCUMENT_ROOT} i correct and $- is correctly set to but why not open Ένα μήνυμα σε όλους τους άπιστους.txt which is a file that does exist on /data/text ?

  • Comment on Re^2: Error in insertion of MULTIPLE FILENAMES & CONTENTS INTO DATABASE
  • Download Code

Replies are listed 'Best First'.
Re^3: Error in insertion of MULTIPLE FILENAMES & CONTENTS INTO DATABASE
by graff (Chancellor) on Jan 01, 2008 at 22:22 UTC
    The answer is right there in the error message -- you just have to read it carefully. Here is just the filename string from the error message:
    D:/www/data/text/D:/www/data/text/Ένα μήνυμα σε όλους τους άπιστους.txt
    
    Can you see the problem now? You have the value of $_, which comes from a file glob, and that value is:
    D:/www/data/text/Ένα μήνυμα σε όλους τους άπιστους.txt
    
    Then, inside the loop, you append that value to this string:
    $ENV{'DOCUMENT_ROOT'}/data/text/
    
    and the result of that concatenation is that the disk and directory path appears twice in the string that is passed to "open()". Fix that, and it will probably work as intended.
      I cannot believe iam THAT careless....my apologies and think you for pointing this out.
      my $insert = $db->prepare( 'INSERT INTO articles (title, body) VALUES +(?, ?)' ); my @files = glob "$ENV{'DOCUMENT_ROOT'}/data/text/*.txt"; foreach (@files) { open FILE, "$_" or die "error opening $_: $!"; while (<FILE>) { chomp; $insert->execute(split /\t/, $_, 2) or print $db->errstr; } close FILE; }
      gives me DBD::mysql::st execute failed: called with 1 bind variables when 2 are needed.... But iam passing it 2 vars why it says iam passing it only 1?

        maybe there isn't a tab character in the string you are trying to split?

        Have you tried debugging the code yourself at all? Something simple as a sanity check would be to:

        foreach my $filename (@files) { ... while (<FILE>) { chomp; next unless length; #Skip blank lines my @params = split /\t/, $_, 2; unless (2 == @params) { warn "Line $. in $filename badly formed\n"; next; } $insert->execute() or print $db->errstr; }

        It is worth thinking about how stuff could go wrong rather than how it might go right. It is also worth checking documentation for any construct you are not absolutely sure about. Getting to know your way around the documentation for whatever you are doing is generally much better in the long run than crawling cap in hand to PerlMonks every time you hit a problem. We much prefer to solve interesting problems rather then dumb ones that are more due to laziness than inexperience.


        Perl is environmentally friendly - it saves trees
        called with 1 bind variables when 2 are needed.... But iam passing it 2 vars

        There you go making assumptions again. You are passing whatever the "split" function happens to be returning -- which would be one arg if there were no tab characters in the string being split.

        I cannot believe iam THAT careless....
        Why, you keep demonstrating with every post?
Re^3: Error in insertion of MULTIPLE FILENAMES & CONTENTS INTO DATABASE
by hungry_john (Acolyte) on Jan 01, 2008 at 22:17 UTC
    You need only $_
    foreach (@files) { open FILE, "$_" or die "error opening $_: $!"; ... }

    Here is a cool video at google explaining glob
    http://www.youtube.com/v/j5vWBhq49ps&rel=1
Re^3: Error in insertion of MULTIPLE FILENAMES & CONTENTS INTO DATABASE (greek chars in windows filename)
by ysth (Canon) on Jan 01, 2008 at 22:12 UTC