ID: 35910
User updated by: Ryan dot Melena at gmail dot com
Reported By: Ryan dot Melena at gmail dot com
-Status: Feedback
+Status: Open
Bug Type: PDO related
Operating System: Windows XP
PHP Version: 5.1CVS-2006-01-05 (snap)
Assigned To: wez
New Comment:
<?php
/* SQL
CREATE TABLE IF NOT EXISTS `section` (
`id` int(10) unsigned NOT NULL auto_increment,
`parentSectionID` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
INSERT INTO `section` VALUES (1, 1);
INSERT INTO `section` VALUES (2, 1);
INSERT INTO `section` VALUES (3, 2);
INSERT INTO `section` VALUES (4, 1);
INSERT INTO `section` VALUES (5, 5);
INSERT INTO `section` VALUES (6, 6);
INSERT INTO `section` VALUES (7, 6);
*/
?>
<?php
global $db_host, $db_name, $db_username, $db_password;
$db_host = 'localhost';
$db_name = 'test';
$db_username = 'root';
$db_password = 'superw00t';
class section
{
private $id = null;
private $parentSectionID = null;
private $childSections = array();
private $status = array('consistentWithDb' => false,
'childSectionsLoaded' => false);
function __construct($id)
{
$db = resourceHelper::getDbConn();
// Validate $id and load section data
if(!is_int($id))
{
throw new Exception('Invalid argument for
section::loadFromDb(), $id must be an int. Value sent was [' . $id .
'] of type [' . gettype($id) . '].');
}
$this->id = $id;
$query = 'SELECT parentSectionID FROM section WHERE id =
:id';
$stmt = $db->prepare($query);
$stmt->bindValue(':id', $this->id , PDO::PARAM_INT);
$stmt->execute();
$stmt->bindColumn('parentSectionID', $this->parentSectionID,
PDO::PARAM_INT);
$stmt->fetch(PDO::FETCH_BOUND);
$stmt = null;
$db = null;
}
function __get($varName)
{
switch($varName)
{
case 'id':
return (int)$this->id;
case 'childSections':
if(!$this->status['childSectionsLoaded'])
{
$this->loadChildSections();
}
return $this->childSections;
default:
throw new Exception('Variable [' . $varName . '] is not
a public member of section.');
break;
}
}
private function loadChildSections()
{
$sectionID = null;
$db = resourceHelper::getDbConn();
$query = 'SELECT id FROM section WHERE parentSectionID = :id
AND parentSectionID != id';
$stmt = $db->prepare($query);
$stmt->bindValue(':id', $this->id, PDO::PARAM_INT);
$stmt->execute();
$stmt->bindColumn('id', $sectionID, PDO::PARAM_INT);
while($stmt->fetch(PDO::FETCH_BOUND))
{
$this->childSections[] = new section($sectionID);
}
$this->status['childSectionsLoaded'] = true;
}
}
class resourceHelper
{
public static function getDbConn()
{
global $db_host, $db_name, $db_username, $db_password;
// Create and Validate database connection
try
{
$db = new PDO('mysql:host=' . $db_host . ';dbname=' .
$db_name, $db_username, $db_password);
$db->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
throw new Exception('Unable to connect to database [' .
$config['db']['name'] . '] using configuration file values.' .
$e->getMessage());
}
return $db;
}
}
$db = resourceHelper::getDbConn();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sectionID = null;
$query = 'SELECT id FROM section WHERE id = parentSectionID';
$stmt = $db->prepare($query);
$stmt->execute();
$stmt->bindColumn('id', $sectionID, PDO::PARAM_INT);
while($stmt->fetch(PDO::FETCH_BOUND))
{
$section = new section($sectionID);
buildSectionRow($section);
}
$stmt = null;
$db = null;
function buildSectionRow(section $section, $indent = 0)
{
echo $section->id . '<br />';
$indent++;
/*
To reproduce error, comment out $test definition then
replace $test in foreach loop with $section->childSections
*/
$test = $section->childSections;
foreach($test as $childSection)
{
buildSectionRow($childSection, $indent);
}
}
?>
Previous Comments:
------------------------------------------------------------------------
[2006-04-09 07:44:21] [EMAIL PROTECTED]
Please paste the script into the bug report.
I can't reach the URL you posted.
------------------------------------------------------------------------
[2006-01-05 22:24:45] [EMAIL PROTECTED]
Yes, this is right, but it doesn't add any understanding.
Assigned to the PDO maintainer.
------------------------------------------------------------------------
[2006-01-05 22:18:47] Ryan dot Melena at gmail dot com
Hope this is right... From Visual Studio:
> php5ts.dll!_efree(void * ptr=0x00ed982c) Line 303 + 0x1a bytes C
php5ts.dll!zend_hash_del_key_or_index(_hashtable * ht=0x00eb4fe0,
char * arKey=0x00ed9840, unsigned int nKeyLength=15, unsigned long h=0,
int flag=0) Line 490 + 0x6 bytes C
php5ts.dll!zend_hash_reverse_apply(_hashtable * ht=0x00eb4fe0, int
(void *, void * * *)* apply_func=0x10096c10, void * * *
tsrm_ls=0x003225b8) Line 738 + 0xf bytes C
php5ts.dll!shutdown_executor(void * * * tsrm_ls=0x003225b8) Line
268 C
php5ts.dll!zend_deactivate(void * * * tsrm_ls=0x003225b8) Line
848 C
php5ts.dll!php_request_shutdown(void * dummy=0x00000000) Line
1287 C
php.exe!main(int argc=2, char * * argv=0x00323f90) Line 1231 C
php.exe!_mainCRTStartup() + 0xe3 bytes
kernel32.dll!7c816d4f()
[Frames below may be incorrect and/or missing, no symbols loaded for
kernel32.dll]
kernel32.dll!7c8399f3()
------------------------------------------------------------------------
[2006-01-05 22:07:15] [EMAIL PROTECTED]
Yeah, that's what I think is causing it.
Could you try to install MySQL 4.x and see if you can reproduce the
problem?
Also read this:
http://bugs.php.net/bugs-generating-backtrace-win32.php
http://bugs.php.net/bugs-generating-backtrace.php
------------------------------------------------------------------------
[2006-01-05 22:01:37] Ryan dot Melena at gmail dot com
MySQL version is:
5.0.15 on XP.
5.0.16 on Linux.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/35910
--
Edit this bug report at http://bugs.php.net/?id=35910&edit=1