Salve a tutti. Volevo chiedere a qualcuno un suggerimento circa l'utilizzo delle ricorsioni.
Praticamente ho notato che quando utilizzo le ricorsioni con una classe da me scritta per mysql
perdo la risorda al db o comunque non riesco a recuperare i dati.
C'é qualcuno che mi riesce a dare un suggerimento visto che non riesco a debuggare questa cosa.
Ho una funzione come questa che richiama se stessa per creare un menu ad albero.
function listCategory
Codice PHP:
<?php
error_reporting(E_ALL);
require_once('includes/settings.inc.php');
require_once('includes/database.inc.php');
$_db = new Db($_dbUrl, $_dbPrefix);
$_db2 = new Db($_dbUrl, $_dbPrefix);
function listCategory($node)
{
global $_db, $_db2;
$sql = "SELECT id, nome_categoria, subcategory FROM {category} WHERE subcategory = '%d'";
$_db->dbExecQuery($sql, array($node), true);
if ($_db->dbIsError()) {
trigger_error($_db->dbGetError(), E_USER_ERROR);
}
while (list($id, $name, $sub) = $_db->dbFetchArray()) {
//find subgroup category
$sql2 = "SELECT id FROM {category} WHERE subcategory = '%d'";
$_db2->dbExecQuery($sql2, array($id), true);
if ($_db2->dbIsError()) {
trigger_error($_db2->dbGetError(), E_USER_ERROR);
}
$num_record = $_db->dbGetNumRows();
if ($num_record) {
echo $name . '
';
echo listCategory($id);
} else {
echo $name . '
';
}
}
}
listCategory(0);
Con questa funzione richiamo dalla tabell category i campi id, nome e subcategory.
Nel campo subcategory inserisco 0 se il record rappresenta un nodo parent e le categorie
figlie prendono per il campo subcategory l'id del campo parent con subcategorry appunto 0.
Praticamente il problema é nella chiamata ricorsiva in quanto non riesco a prendere tutti i dati.
Recupero solo il primo record ed il primo record figlio di questo nodo estratto.
Provo a mostrarvi i dati della classe Db:
Codice PHP:
/**
* Execute the sql query
*
* @param string sql query
* @param array of param to parse with the query
* @return resource
*/
function dbExecQuery($query, $param = array(), $mode = true, $debug = false)
{
$args = func_get_args();
$query = $this->_dbPrefixTables($query);
if (count($args) > 1) {
if (is_array($args[1])) {
$args = array_merge(array($query), $args[1]);
$args = array_map(array($this, '_dbEscapeString'), $args);
$args[0] = $query;
$query = call_user_func_array('sprintf', $args);
}
}
if ($debug) echo '<pre>' . $query . '</pre>';
$this->_dbExecQuery($query, $mode);
}
// }}}
// {{{ dbExecQuery()
/**
* Helper function for dbExecQuery
* @param the query string to parse
* @param the mode to define the type of query executed
* @return mixed value boolean/resource
*/
function _dbExecQuery($query, $mode)
{
if ($mode) {
$resource = mysql_query($query, $this->_dbLink);
if (is_resource($resource)) {
$this->_dbResource = $resource;
}else {
$this->_dbGetError();
}
}
if ($mode == false) {
if (!(mysql_query($query, $this->_dbLink))) {
$this->_dbGetError();
}
}
}
// }}}
// {{{ dbFetchArray()
/**
* Return data from a resulset
* @param constant MYSQL_BOTH | MYSQL_NUM | MYSQL_ASSOC
* @return array array of data
*/
function dbFetchArray($mode = MYSQL_BOTH)
{
if ($this->_dbResource) {
return mysql_fetch_array($this->_dbResource, $mode);
}
}
Spero di essere stato chiaro. Vorrei capire il problema, anche se fra un pò passero
nested sets :P.
Grazie e buon lavoro a tutti.