6 messages in com.mysql.lists.perlRe: Why is $sth->rows() uninitialized?| From | Sent On | Attachments |
|---|---|---|
| KEVIN ZEMBOWER | 29 Mar 2005 11:42 | |
| Greg Meckes | 29 Mar 2005 13:12 | |
| KEVIN ZEMBOWER | 29 Mar 2005 13:33 | |
| Rudy Lippan | 29 Mar 2005 13:39 | |
| Greg Meckes | 29 Mar 2005 15:22 | |
| KEVIN ZEMBOWER | 01 Apr 2005 12:05 |
| Subject: | Re: Why is $sth->rows() uninitialized?![]() |
|---|---|
| From: | KEVIN ZEMBOWER (KZEM...@jhuccp.org) |
| Date: | 03/29/2005 01:33:47 PM |
| List: | com.mysql.lists.perl |
Greg, thanks for your suggestion. Oddly enough, I made the change, but the
output was exactly the same, both the trace() output and the output I wrote.
Something really odd seems to be going on.
At the risk of a really long email message, I've pasted in the mysqldump of the
database, without any data, the program and the datafile. I hope I trimmed out
correctly the tables not used by this program.
Thanks, again.
-Kevin
Greg Meckes <greg...@yahoo.com> 03/29/05 04:12PM >>>
It's possible that the value of literal zero being returned is being interpreted
as uninitialized
by Perl.
You should try something like this:
if (! defined($sth->rows()) || $sth->rows() == 0)) { print STDERR "Duplicate item found at line $ln: $_\n"; }
================================================ kevinz@www:~/public_html/orderDB/scripts$ mysqldump --databases orderDB -a -d -- MySQL dump 8.21
-- -- Host: localhost Database: orderDB
--------------------------------------------------------- -- Server version 3.23.49-log
-- -- Current Database: orderDB
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ orderDB;
USE orderDB;
-- -- Table structure for table 'baseitem'
--
CREATE TABLE baseitem ( baseitemid int(11) NOT NULL auto_increment, subcatid int(11) NOT NULL default '0', projectid int(11) NOT NULL default '0', partno varchar(25) NOT NULL default '', poplineid varchar(25) default NULL, PRIMARY KEY (baseitemid), UNIQUE KEY partno (partno) ) TYPE=MyISAM COMMENT='Items in inventory (regardless of language)';
-- -- Table structure for table 'langversions'
--
CREATE TABLE langversions ( langversionid int(11) NOT NULL auto_increment, baseitemid int(11) NOT NULL default '0', langid int(11) NOT NULL default '0', url varchar(255) default NULL, title varchar(255) NOT NULL default '', description text, available enum('Y','N') NOT NULL default 'Y', cost decimal(8,2) default NULL, PRIMARY KEY (langversionid), KEY langid (langid), KEY baseitemid (baseitemid) ) TYPE=MyISAM COMMENT='Language versions of base items in inventory';
kevinz@www:~/public_html/orderDB/scripts$ ====================================== kevinz@www:~/public_html/orderDB/scripts$ cat ./loadInventory.pl #!/usr/bin/perl -w
# loadInventory.pl loads the distribution inventory data, based on an export
file from IPOD
use strict; use warnings; #use diagnostics; #NOTE: can't involk with Text::CSV::Simple
use DBI; use Text::CSV::Simple;
my $debug = 1; #Set to true to output debugging information
my $dbh = DBI->connect("DBI:mysql:database=orderDB;host=localhost",
"orderDBadmin", "password",
{ RaiseError => 1 } #Use die() with errors
);
DBI->trace(2);
$dbh->do("delete from baseitem"); $dbh->do("delete from langversions");
my $ln = 0; #Line number for output
my $parser = Text::CSV::Simple->new({'binary' => 1}); #Binary allows extra-ASCII
char in Title
#my @data = $parser->read_file("../tmp/DistInventory.txt"); my @data = $parser->read_file("../tmp/a"); for my $aref (@data) { $ln++; my ($partno, $language, $title, $cost, $available) = @$aref; print "PN=$partno, L=$language, T=$title, C=$cost, A=$available\n" if $debug; createlangversion($partno, $language, $title, $cost, $available); } #while there are more lines in the import data file
$dbh->disconnect();
exit; #End of main routine; only subroutines below
sub createlangversion { my ($partno, $language, $title, $cost, $available) = @_; print "TITLE is now $title\n" if $debug;
print "Available:$available:\n" if $debug;
if ($available == 1) { $available = 'Y' } else { $available = 'N' }; #Change
truth code to Y or N
print "Available:$available:\n" if $debug;
my $langid; #Store the language id code here.
CASE: {
if ($language eq "Eng") { $langid = "1"; last CASE; }
if ($language eq "Fre") { $langid = "2"; last CASE; }
if ($language eq "SPA") { $langid = "3"; last CASE; }
if ($language eq "POR") { $langid = "4"; last CASE; }
if ($language eq "ARA") { $langid = "5"; last CASE; }
if ($language eq "SWA") { $langid = "6"; last CASE; }
if ($language eq "RUS") { $langid = "7"; last CASE; }
if ($language eq "TUR") { $langid = "8"; last CASE; }
if ($language eq "NTS") { $partno .= "-" . $language; $langid = "1"; last
CASE; }
if ($language eq "PAL") { $partno .= "-" . $language; $langid = "1"; last
CASE; }
if ($language eq "SEC") { $partno .= "-" . $language; $langid = "1"; last
CASE; }
print STDERR "UNKNOWN Language in record $ln\n";
} #CASE statement on language
my $baseitemid = createbaseitem($partno); print "Base item ID = $baseitemid\n" if $debug;
my $sth = $dbh->prepare("SELECT baseitemid FROM langversions WHERE baseitemid
=? AND langid=?");
$sth->execute($baseitemid, $langid);
if (! defined($sth->rows()) || $sth->rows() == 0) {
print STDERR "Duplicate item found at line $ln: $_\n";
} else {
my $sth = $dbh->prepare("INSERT INTO langversions (baseitemid, langid,
title, cost, available) VALUES (?, ?, ?, ?, ?)" ) or die "Can't prepare
statement: $DBI::errstr";
$sth->execute($baseitemid, $langid, $title, $cost, $available)
or die "Can't execute statement: $DBI::errstr";
} # else if there was no duplicate item
} #sub createlangversion(partno, language, title, cost, available)
sub createbaseitem { my ($partno) = shift; my $sth;
my $q = qq{ SELECT baseitemid FROM baseitem WHERE partno='$partno' }; print $q if ($debug == 2);
my $baseitemid = $dbh->selectrow_array(qq{ SELECT baseitemid FROM baseitem WHERE partno='$partno' });
if (! $baseitemid) { #base item was NOT found in table my $sth = $dbh->prepare("INSERT INTO baseitem (partno) VALUES (?)") or die "Can't prepare statement: $DBI::errstr"; $sth->execute($partno) or die "Can't execute statement: $DBI::errstr"; $baseitemid = $dbh->{'mysql_insertid'}; print "Inserted NEW item with id $baseitemid\n" if $debug;
} else { #if base item was NOT found in table, otherwise ...
print "Found EXISTING item with id $baseitemid\n" if $debug;
} # else if base item WAS found in table
return $baseitemid; } #sub createbaseitem kevinz@www:~/public_html/orderDB/scripts$ ============================================== kevinz@www:~/public_html/orderDB/scripts$ cat ../tmp/a "B-B01","Eng","Binder for Complete Set of Population Reports",13,0 kevinz@www:~/public_html/orderDB/scripts$




