Tener problemas para insertar y actualizar tablas en una base de datos con declaraciones preparadas

StackOverflow https://stackoverflow.com/questions/652960

  •  19-08-2019
  •  | 
  •  

Pregunta

Muy nuevo en PHP5 y todavía tiene algunos problemas. Descubrí cómo seleccionar con declaraciones preparadas que ahora intentan insertar / actualizar mi código es el siguiente

function input_lab_results($name, $image, $descrip) {
    $query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";

    if($stmt = $this->conn->prepare($query)){
        $stmt->bind_param('sssiidd', $name, $image, $descrip, 0, 0, date("Ymd"), date("Ymd"));
        $stmt->execute();
        die();
    } else{
        die($this->conn->error);
    }
}

El error que obtengo es

  

Error fatal: no se puede pasar el parámetro 4 por referencia html / classes / mySQL.php en la línea 43

Cualquier ayuda / referencias serán apreciadas. Gracias.


Todos mencionan el uso de PDO, ¿tienen buenos tutoriales o ejemplos de esto, por favor?

¿Fue útil?

Solución 2

Lo cambié a

function input_lab_results($name, $image, $descrip) {
    $query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";

    if($stmt = $this->conn->prepare($query)){
        $stmt->bind_param('sssdd', $name, $image, $descrip, date("Ymd"), date("Ymd"));
        $stmt->execute();
        die();
    } else{
        die($this->conn->error);
    }
}

Básicamente cambié donde estaba leyendo el ?? para el entero a 0 en la consulta no lo vinculé.

Otros consejos

no es $ descrip ese es el problema; son los 0 (parámetros 4 y 5). la solución es pasar variables en lugar de enteros:

 `$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";`

    $pat_doctor = 0;
    $pat_resident = 0;

    if($stmt = $this->conn->prepare($query)){
            $stmt->bind_param('sssiidd', $name, $image, $descrip, $pat_doctor, $pat_resident, date("Ymd"), date("Ymd"));`

evidentemente mysqli_bind_param quiere sus argumentos como referencias, por lo que busca dónde están almacenados en la memoria en lugar de copiar sus valores. esto tiene sentido ya que algunas de las cosas que le gustaría vincular a la instrucción sql, como esa imagen, son probablemente lo suficientemente grandes como para que prefiera no tener copias en exceso. Los literales, cadenas o de otro tipo, no son accesibles por referencia. ver: http://us.php.net/references

no sugiero codificar los 0s en la instrucción sql, ya que confunde innecesariamente su código.

permítanme sugerir DOP, por cierto. su sintaxis es mucho más sensata.

No utilice bind_param : es una interfaz muy poco intuitiva y propensa a errores, que en su mayoría es un legado de la C-api subyacente. Utilice bind_value o mejor aún: pase una matriz de valores como argumento para PDOStatement- > execute . Por ejemplo:

$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
if ($stmt = $this->conn->prepare($query)) {
  $stmt->execute(array($name, $image, $descrip, date("Ymd"), date("Ymd")));
  die();
} else {
  die($this->conn->error);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top