Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Conexion a Base de Datos Orientada a Objetos

Estas en el tema de Conexion a Base de Datos Orientada a Objetos en el foro de PHP en Foros del Web. Tengo un problema al hacer la conexión a mi base de datos orientada a objetos. El mysqli_multi_query me arroja un error con respecto al parámetro. ...
  #1 (permalink)  
Antiguo 10/07/2013, 19:11
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 11 años, 4 meses
Puntos: 2
Conexion a Base de Datos Orientada a Objetos

Tengo un problema al hacer la conexión a mi base de datos orientada a objetos. El mysqli_multi_query me arroja un error con respecto al parámetro. También quisiera utilizar esa misma conexión en otras funciones. He aquí el código.

Código PHP:
<?


class clssentenciasmysql {

function 
conectar() {
      
$con=mysqli_connect("localhost","root","root123","soptecvnzla");

if (
mysqli_connect_errno($con))
  {
  echo 
"Error en Conexión: " mysqli_connect_error();
  }
}
    
    

    function 
insertar () {

  
  
extract($_POST);
  
   
$sql "INSERT INTO  `soptecvnzla`.`equipo` (
`codigo` ,
`responsable` ,
`ubicacion`
) values ('$codigo', '$responsable', '$ubicacion');"
;
   
   

   
   
$sql .= "INSERT INTO  `soptecvnzla`.`caracteristicas_hardware` (
`marca` ,
`modelo` ,
`serial` ,
`observaciones` ,
`id_hardware`,
`codigo`
) values ('$marcadiscoduro', 
   '$modelodiscoduro', '$serialdiscoduro', '$obsdiscoduro', '1' ,'$codigo'),('$marcamemoria', '$modelomemoria', '$serialmemoria', '$obsmemoria', '2' ,'$codigo'),('$marcaprocesador', '$modeloprocesador', '$serialprocesador', '$obsprocesador', '3' ,'$codigo'),
   ('$marcatarjvideo', '$modelotarjvideo', '$serialtarjvideo', '$obstarjvideo', '4' ,'$codigo'),('$marcatarjred', '$modelotarjred', '$serialtarjred', '$obstarjred', '5' ,'$codigo'),('$marcatarjinal','$modelotarjinal','$serialtarjinal','$obstarjinal','6' ,'$codigo'),
   ('$marcatarjaudio','$modelotarjaudio','$serialtarjaudio','$obstarjaudio', '7' ,'$codigo'),('$marcalector','$modelolector','$seriallector','$obslector', '8' ,'$codigo');"
;
   
  



   
$sql .= "INSERT INTO  `soptecvnzla`.`caracteristicas_software` (
`licencia` ,
`version` ,
`fabricante` ,
`observaciones` ,
`id_software`,
`codigo`
) values ('$licenciaso', '$versionso', '$sofabricante', '$obsso','1' ,'$codigo'),('$licenciahoja','$versionhoja','$fabricantehoja','$obshoja','2' ,'$codigo'),
   ('$licenciatexto','$versiontexto','$fabricantetexto','$obstexto','3' ,'$codigo'),('$licenciapresent','$versionpresent','$fabricantepresent','$obspresent','4' ,'$codigo'),('$licenciabd','$versionbd','$fabricantebd','$obsbd','5' ,'$codigo'),('$licencianav','$versionnav','$fabricantenav','$obsnav','6' ,'$codigo'),
   ('$licencialeng','$versionleng','$fabricanteleng','$obsleng','7' ,'$codigo'),('$licenciaant','$versionant','$fabricanteant','$obsant','8' ,'$codigo'),('$licenciaotros','$versionotros','$fabricanteotros','$obsotros','9' ,'$codigo')"

   
   
$insertar=mysqli_multi_query($this->conectar(),$sql);
   if(!
$insertar) { 
       
        echo (
"<script language='javascript'>
        alert('Error');
        </script>"
);
   }
   else {
   echo (
"<script language='javascript'>
        alert('Registro Incluido Exitosamente');
        </script>"
);
   }
  
   }
   
   
  
  }
  #2 (permalink)  
