Foros del Web » Programando para Internet » PHP »

Para actualizar función (a pdo)

Estas en el tema de Para actualizar función (a pdo) en el foro de PHP en Foros del Web. Hola amigos. Tengo una función que funciona bien con la forma vieja, al pasarlo con PDO no consigo dar con la tecla. Función vieja: Código ...
  #1 (permalink)  
Antiguo 22/08/2013, 09:56
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Para actualizar función (a pdo)

Hola amigos. Tengo una función que funciona bien con la forma vieja, al pasarlo con PDO no consigo dar con la tecla.

Función vieja:

Código PHP:
// Conexión con la BD:
mysql_connect("localhost""root""") or die(mysql_error());
mysql_select_db("menu_categorias") or die(mysql_error());

function 
display_children($parent$level) {
    
$result mysql_query("SELECT a.id, a.label, a.link, Deriv1.Count FROM `menu` a  LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1 ON a.id = Deriv1.parent WHERE a.parent=" $parent);
    echo 
"<ul>";
    while (
$row mysql_fetch_assoc($result)) {
        if (
$row['Count'] > 0) {
            echo 
"<li><a href='" $row['link'] . "'>" $row['label'] . "</a>";
            
display_children($row['id'], $level 1);
            echo 
"</li>";
        } elseif (
$row['Count']==0) {
            echo 
"<li><a href='" $row['link'] . "'>" $row['label'] . "</a></li>";
        } else;
    }
    echo 
"</ul>";
}

echo 
display_children(61); 

Tratando con PDO (con errores):

Código PHP:
$user 'root';
$pass '';
$conn = new PDO('mysql:host=localhost;dbname=menu_categorias'$user$pass); 


function 
display_children($parent$level) {
    
$result $conn->prepare("SELECT a.id, a.label, a.link, Deriv1.Count FROM `menu` a  LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1 ON a.id = Deriv1.parent WHERE a.parent=" $parent);
$result->execute();   
    echo 
"<ul>";
    while(
$row $result->fetch(PDO::FETCH_ASSOC)) 
    {
        if (
$row['Count'] > 0) {
            echo 
"<li><a href='" $row['link'] . "'>" $row['label'] . "</a>";
            
display_children($row['id'], $level 1);
            echo 
"</li>";
        } elseif (
$row['Count']==0) {
            echo 
"<li><a href='" $row['link'] . "'>" $row['label'] . "</a></li>";
        } else;
    }
    echo 
"</ul>";
}

echo 
display_children(61); 
  #2 (permalink)  
Antiguo 22/08/2013, 10:45
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Para actualizar función (a pdo)

Pues a simple vista se ve todo bien, Pero creo que seria mas sencillo ayudarte si nos dices que error te esta marcando php.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 22/08/2013, 15:55
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Para actualizar función (a pdo)

Hola "hhs". ¿Cómo estas? El tema es que me aparece este mensaje de error:

Código PHP:
NoticeUndefined variableconn in D:UsersBIOFUSIONARTDocumentsXampphtdocspruebamenuNew7.php on line 9

Fatal error
Call to a member function prepare() on a non-object in D:UsersBIOFUSIONARTDocumentsXampphtdocspruebamenuNew7.php on line 9 
Que es la línea de la consulta:

Código PHP:
$result $conn->prepare("SELECT a.id, a.label, a.link, Deriv1.Count FROM `menu` a  LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1 ON a.id = Deriv1.parent WHERE a.parent=" $parent); 
  #4 (permalink)  
Antiguo 22/08/2013, 16:19
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Para actualizar función (a pdo)

