Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] error con INSERT INTO

Estas en el tema de error con INSERT INTO en el foro de PHP en Foros del Web. He creado una clase para acceder a la base de datos de forma segura, la estoy probando en local y me da errores. No encuentro ...
  #1 (permalink)  
Antiguo 05/09/2013, 11:31
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
error con INSERT INTO

He creado una clase para acceder a la base de datos de forma segura, la estoy probando en local y me da errores.

No encuentro dónde está el error :S

En el código (indico las líneas del error y más abajo dejo los errores devueltos)

Código PHP:
Ver original
  1. class Conectar
  2. {
  3.    
  4.     public function conectar ( $string_consulta ) //línea 327
  5.     {
  6.         //establezco los datos de autenticación para acceder a la base de datos
  7.         $IDConexion = mysqli_connect("localhost" , "root" , "" , "pruebas");
  8.        
  9.         //establezco el conjunto de caracteres a nivel de servidor en tiempo de ejecucion
  10.         mysqli_set_charset( $IDConexion, "utf8_spanish2_ci" );
  11.        
  12.         //escapo caracteres para evitar sql injection
  13.         $Consulta = mysqli_escape_string( $IDConexion, $string_consulta ); //línea 336
  14.        
  15.         //conecto a la base de datos
  16.         $IDConsulta = mysqli_query($IDConexion , $Consulta); //línea 339
  17.        
  18.         //retorno los resultados
  19.         return $IDConsulta;
  20.     }
  21. }
  22.  
  23. $consulta = "INSERT INTO pruebas VALUES (null, 'pepe')";
  24.  
  25. $insertar = new Conectar(); //línea 348
  26.  
  27. $insertar->conectar($consulta);

Los errores

Cita:
Warning: Missing argument 1 for Conectar::conectar(), called in C:\xampp\htdocs\xampp\web\ejemplo_formulario.php on line 348 and defined in C:\xampp\htdocs\xampp\web\ejemplo_formulario.php on line 327

Notice: Undefined variable: string_consulta in C:\xampp\htdocs\xampp\web\ejemplo_formulario.php on line 336

Warning: mysqli_query(): Empty query in C:\xampp\htdocs\xampp\web\ejemplo_formulario.php on line 339
¿Podeis ayudarme? :)
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 05/09/2013, 11:46
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: error con INSERT INTO

No se que versión de PHP uses, pero por compatibilidad a versiones de PHP 4 los constructores de la clase se pueden llamar de la misma manera de la clase.

Me explico en PHP 4 para invocar al constructor se hacia de la manera

Código PHP:
Ver original
  1. Class Hola{
  2.     function Hola(){
  3.         echo "soy el constructor";
  4.     }
  5. }  
  6.  
  7. $HOLA = new Hola();
  8.  
  9. //imprime soy el constructor

PHP 5 por compatibilidad copia este comportamiento, así que te recomiendo que pruebes de esta manera:

Código PHP:
Ver original
  1. class Conectar
  2. {
  3.     public function __construct(){
  4.        
  5.     }
  6.    
  7.     public function conectar ( $string_consulta ) //línea 327
  8.     {
  9.         //establezco los datos de autenticación para acceder a la base de datos
  10.         $IDConexion = mysqli_connect("localhost" , "root" , "" , "pruebas");
  11.        
  12.         //establezco el conjunto de caracteres a nivel de servidor en tiempo de ejecucion
  13.         mysqli_set_charset( $IDConexion, "utf8_spanish2_ci" );
  14.        
  15.         //escapo caracteres para evitar sql injection
  16.         $Consulta = mysqli_escape_string( $IDConexion, $string_consulta ); //línea 336
  17.        
  18.         //conecto a la base de datos
  19.         $IDConsulta = mysqli_query($IDConexion , $Consulta); //línea 339
  20.        
  21.         //retorno los resultados
  22.         return $IDConsulta;
  23.     }
  24. }

Espero se entienda

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 05/09/2013, 12:00
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: error con INSERT INTO

Cita:
Iniciado por jonni09lo Ver Mensaje
No se que versión de PHP uses, pero por compatibilidad a versiones de PHP 4 los constructores de la clase se pueden llamar de la misma manera de la clase.

Me explico en PHP 4 para invocar al constructor se hacia de la manera

Código PHP:
Ver original
  1. Class Hola{
  2.     function Hola(){
  3.         echo "soy el constructor";
  4.     }
  5. }  
  6.  
  7. $HOLA = new Hola();
  8.  
  9. //imprime soy el constructor

