Sentence of INSERT Mysqli Prepared, what's wrong with it?

0

I have the following sentence to insert in my table, I get an error

  

Fatal error: Call to a member function bind_param () on a non-object

just at the beginning of the sentence

I did an echo of the values that I use POST and they are all saved well

$stmt = $conexion->prepare("INSERT INTO SANCIONES (
      cedula_sancionado, 
      cedula_sancionador, 
      cedula_superior, 
      articulo_falta, 
      aparte_falta, 
      documento_seleccion, 
      fecha_inicio, 
      fecha_termino, 
      dias_sancion, 
      aclaratoria_sancion, 
      estado_sancion_id,
      medida_id,
      articulo_circunstancia,
      agravante_seleccion, 
      atenuante_seleccion, 
      total_demerito, 
      estado_id)) 
      VALUE (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
$stmt->bind_param(""iiiiisssisiiissdi"
 ,$cedula1
 ,$cedula2
 ,$cedula3
 ,$articulo_falta
 ,$aparte_falta
 ,$documentos_implode
 ,$fecha_inicio
 ,$fecha_termino
 ,$dias
 ,$aclaratoria
 ,$estado_sancion
 ,$tipo_medida
 ,$tipo_circunstancia
 ,$agravantes_implode
 ,$atenuantes_implode
 ,$total_demerito
 ,$estado);
$stmt->execute();
$stmt->close();
}

Example of values thrown with an echo

8644097
8644097
8644097
36
1
2-1-3-4-5-6
13/03/2017
25/03/2017
12
qwrqwr qwr qwr qwr qwr wq
1
2
40
3-4
0.45
6

Table Sanctions:

id_sancion  int(11)
cedula_sancionado   int(10)
cedula_sancionador  int(10)
cedula_superior int(10)
articulo_falta  int(2)
aparte_falta    int(2)
documento_seleccion varchar(11)
fecha_inicio    date NULL
fecha_termino   date NULL
dias_sancion    int(3)
aclaratoria_sancion text
estado_sancion_id   int(3)
fecha_conforme  date
fecha_proceso   date
medida_id   int(2)
articulo_circunstancias int(2)
agravante_seleccion varchar(5)
atenuante_seleccion varchar(5)
total_demerito  double
estado_id   int(2)  
    
asked by Victor Alvarado 13.03.2017 в 15:07
source

2 answers

1

Although you already know where the fault comes from, I'll leave you with a very functional example for the future, at least it will save you headaches, it is a method to find sometimes easier the small errors of confusion that one has easily with so much code. At least it will clarify where you should look for the failure in your sentence prepare() .

A possible example:

<?php
    //Sentencia preparada.
    $stmt = $conexion->prepare("INSERT INTO SANCIONES (cedula_sancionado, cedula_sancionador, cedula_superior, articulo_falta, aparte_falta, documento_seleccion, fecha_inicio, fecha_termino, dias_sancion, aclaratoria_sancion, estado_sancion_id, medida_id, articulo_circunstancia, agravante_seleccion, atenuante_seleccion, total_demerito, estado_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

    if (false===$stmt) { #Comprobación.
        exit('La sentencia preparada fallo: ' . htmlspecialchars($stmt->error));
    }

    //Ligamos parametros marcadores.
    $rc = $stmt->bind_param("iiiiisssisiiissdi",$cedula1,$cedula2,$cedula3,$articulo_falta,$aparte_falta,$documentos_implode,$fecha_inicio,$fecha_termino,$dias,$aclaratoria,$estado_sancion,$tipo_medida,$tipo_circunstancias,$agravantes_implode,$atenuantes_implode,$total_demerito,$estado);

    if (false===$rc) { #Comprobación.
        exit('la función bind_param() fallo: ' . htmlspecialchars($stmt->error));
    }

    //Ejecutamos sentencia.
    $rc = $stmt->execute();

    if (false===$rc) { #Comprobación.
        exit('la sentencia fallo al ejecutar: ' . htmlspecialchars($stmt->error));  
    } else {
        echo "Los datos se insertaron correctamente a la Base de datos :)";
    }
    $stmt->close(); //Cerramos sentencia.


?>
  

Fatal error: Call to a member function bind_param() on a non-object

As the error message says, $stmt seems not to be an object. Try debugging this using var_dump($stmt) , right after the ready call.

As you mentioned the prepared call fails and so it returns false - false is not an object, so you can not call bind_parm() on that.

Source SO

    
answered by 14.03.2017 / 00:18
source
0

The main problem was that aggravating_selection was not receiving the value, and since it is not NULL this generated error.

The second $tipo_circunstancia was not the correct name, this was $tipo_circunstancias .

Therefore, I gave error as it was missing by adding the values of these variables to bind_param() .

I'm like this:

$stmt = $conexion->prepare("INSERT INTO SANCIONES (
      cedula_sancionado, 
      cedula_sancionador, 
      cedula_superior, 
      articulo_falta, 
      aparte_falta, 
      documento_seleccion, 
      fecha_inicio, 
      fecha_termino, 
      dias_sancion, 
      aclaratoria_sancion, 
      estado_sancion_id,
      medida_id,
      articulo_circunstancia,
      agravante_seleccion, 
      atenuante_seleccion, 
      total_demerito, 
      estado_id)) 
      VALUE (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
$stmt->bind_param("iiiiisssisiiissdi"
 ,$cedula1
 ,$cedula2
 ,$cedula3
 ,$articulo_falta
 ,$aparte_falta
 ,$documentos_implode
 ,$fecha_inicio
 ,$fecha_termino
 ,$dias
 ,$aclaratoria
 ,$estado_sancion
 ,$tipo_medida
 ,$tipo_circunstancias
 ,$agravantes_implode
 ,$atenuantes_implode
 ,$total_demerito
 ,$estado);
$stmt->execute();
$stmt->close();
}
    
answered by 13.03.2017 в 19:18