Antiguo 10/07/2013, 19:17
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: Conexion a Base de Datos Orientada a Objetos

Si estas utilizando OOP deberías de sacar provecho a mysqli que tiene soporte para objetos,
además de esto, si haces un llamado al método conectar() una sola vez ya tienes establecida la conexión no tienes que estar haciendolo cada vez que haces el query para el insert, pero para responder tu duda

que error te da??

y para que la depuración sea mejor deberías de usar
http://www.php.net/manual/es/mysqli.error.php

saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 10/07/2013, 19:20
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Conexion a Base de Datos Orientada a Objetos

Jamas, por seguridad, hagas esto:

Cita:
extract($_POST);
Y en todo caso NO se hace DENTRO del Modelo.

Por otro lado deberias implementar alguno de los patrones de diseño para bases de datos: ActiveRecord o DataMapper
__________________
Salu2!

Última edición por Italico76; 10/07/2013 a las 19:26
  #4 (permalink)  
Antiguo 10/07/2013, 19:27
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Conexion a Base de Datos Orientada a Objetos

Cita:
Iniciado por Italico76 Ver Mensaje
Jamas, por seguridad, hagas esto:



Y en todo caso NO se hace DENTRO del Modelo.

Por otro lado deberias implementar alguno de los patrones de diseño para bases de datos: ActiveRecord o DataMapper
:O Porque no debo usarla, hasta ahora me funciona a la perfección.
  #5 (permalink)  
Antiguo 10/07/2013, 19:28
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Conexion a Base de Datos Orientada a Objetos

Cita:
Iniciado por carlos_belisario Ver Mensaje
Si estas utilizando OOP deberías de sacar provecho a mysqli que tiene soporte para objetos,
además de esto, si haces un llamado al método conectar() una sola vez ya tienes establecida la conexión no tienes que estar haciendolo cada vez que haces el query para el insert, pero para responder tu duda

que error te da??

y para que la depuración sea mejor deberías de usar
[url]http://www.php.net/manual/es/mysqli.error.php[/url]

saludos
El error esta en la llamada al metodo conectar. Parece que como parametro a mysqli_multi_query esta mal.
  #6 (permalink)  
Antiguo 10/07/2013, 19:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Conexion a Base de Datos Orientada a Objetos

Si usas extract() sobre $_POST o $_GET, etc... corres muchisimo riesgo de INJECTIONS o sea que alguien te envie algo que tu no esperas y se te convierta en variable local y dependiendo en que parte de tu codigo hagas ese extract() puede ser catastrofico

PD: lo que te dice @carlos_belisario es cierto, la extension MySql esta OBSOLETA y puede sacar ventajas OO si usas PDO o mysqli
__________________
Salu2!
  #7 (permalink)  
Antiguo 10/07/2013, 19:36
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: Conexion a Base de Datos Orientada a Objetos

http://www.php.net/manual/es/function.extract.php el manual es tu amigo, ahí te da la sugerencia que te esta diciendo italico76

en teoría deberías de hacer algo así

