Re: can't retrieve more than 1 record at the time still

From: Date: Tue, 15 Dec 2009 15:22:04 +0000
Subject: Re: can't retrieve more than 1 record at the time still
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-300529@lists.php.net to get a copy of this message
2009/12/14 Catherine Madsen <cmadsen@berkeley.edu>: > Hi Again, > > Following the suggestions I received from a earlier post, I've closed the > statement > while ($stmt->fetch(PDO::FETCH_BOUND)) > before $stmt = NULL; > I don't get an error anymore, but still retrieve only one record. > > To check that the array was being filled correctly, I inserted in several > places $ncand = count($_SESSION['numberCand']); > $ndocid = count($_SESSION['DOCIDs']); > and the count is always 0 for $ndocid and 1 for $ncand. > Now I believe that the array is not being filled, and that's why only the > last record gets processed. Can anybody see what I'm doing wrong in the for > each statement?  The updated code is below. > Thank you for your help. > Catherine > > > Earlier message: > I'm really in need of help.  I'm not a PHP programmer, but I've been given > the privilege of customizing a script written by somebody else and can't get > it to work right.  I have to query 2 different tables in 2 different Oracle > 10G DBs, one's mine (my_schema.my_table), the other (otherdb.other_table) > belongs to another department.  In my_table, I have the doc_id and the > app_id for a record.  In other_table there's the doc_id and pdf  to > retrieve.  The goal is to make a PDF file from each BLOB in other_table and > store them in the right directory under hash(app_id).  PDO has been > installed and working, and I can connect to both DBs without a problem.  If > my query limits the retrieval to one record, the script works, but if I try > to run it for all records, one pdf  file is correctly created in the right > directory then  I get the following error: PHP Fatal error:  Call to a > member function fetch() on a non-object in /my_location/my_script.php on > line 154.  It the "while ($stmt->fetch(PDO::FETCH_BOUND))" line.  I've > pasted my script below.  I thought my problem was that maybe I was in the > wrong directory after creation of the first pdf, but  several tries changing > the directory didn't make a difference.  Right now, I'm running the script > at the command line.  Soon I'm going to have a few hundred records to deal > with and cannot do it one by one!  Any help would be very much appreciated. >  Thank you! > > <?php > > > /* First Oracle DB connection info removed */ > > try > { >   $dbh1 = new PDO("oci:dbname=".$tns1,$db1_username,$db1_password); > > } > > catch(PDOException $e) > { >   echo ($e->getMessage()); >   exit; > } > > > if (empty($_SESSION['docIDs'])) > { >        $_SESSION['DOCIDs'] = array(); >        $_SESSION['msgs'] = array(); > >        $sql = "SELECT COUNT(*) all_rec FROM myschema.mytable >                where academic_year = 2010"; > >        $_SESSION['numberCand'] = 0;  /* initialize ctr for stack popping */ >        $_SESSION['PHPulled'] = 0; /* number new personal histories pulled */ > >        if ($res = $dbh1->query($sql)) > >        { > >        /* Check the number of rows that match the SELECT statement */ >          if ($res->fetchColumn() > 0) >                { >                        /* Issue the real SELECT statement and work with the > results */ >                         $sql = "select doc_id, app_id >                        from myschema.mytable >                        where academic_year = 2010"; > >                   foreach ($dbh1->query($sql) as $row) >                   { > >                        $cand = array(); >                        $cand['DOC_ID']= $row['DOC_ID']; >                        $cand['APP_ID'] = $row['APP_ID']; >                        $_SESSION['DOC_IDS'][] = $cand; > >                   } >              } > $ncand = count($_SESSION['numberCand']); > $ndocid = count($_SESSION['DOCIDs']); > print "Cand Number: " .  $ncand . "\n"; > print "DOCid Number: " .  $ndocid . "\n"; >        } > } > > if (!empty($_SESSION['DOC_IDS']) and $_SESSION['numberCand'] < > count($_SESSION['DOC_IDS'])) > { > $ncand = count($_SESSION['numberCand']); > $ndocid = count($_SESSION['DOCIDs']); > print "Cand Number: " .  $ncand . "\n"; > print "DOCid Number: " .  $ndocid . "\n"; > >   /* if have doc_IDs, pick next one off array  */ >   $cand = $_SESSION['DOC_IDS'][$_SESSION['numberCand']]; > >   if ($cand['DOC_ID'] == 0) >   {  /*  redirect to self to get next candidate with updated numberCand */ >       $_SESSION['numberCand'] = $_SESSION['numberCand'] + 1; >       exit; >   } > >        $dirname = md5($cand['APP_ID']); >        $curdir = '/my_location/'.$dirname; > >        print "App_id/Dir: " .  $row['APP_ID'] . $curdir . > "\n"; > >         if (!(is_dir($curdir))) > >                          { >                                  if (!mkdir($curdir,0775)) >                                  print "error: " . $curdir . > "\n"; >                                  exit; >                          } > > /* Second Oracle DB connection  info removed */ > >        try >        { >                $dbh2 = new > PDO("oci:dbname=".$tns2,$db2_username,$db2_password); > >        } > >        catch(PDOException $e) >        { >                echo ($e->getMessage()); >                exit; >        } > > >        $stmt = $dbh2->prepare('select PERSONAL_HIST_PDF_CONTENT from > otherdb.other_table >        where DOC_ID = :id'); > >        $stmt->bindParam(':id', $cand['DOC_ID'], PDO::PARAM_INT); >        $stmt->bindColumn(1, $PDF, PDO::PARAM_LOB); > >        $stmt->execute(); > >        if (!(chdir($curdir))) >                { >                        $_SESSION['msgs'][] = 'Could not change to > '.$curdir; >                        continue; >                } > >        $cnt = 0; > >                while ($stmt->fetch(PDO::FETCH_BOUND)) >                { >                        $filename = 'phs-'.$cnt.'.pdf'; > >                   if (!file_exists($filename)) >                        { /* if file not already there, write file with BLOB > contents */ >                                $fh = fopen($filename, 'w'); >                                fwrite($fh, stream_get_contents($PDF)); >                                fclose($fh); > >                                /* add to $_SESSION['PHPulled'] for > each new > file saved */ >                                $_SESSION['PHPulled'] = > $_SESSION['PHPulled'] > + 1; >                         } >                } > >                /* increment stack counter */ >                $_SESSION['numberCand'] = $_SESSION['numberCand'] + > 1; > >                $stmt = NULL; /* release the connection */ > >                  /*if not done with stack, redirect to self to get next*/ >                if (!empty($_SESSION['DOCIDs']) and >                        $_SESSION['numberCand'] < > count($_SESSION['DOCIDs'])) >                        { >                                exit; > >                        } > > } > > /* once done, go back to display search page after clearing stack*/ > if(isset($_SESSION['DOCIDs'])) > unset($_SESSION['DOCIDs'] ); > > $_SESSION['msgs'][] = 'For '.$_SESSION['numberCand'].' > candidate(s), '. > $_SESSION['PHPulled'].' personal histories were loaded.'; > exit; > > $res = null; > $dbh1 = null; > > ?> > > -- > Catherine Madsen > > Programmer Analyst > College of Chemistry > Berkeley, CA 94720-1460 > > TEL: 510-643-1706 > FAX: 510-643-6178 > > > -- > PHP General Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > The PDOStatement->fetchAll() method will allow you to return all the rows as an array. http://docs.php.net/manual/en/pdostatement.fetchall.php So, no need to iterate the result set. Something along the lines of ... <?php $sth = $dbh->prepare("SELECT name, colour FROM fruit"); $sth->execute(); /* Fetch all of the remaining rows in the result set */ print("Fetch all of the remaining rows in the result set:\n"); $result = $sth->fetchAll(); print_r($result); ?> for example. -- ----- Richard Quadling "Standing on the shoulders of some very clever giants!" EE : http://www.experts-exchange.com/M_248814.html Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731 ZOPA : http://uk.zopa.com/member/RQuadling

« previous php.general (#300529) next »