PHP 5 por compatibilidad copia este comportamiento, así que te recomiendo que pruebes de esta manera:

Código PHP:
Ver original
  1. class Conectar
  2. {
  3.     public function __construct(){
  4.        
  5.     }
  6.    
  7.     public function conectar ( $string_consulta ) //línea 327
  8.     {
  9.         //establezco los datos de autenticación para acceder a la base de datos
  10.         $IDConexion = mysqli_connect("localhost" , "root" , "" , "pruebas");
  11.        
  12.         //establezco el conjunto de caracteres a nivel de servidor en tiempo de ejecucion
  13.         mysqli_set_charset( $IDConexion, "utf8_spanish2_ci" );
  14.        
  15.         //escapo caracteres para evitar sql injection
  16.         $Consulta = mysqli_escape_string( $IDConexion, $string_consulta ); //línea 336
  17.        
  18.         //conecto a la base de datos
  19.         $IDConsulta = mysqli_query($IDConexion , $Consulta); //línea 339
  20.        
  21.         //retorno los resultados
  22.         return $IDConsulta;
  23.     }
  24. }

Espero se entienda

Saludos
Muchas gracias :D te entendí perfectamente.

He probado lo que me has dicho, ahora aunque no me arroja ningún error, sigue sin realizar la inserción.

Mi versión de PHP es la 5.4.19

Edito, mi tabla es muy sencilla, es la siguiente:

Cita:
Nombre pruebas

campos id|nombre
He comprobado las credenciales para acceder y son correctas. Debería funcionar y no se por qué :S
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 05/09/2013, 12:03
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: error con INSERT INTO

Base de datos, tipo de datos, y el sql que generas todo eso has revisado?

En alguno de estos puntos debe fallar, incluso para salir de dudas puedes cambiar tu nombre de la función

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #5 (permalink)  
Antiguo 05/09/2013, 12:08
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: error con INSERT INTO

Cita:
Iniciado por jonni09lo Ver Mensaje
Base de datos, tipo de datos, y el sql que generas todo eso has revisado?

En alguno de estos puntos debe fallar, incluso para salir de dudas puedes cambiar tu nombre de la función

Saludos
Vale, he probado a comentar el mysqli_set_charset() y el mysqli_real_escape_string(), cambiando el 2º parámetro de mysqli_query por $string_consulta y sí hace la inserción.

No entiendo por qué, si los he puesto siguiendo el manual de PHP.

El código quedó así

Código PHP:
Ver original
  1. class Conectar
  2. {
  3.     public function __construct()
  4.     {
  5.     }
  6.    
  7.     public function conectar ( $string_consulta )
  8.     {
  9.         //establezco los datos de autenticación para acceder a la base de datos
  10.         $IDConexion = mysqli_connect("localhost" , "root" , "" , "pruebas");
  11.        
  12.         //establezco el conjunto de caracteres a nivel de servidor en tiempo de ejecucion
  13.         //mysqli_set_charset( $IDConexion, "utf8_spanish2_ci" );
  14.        
  15.         //escapo caracteres para evitar sql injection
  16.         //$Consulta = mysqli_escape_string( $IDConexion, $string_consulta );
  17.        
  18.         //conecto a la base de datos
  19.         $IDConsulta = mysqli_query($IDConexion , $string_consulta);
  20.        
  21.         //retorno los resultados
  22.         return $IDConsulta;
  23.     }
  24. }
  25.  
  26. $consulta = "INSERT INTO pruebas VALUES (null, 'pepe')";
  27.  
  28. $insertar = new Conectar();
  29.  
  30. $insertar->conectar($consulta);
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 05/09/2013, 12:19
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: error con INSERT INTO

Puede ser debido a lo que dice la documentación:

Cita:
Precaución
Seguridad: el conjunto de caracteres predeterminado

El conjunto de caracteres debe ser establecido a nivel del servidor, o con la función mysqli_set_charset() de la API para que afecte a mysqli_real_escape_string(). Véase la sección de conceptos sobre conjuntos de caracteres para más información.
Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #7 (permalink)  
Antiguo 05/09/2013, 12:33
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: error con INSERT INTO

el problema esta en que cuando realizar el new Conectar(), se ejecuta el la funcionr Conectar( $string_consulta), es decir necesita un parametro lo que debes de hacer es
Código PHP:
Ver original
  1. $consulta = "INSERT INTO pruebas VALUES (null, 'pepe')";
  2. $insertar = new Conectar($consulta); //línea 348
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #8 (permalink)  
Antiguo 05/09/2013, 12:52
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: error con INSERT INTO