Código PHP:
Ver original
  1. class clssentenciasmysql
  2. {
  3.     private $con;
  4.     public function conectar() {
  5.         $this->con=mysqli_connect("localhost","root","root123","soptecvnzla");
  6.         if (mysqli_connect_errno($this->con))
  7.        {
  8.            echo "Error en Conexión: " . mysqli_connect_error();
  9.        }
  10.     public insertar()
  11.     {
  12.          //todo lo que tienes de tu metodo insert
  13.          $insertar=mysqli_multi_query($this->con,$sql);  
  14.         //lo que continua
  15.     }
  16. }

pero si te soy sincero el diseño de la clase no esta muy bien hecho (critica constructiva aveces cuando se escribe no se ve bien el tono), en el foro hay varios ejemplos de este tipo de clases, pudieras buscarlas para tomar ejemplo, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #8 (permalink)  
Antiguo 10/07/2013, 19:47
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Conexion a Base de Datos Orientada a Objetos

Okey tomando en consideración algunas de las criticas he reestructurado el codigo de la siguiente manera.

Código PHP:
<?


class clssentenciasmysql {

    function 
conectar () {
              
$mysqli=new mysqli_connect("localhost","root","root123","soptecvnzla");

if (
$mysqli->connect_errno)
  {
  echo 
"Error en Conexión: " $mysqli->connect_error;
  }
    }

    function 
insertar () {

  
  
extract($_POST);
  
   
$sql "INSERT INTO  `soptecvnzla`.`equipo` (
`codigo` ,
`responsable` ,
`ubicacion`
) values ('$codigo', '$responsable', '$ubicacion');"
;
   
   

   
   
$sql .= "INSERT INTO  `soptecvnzla`.`caracteristicas_hardware` (
`marca` ,
`modelo` ,
`serial` ,
`observaciones` ,
`id_hardware`,
`codigo`
) values ('$marcadiscoduro', 
   '$modelodiscoduro', '$serialdiscoduro', '$obsdiscoduro', '1' ,'$codigo'),('$marcamemoria', '$modelomemoria', '$serialmemoria', '$obsmemoria', '2' ,'$codigo'),('$marcaprocesador', '$modeloprocesador', '$serialprocesador', '$obsprocesador', '3' ,'$codigo'),
   ('$marcatarjvideo', '$modelotarjvideo', '$serialtarjvideo', '$obstarjvideo', '4' ,'$codigo'),('$marcatarjred', '$modelotarjred', '$serialtarjred', '$obstarjred', '5' ,'$codigo'),('$marcatarjinal','$modelotarjinal','$serialtarjinal','$obstarjinal','6' ,'$codigo'),
   ('$marcatarjaudio','$modelotarjaudio','$serialtarjaudio','$obstarjaudio', '7' ,'$codigo'),('$marcalector','$modelolector','$seriallector','$obslector', '8' ,'$codigo');"
;
   
  



   
$sql .= "INSERT INTO  `soptecvnzla`.`caracteristicas_software` (
`licencia` ,
`version` ,
`fabricante` ,
`observaciones` ,
`id_software`,
`codigo`
) values ('$licenciaso', '$versionso', '$sofabricante', '$obsso','1' ,'$codigo'),('$licenciahoja','$versionhoja','$fabricantehoja','$obshoja','2' ,'$codigo'),
   ('$licenciatexto','$versiontexto','$fabricantetexto','$obstexto','3' ,'$codigo'),('$licenciapresent','$versionpresent','$fabricantepresent','$obspresent','4' ,'$codigo'),('$licenciabd','$versionbd','$fabricantebd','$obsbd','5' ,'$codigo'),('$licencianav','$versionnav','$fabricantenav','$obsnav','6' ,'$codigo'),
   ('$licencialeng','$versionleng','$fabricanteleng','$obsleng','7' ,'$codigo'),('$licenciaant','$versionant','$fabricanteant','$obsant','8' ,'$codigo'),('$licenciaotros','$versionotros','$fabricanteotros','$obsotros','9' ,'$codigo')"

   
   
$insertar=$mysqli->multi_query($sql);
   if(!
$insertar) { 
       
        echo (
"<script language='javascript'>
        alert('Error');
        location.href='registro.html';
        </script>"
);
   }
   else {
   echo (
"<script language='javascript'>
        alert('Registro Incluido Exitosamente');
        location.href='registro.html';
        </script>"
);
   }
  
   }
   
   function 
