Foros del Web » Programando para Internet » PHP »

Error 'PDOException' with message 'SQLSTATE[42000]

Estas en el tema de Error 'PDOException' with message 'SQLSTATE[42000] en el foro de PHP en Foros del Web. Buenas compañeros, Estoy teniendo el siguiente error Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your ...
  #1 (permalink)  
Antiguo 21/03/2016, 12:25
 
Fecha de Ingreso: enero-2016
Ubicación: Heredia
Mensajes: 35
Antigüedad: 8 años, 3 meses
Puntos: 0
Pregunta Error 'PDOException' with message 'SQLSTATE[42000]

Buenas compañeros,

Estoy teniendo el siguiente error
Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') VALUES ( 'CC000000004', ' at line 1'

Y no comprendo porque, si ya he hecho otros INSERT INTO y me funcionan bien.

La tabla de mi base de datos, tiene un primer campo: idProducto y es AUTO_INCREMENT, por esa razon no meto el campo en el INSERT INTO, el resto de campos estan exactamente igual a los de BD.

Les muestro mi codigo:
Código PHP:
Ver original
  1. <?php
  2. $codigo = $_POST['codigo'];
  3. $nombre = $_POST['nombre'];
  4. $dp = $_POST['dp'];
  5. $costo = $_POST['costo'];
  6. $precioventa = $_POST['precioventa'];
  7. $tipo = $_POST["tipo"];
  8. $uc = $_POST['uc'];
  9. $up = $_POST['up'];
  10. $iv = $_POST['impventa'];
  11. $stock = $_POST['stock'];
  12. $stockmin = $_POST['stockmin'];
  13. $cate = $_POST["categoria"];
  14.  
  15. require '../../class/database.php';
  16.  
  17. $objData = new Database();
  18. $sth1 = $objData->prepare('SELECT idProducto, Nombre FROM producto WHERE Nombre = :nombre');
  19. $sth1->bindParam(":nombre", $nombre);
  20. $sth1->execute();
  21. $result =  $sth1->fetchAll();
  22.  
  23.  If ($result){
  24.         echo "Ya existe un producto con ese nombre";
  25.                
  26.                }else{
  27.                   if ($tipo == 13){
  28.                     $tipo1 = 'Gravado';
  29.                   }else{
  30.                     $tipo1 = 'Exento';
  31.                   }
  32.                   $sth = $objData->prepare('INSERT INTO producto(Codigo,'
  33.                            . '                    Nombre,'
  34.                            . '                    Descripcion,'
  35.                            . '                    Costo,'
  36.                            . '                    PrecioVenta,'
  37.                            . '                    UtilidadColones,'
  38.                            . '                    UtilidadPorcentual,'
  39.                            . '                    ImpVenta,'
  40.                            . '                    Tipo,'
  41.                            . '                    Stock,'
  42.                            . '                    StockMin,'
  43.                            . '                    IdCategoria,) '
  44.                            . '                    VALUES ('
  45.                            .'                     :codigo,'
  46.                            . '                    :nombre,'
  47.                            . '                    :dp,'
  48.                            . '                    :costo,'
  49.                            . '                    :precioventa,'
  50.                            . '                    :uc,'
  51.                            . '                    :up,'
  52.                            . '                    :impventa,'
  53.                            . '                    :tipo,'
  54.                            . '                    :stock,'
  55.                            . '                    :stockmin,'
  56.                            . '                    :cate)');
  57.                    $sth->bindParam(":codigo", $codigo);
  58.                    $sth->bindParam(":nombre", $nombre);
  59.                    $sth->bindParam(":dp", $dp);
  60.                    $sth->bindParam(":costo", $costo);
  61.                    $sth->bindParam(":precioventa", $precioventa);
  62.                    $sth->bindParam(":uc", $uc);
  63.                    $sth->bindParam(":up", $up);
  64.                    $sth->bindParam(":impventa", $iv);
  65.                    $sth->bindParam(":tipo", $tipo1);
  66.                    $sth->bindParam(":stock", $stock);
  67.                    $sth->bindParam(":stockmin", $stockmin);
  68.                    $sth->bindParam(":cate", $cate);
  69.                    $sth->execute();
  70.                    
  71.                    echo "Se ingreso correctamente";
  72.                }

No comprendo porque me da ese error, si me pudiesen ayudar, se los agradeceria.
Saludos,
  #2 (permalink)  
Antiguo 21/03/2016, 12:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Error 'PDOException' with message 'SQLSTATE[42000]

Cita:
No comprendo porque me da ese error, si me pudiesen ayudar, se los agradeceria.
Bueno, lo primero que tienes que hacer es revisar con sumo cuidado la parte de SQL de tu script:
Código PHP:
Ver original
  1. . '                    IdCategoria,) '
¿Alcanzas a ver el error?
Porque yo lo veo muy evidente.

Hay un segundo error, pero es a nivel de lógica: ¿En qué momento verificas que la query se haya ejecutado correctamente y sin errores?
Fácil: NUNCA.

Código PHP:
Ver original
  1. $sth->execute();
  2.                    
  3. echo "Se ingreso correctamente";
En tu codigo asumes que si se ejecuta está siembre bien. Y eso es algo que JAMAS se debe asumir.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/03/2016, 15:18
 
Fecha de Ingreso: enero-2016
Ubicación: Heredia
Mensajes: 35
Antigüedad: 8 años, 3 meses
Puntos: 0
Pregunta Respuesta: Error 'PDOException' with message 'SQLSTATE[42000]