Cita:
Iniciado por eits Ver Mensaje
el problema esta en que cuando realizar el new Conectar(), se ejecuta el la funcionr Conectar( $string_consulta), es decir necesita un parametro lo que debes de hacer es
Código PHP:
Ver original
  1. $consulta = "INSERT INTO pruebas VALUES (null, 'pepe')";
  2. $insertar = new Conectar($consulta); //línea 348
Gracias, pero no sirvió.
__________________
Ayúdame a hacerlo por mi mismo.
  #9 (permalink)  
Antiguo 05/09/2013, 13:13
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 1 mes
Puntos: 96
Respuesta: error con INSERT INTO

Por lo que veo tienes puesto mysqli_escape_string y segun el manual es mysqli_real_escape_string, ademas que hasta donde yo se mysqli_real_escape_string() es para los valores que van en la consulta, no para la cosulta propiamemte tal.
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #10 (permalink)  
Antiguo 05/09/2013, 16:02
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: error con INSERT INTO

te dejo este código no lo he podido verificar, pero te debe funcionar o por lo menos te dará una idea, aclaro, se puede mejorar.
Código PHP:
Ver original
  1. class Conectar
  2.     {
  3.         private $IDConexion='';//creamos una propiedad privada
  4.        
  5.         public function __construct()
  6.         {
  7.             //establezco los datos de autenticación para acceder a la base de datos
  8.             $IDConexion = mysqli_connect("localhost" , "root" , "" , "pruebas");
  9.             //establezco el conjunto de caracteres a nivel de servidor en tiempo de ejecucion
  10.             mysqli_set_charset( $IDConexion, "utf8_spanish2_ci" );
  11.         }
  12.         public function consultar($string_consulta){
  13.             //ejecuto la consulta
  14.            if(mysqli_query($this->IDConexion , $string_consulta))
  15.                 return true;
  16.             else
  17.                 die(mysqli_error());
  18.         }
  19.         public function escapar($string){
  20.             //escapo la cadena de caracteres para evitar la inyección de sql
  21.             return mysqli_escape_string($string);
  22.         }
  23.     }
  24.      
  25.     $nombre='pepe';//se asigna por $_POST[] o $_GET[]
  26.     $insertar = new Conectar();//instanciamos la clase
  27.     //creamos la consulta y escapamos
  28.     $consulta = 'INSERT INTO pruebas VALUES (null, "'.$insertar->escapar($nombre).'")';  
  29.     $insertar->consultar($consulta);
saludos.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #11 (permalink)  
Antiguo 05/09/2013, 23:54
 
Fecha de Ingreso: septiembre-2013
Mensajes: 5
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: error con INSERT INTO

La consulta insert esta mal ya que es insert into pruebas(id,nombre) values ( NULL, 'pepe')
  #12 (permalink)  
Antiguo 06/09/2013, 02:37
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: error con INSERT INTO

Cita:
Iniciado por SkAr88 Ver Mensaje
Por lo que veo tienes puesto mysqli_escape_string y segun el manual es mysqli_real_escape_string, ademas que hasta donde yo se mysqli_real_escape_string() es para los valores que van en la consulta, no para la cosulta propiamemte tal.
Gracias!! exactamente fué ese mi error. Ahora sí funciona si solo escapo los valores.


Cita:
Iniciado por dagyus Ver Mensaje
La consulta insert esta mal ya que es insert into pruebas(id,nombre) values ( NULL, 'pepe')
No, eso no es así. En la documentación de mysql dice

Cita:
La lista de nombres de columna o la cláusula SET indican las columnas explícitamente.

Si no especifica la lista de columnas para INSERT ... VALUES o INSERT ... SELECT, los valores para cada columna en la tabla deben proporcionarse en la lista VALUES o por el SELECT. Si no sabe el orden de las columnas en la tabla, use DESCRIBE tbl_name para encontrarlo.
Gracias a todos por la ayuda ofrecida.

EDITO

Otra cosa que hay que tener en cuenta es el conjunto de caracteres soportados en la BD. En mi caso después de hacer toda la clase bien, depurando código me devolvía que el conjunto de caracteres utf8_spanish2_ci no estaba soportado por la BD, supongo que se refiriría a nivel global, porque en las tablas sí puedo establecer ese conjunto de caracteres.
__________________
Ayúdame a hacerlo por mi mismo.

Última edición por guardarmicorreo; 06/09/2013 a las 03:38

Etiquetas: formulario, insert, mysql, sql, variable
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 08:07.