consultar() {
       
  
       
extract($_POST);


            
$sql"SELECT equipo.codigo,  
equipo.responsable,  
equipo.ubicacion,  
caracteristicas_hardware.marca,  
caracteristicas_hardware.observaciones,  
caracteristicas_hardware.serial,  
caracteristicas_hardware.modelo,  
caracteristicas_software.fabricante,  
caracteristicas_software.licencia,  
caracteristicas_software.observaciones,  
caracteristicas_software.version,  
software.tipo,  
hardware.tipo FROM   
hardware,  
caracteristicas_hardware,  
software,  
caracteristicas_software,  
equipo  
WHERE  
equipo.codigo = caracteristicas_hardware.codigo  
AND  
caracteristicas_hardware.id_hardware = hardware.id_hardware  
AND  
equipo.codigo = caracteristicas_software.codigo  
AND  
caracteristicas_software.id_software = software.id_software
AND
'$codigo' = `equipo`.`codigo`"
;  

$result=$mysqli->query($sql);  

if (!
$result) {

 echo(
"Error al consultar" $mysqli->error);
}

while (
$row mysqli_fetch_array($result)) {
      
      
extract ($row);

}

  }
  
  }
Me arroja el siguiente error.

Call to a member function query() on a non-object.

Y segun el manual esa es la forma adecuada de hacer el llamado.
  #9 (permalink)  
Antiguo 10/07/2013, 20:05
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: Conexion a Base de Datos Orientada a Objetos

Ok, digamos que deberías de elegir una sola opción o usas el método funcional


o usas el método orientado a objetos
Código PHP:
Ver original
  1. $mysqli = new mysqli('localhost', 'mi_usuario', 'mi_contraseña', 'mi_bd');
  2. $mysqli->query();
  3. ...

pero usar ambos se ve mal en la organización del código

Cita:
Código PHP:
$result=$mysqli->query($sql); 
te da error porque simplemente no encuentra $mysqli como un objeto y esto porque?? porque simplemente no lo has instanciado.

Como te dije tienes que acomodar mejor el diseño de tu clase, ver un poco más de ejemplos de OOP, porque entiendo que estas comenzando con este paradigma pero no es simplemente llevar funciones a objetos, es ver bien que es un objeto cual es su responsabilidad a nivel de la aplicación hacer uso de la herencia, etc.

Disculpa si sueno rudo (espero que no), pero el objetivo no es decepcionarte ni desmotivarte sino mas bien motivarte a hacer las cosas bien, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #10 (permalink)  
Antiguo 10/07/2013, 21:49
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Conexion a Base de Datos Orientada a Objetos

Por el contrario te agradezco mucho tus sugerencias. Donde podría ver ejemplos de los que hablas?
  #11 (permalink)  
Antiguo 10/07/2013, 22:10
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Conexion a Base de Datos Orientada a Objetos

Esto hasta ahora funciona bien.
Código PHP:
<?


class clssentenciasmysql {

    
 

    function 
insertar () {

         
$mysqli = new mysqli('localhost''root''root123''soptecvnzla');

if (
$mysqli->connect_errno)
  {
  echo 
"Error en Conexión: " $mysqli->connect_error;
  }

  
  
extract($_POST);
  
   
$sql "INSERT INTO  `soptecvnzla`.`equipo` (
`codigo` ,
`responsable` ,
`ubicacion`
) values ('$codigo', '$responsable', '$ubicacion');"
;
   
   

   
   
$sql .= "INSERT INTO  `soptecvnzla`.`caracteristicas_hardware` (
`marca` ,
`modelo` ,
`serial` ,
`observaciones` ,
`id_hardware`,
`codigo`
) values ('$marcadiscoduro', 
   '$modelodiscoduro', '$serialdiscoduro', '$obsdiscoduro', '1' ,'$codigo'),('$marcamemoria', '$modelomemoria', '$serialmemoria', '$obsmemoria', '2' ,'$codigo'),('$marcaprocesador', '$modeloprocesador', '$serialprocesador', '$obsprocesador', '3' ,'$codigo'),
   ('$marcatarjvideo', '$modelotarjvideo', '$serialtarjvideo', '$obstarjvideo', '4' ,'$codigo'),('$marcatarjred', '$modelotarjred', '$serialtarjred', '$obstarjred', '5' ,'$codigo'),('$marcatarjinal','$modelotarjinal','$serialtarjinal','$obstarjinal','6' ,'$codigo'),
   ('$marcatarjaudio','$modelotarjaudio','$serialtarjaudio','$obstarjaudio', '7' ,'$codigo'),('$marcalector','$modelolector','$seriallector','$obslector', '8' ,'$codigo');"