Buenas gnzsoloyo,

Muchas gracias por el primer error, ya lo ví, increible, pero nunca vi esa "," seguro tanto codigo me tiene loco, pero muchisimas gracias, ya ocn eso se ejecuta el insert into.

Ahora bien, con el segundo error, ahi si no te comprendo mucho, porque yo hago un if, si ya existe el nombre en la base de datos, y si no, entonces que si me inserte los datos, asi:
Código PHP:
Ver original
  1. If ($result){
  2.         echo "Ya existe un producto con ese nombre";
  3.                
  4.   }else{
  5.     if ($tipo == 13){
  6.       $tipo1 = 'Gravado';
  7.     }else{
  8.       $tipo1 = 'Exento';
  9.     }
  10.  
  11.     $sth = $objData->prepare('INSERT INTO producto(Codigo,'
  12.              . '                    Nombre,'
  13.              . '                    Descripcion,'
  14.              . '                    Costo,'
  15.              . '                    PrecioVenta,'
  16.              . '                    UtilidadColones,'
  17.              . '                    UtilidadPorcentual,'
  18.              . '                    ImpVenta,'
  19.              . '                    Tipo,'
  20.              . '                    Stock,'
  21.              . '                    StockMin,'
  22.              . '                    IdCategoria) '
  23.              . '                    VALUES ('
  24.              .'                     :codigo,'
  25.              . '                    :nombre,'
  26.              . '                    :dp,'
  27.              . '                    :costo,'
  28.              . '                    :precioventa,'
  29.              . '                    :uc,'
  30.              . '                    :up,'
  31.              . '                    :impventa,'
  32.              . '                    :tipo,'
  33.              . '                    :stock,'
  34.              . '                    :stockmin,'
  35.              . '                    :cate)');
  36.      $sth->bindParam(':codigo', $codigo, PDO::PARAM_INT);
  37.      $sth->bindParam(':nombre', $nombre, PDO::PARAM_INT);
  38.      $sth->bindParam(':dp', $dp, PDO::PARAM_INT);
  39.      $sth->bindParam(':costo', $costo, PDO::PARAM_INT);
  40.      $sth->bindParam(':precioventa', $precioventa, PDO::PARAM_INT);
  41.      $sth->bindParam(':uc', $uc, PDO::PARAM_INT);
  42.      $sth->bindParam(':up', $up, PDO::PARAM_INT);
  43.      $sth->bindParam(':impventa', $iv, PDO::PARAM_INT);
  44.      $sth->bindParam(':tipo', $tipo1, PDO::PARAM_INT);
  45.      $sth->bindParam(':stock', $stock, PDO::PARAM_INT);
  46.      $sth->bindParam(':stockmin', $stockmin, PDO::PARAM_INT);
  47.      $sth->bindParam(':cate', $cate, PDO::PARAM_INT);
  48.      $sth->execute();
  49.  
  50.      echo "Se ingreso correctamente";
  51.  }

Te comento, soy bastante nuevo en el tema de PHP, entonces no se como hacer para verificar que se ejecutó correctamente y sin errores.
Te refieres a los datos? que sean los datos correctos, que me haya insertado numeros en lugar de texto o viceversa?

Muchas gracias de nuevo por la ayuda.
  #4 (permalink)  
Antiguo 21/03/2016, 15:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Error 'PDOException' with message 'SQLSTATE[42000]

Cita:
Ahora bien, con el segundo error, ahi si no te comprendo mucho, porque yo hago un if, si ya existe el nombre en la base de datos, y si no, entonces que si me inserte los datos, asi:
Si, pero no estás considerando que pueda haber ningún otro tipo de factor, y eso no es correcto.
Podría suceder simplemente que se perdiera la conexión con la base justo en ese momento, por ejemplo. O bien que la tabla estuviese siendo usada o bloqueada por otro proceso.
La idea es que un fallo puede generarse también por problemas no debidos a tus datos, pero eso no lo podrías detener si no administras las excepciones de la base.

Las buenas practicas dicen que SIEMPRE se valida cualquier ejecución que apunte a un servicio externo a la aplicación, como es el caso de una base de datos. No te olvides que MySQL no está integrado con PHP, por lo que sigue siendo un servicio diferente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/03/2016, 16:21
 
Fecha de Ingreso: enero-2016
Ubicación: Heredia
Mensajes: 35
Antigüedad: 8 años, 3 meses
Puntos: 0
Pregunta Respuesta: Error 'PDOException' with message 'SQLSTATE[42000]

Listo, creo que ahora si te entiendo en la parte de seguridad, yo actualmente hago algo asi:
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Database extends PDO{
  4.    
  5.     public function __construct() {
  6.         try{
  7.            
  8.             parent::__construct('mysql:host=localhost;dbname=puntoventaskmpos','root','');
  9.             parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10.         } catch (Exception $ex) {
  11.             echo $ex . '<br>';
  12.             die('Error al conectar a la base de datos.');
  13.         }
  14.        
  15.     }
  16.    
  17. }

Imagino que esto no lo es todo jeje, y con respecto a los consejos que me das, donde podria averiguar sobre administrar las excepciones de la BD o saber cuando una tabla se bloquea, porque en realidad si me interesa tener mi programa lo mas cercano al 100% en efectividad y saber validar cualquier ejecucion para una mejor practica.

De nuevo, muchas gracias por tus consejos, me ayudaron inclusive con cosas que no estaba pensando a nivel de datos.
Saludos

Etiquetas: message, mysql, select, sql, tabla
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 13:42.