Eso es por que en la declaracion de tu funcion no estas pasando la variable $conn como argumento. Tu función debiera de ser algo asi
Código PHP:
Ver original
  1. $user = 'root';
  2. $pass = '';
  3. $conn = new PDO('mysql:host=localhost;dbname=menu_categorias', $user, $pass);  
  4.  
  5. //pasando como argumento $conn
  6. function display_children($parent, $level, $conn) {
  7.     $result = $conn->prepare("SELECT a.id, a.label, a.link, Deriv1.Count FROM `menu` a  LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1 ON a.id = Deriv1.parent WHERE a.parent=" . $parent);
  8. $result->execute();    
  9.     echo "<ul>";
  10.     while($row = $result->fetch(PDO::FETCH_ASSOC))  
  11.     {
  12.         if ($row['Count'] > 0) {
  13.             echo "<li><a href='" . $row['link'] . "'>" . $row['label'] . "</a>";
  14.             display_children($row['id'], $level + 1);
  15.             echo "</li>";
  16.         } elseif ($row['Count']==0) {
  17.             echo "<li><a href='" . $row['link'] . "'>" . $row['label'] . "</a></li>";
  18.         } else;
  19.     }
  20.     echo "</ul>";
  21. }
  22.  
  23. echo display_children(6, 1);
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 22/08/2013, 17:27
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Para actualizar función (a pdo)

Gracias por responder Hhs. Cuestión que corregí según el argumento y se añadió otra línea más de error:

Código:
Warning: Missing argument 3 for display_children(), called in D:\Users\BIOFUSIONART\Documents\Xampp\htdocs\pruebamenuNew8.php on line 25 and defined in D:\Users\BIOFUSIONART\Documents\Xampp\htdocs\pruebamenuNew8.php on line 8

Notice: Undefined variable: conn in D:\Users\BIOFUSIONART\Documents\Xampp\htdocs\pruebamenuNew8.php on line 9

Fatal error: Call to a member function prepare() on a non-object in D:\Users\BIOFUSIONART\Documents\Xampp\htdocs\pruebamenuNew8.php on line 9
Código completo:









¿Se te ocurre otra cosa para solucionar esto, amigo?
  #6 (permalink)  
Antiguo 22/08/2013, 17:41
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Para actualizar función (a pdo)

Cita:
Iniciado por mikehove Ver Mensaje
Código completo:

¿Se te ocurre otra cosa para solucionar esto, amigo?
El problema es al final tienes que llamar a la funcion con el argumento adicional que agegue:

Código PHP:
Ver original
  1. echo display_children(6, 1, $conn);
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 22/08/2013, 17:59
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Para actualizar función (a pdo)

Claro, tienes razón. Te comento que sale en parte la solución que con la forma vieja aparece, siguen estando estos mensajes:

Cita:
Warning: Missing argument 3 for display_children(), called in D:\Users\BIOFUSIONART\Documents\Xampp\htdocs\prueb amenuNew8.php on line 15 and defined in D:\Users\BIOFUSIONART\Documents\Xampp\htdocs\prueb amenuNew8.php on line 7

Notice: Undefined variable: conn in D:\Users\BIOFUSIONART\Documents\Xampp\htdocs\prueb amenuNew8.php on line 8

Fatal error: Call to a member function prepare() on a non-object in D:\Users\BIOFUSIONART\Documents\Xampp\htdocs\prueb amenuNew8.php on line 8

¿Sabes qué? Voy a probar de colocarle al PDO algo de esta forma y te comento:


Cita:
try {
$rs = $db->prepare('SELECT * FROM menu');
$rs->execute();
$foo = $rs->fetchAll();
} catch (Exception $e) {
die("Oh noes! There's an error in the query!");
}
  #8 (permalink)  
Antiguo 23/08/2013, 02:07
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Para actualizar función (a pdo)

A la final no sirvió mi prueba con "try" y "catch". Gracias por tanta ayuda amigo, lo tuyo sí me sirvió (aparece un poco el resultado esperado). Seguiré investigando un poco más.

Para poder verificar exactamente puedo poner aquí el proyecto entero, porque la cuestión con la función obsoleta de mysql_connect() y mysql_select_db() me funciona bien.

Última edición por mikehove; 23/08/2013 a las 09:48

Etiquetas: php+, php+base+de+datos, php+clases
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:24.