;
   
  



   
$sql .= "INSERT INTO  `soptecvnzla`.`caracteristicas_software` (
`licencia` ,
`version` ,
`fabricante` ,
`observaciones` ,
`id_software`,
`codigo`
) values ('$licenciaso', '$versionso', '$sofabricante', '$obsso','1' ,'$codigo'),('$licenciahoja','$versionhoja','$fabricantehoja','$obshoja','2' ,'$codigo'),
   ('$licenciatexto','$versiontexto','$fabricantetexto','$obstexto','3' ,'$codigo'),('$licenciapresent','$versionpresent','$fabricantepresent','$obspresent','4' ,'$codigo'),('$licenciabd','$versionbd','$fabricantebd','$obsbd','5' ,'$codigo'),('$licencianav','$versionnav','$fabricantenav','$obsnav','6' ,'$codigo'),
   ('$licencialeng','$versionleng','$fabricanteleng','$obsleng','7' ,'$codigo'),('$licenciaant','$versionant','$fabricanteant','$obsant','8' ,'$codigo'),('$licenciaotros','$versionotros','$fabricanteotros','$obsotros','9' ,'$codigo')"

   
   
   
   
   
$insertar=$mysqli->multi_query($sql);
   if(!
$insertar) { 
       
        echo (
"<script language='javascript'>
        alert('Error');
        location.href='registro.html';
        </script>"
);
   }
   else {
   echo (
"<script language='javascript'>
        alert('Registro Incluido Exitosamente');
        location.href='registro.html';
        </script>"
);
   }
  
   }
   
   function 
consultar() {
                
$mysqli = new mysqli('localhost''root''root123''soptecvnzla');

if (
$mysqli->connect_errno)
  {
  echo 
"Error en Conexión: " $mysqli->connect_error;
  }
  
       
extract($_POST);


            
$sql"SELECT equipo.codigo,  
equipo.responsable,  
equipo.ubicacion,  
caracteristicas_hardware.marca,  
caracteristicas_hardware.observaciones,  
caracteristicas_hardware.serial,  
caracteristicas_hardware.modelo,  
caracteristicas_software.fabricante,  
caracteristicas_software.licencia,  
caracteristicas_software.observaciones,  
caracteristicas_software.version,  
software.tipo,  
hardware.tipo FROM   
hardware,  
caracteristicas_hardware,  
software,  
caracteristicas_software,  
equipo  
WHERE  
equipo.codigo = caracteristicas_hardware.codigo  
AND  
caracteristicas_hardware.id_hardware = hardware.id_hardware  
AND  
equipo.codigo = caracteristicas_software.codigo  
AND  
caracteristicas_software.id_software = software.id_software
AND
'$codigo' = `equipo`.`codigo`"
;  

$result=$mysqli->query($sql);

if (!
$result) {

 echo(
"Error al consultar" $mysqli->error);
}

while (
$row $result->fetch_array()) {
      
      
extract ($row);

}
echo 
$responsable;
echo 
$ubicacion;
  }
  
  }
Mi pregunta ahora seria ¿Como hago la conexion desde otra funcion y poder utilizarla en las demas? Siguiendo la misma metodologia.
  #12 (permalink)  
Antiguo 11/07/2013, 06:12
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: Conexion a Base de Datos Orientada a Objetos

Cita:
Iniciado por AnGuisi Ver Mensaje
Por el contrario te agradezco mucho tus sugerencias. Donde podría ver ejemplos de los que hablas?
puedes comenzar por acá http://php.net/manual/es/language.oop5.php

y de ahí te aseguro que la segunda duda se te resuelve sola, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Etiquetas: conexion, mysql, objetos, orientada, registro, sql
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 07:41.