Ошибка PDOStatement:: bindParam ()

Обслуживая совет, который вы дали мне в вопросе, который я реализовал дни назад (Обновлять реестры используя PDO) я меняю код, чтобы предотвращать вставку SQL с PHP.

Вопрос состоит, в том, что выполнив страницу обновления, у меня выходит следующая ошибка:

PDOStatement:: bindParam () expects at most 5 parameters, 15 given Сообщение: SQLSTATE [HY093]: Invalid parameter number: не parameters were bound

Код - следующий:

<?php

    // Incluimos la clase conexión para crear una que herede de Conexion
    require("conexion.php");

    /*
    * Clase modificar cliente que hereda las propiedades de la clase conexion
    */
   class ModificarCliente extends Conexion {

       // Constructor de la clase
       function __construct(){

           // Constructor de la super clase
           parent::__construct();

       }

    // Método para guardar las modificaciones del cliente
    public function ModificarCliente($datos) {

       // try and catch para capturar errores
       try {

           // Comprobamos que los campos no están vacíos
           if(empty($_POST)){

               echo "Los campos están vacíos, no se puede actualizar.";

           } else {

                // Si no están vacíos guardamos en la variable sql la sentencia de actualización
                $sql = "UPDATE clientes SET
                            nombre = ?,
                            apellidos = ?,
                            alias = ?,
                            telefono = ?,
                            movil = ?,
                            email = ?,
                            direccion = ?,
                            poblacion = ?,
                            provincia = ?,
                            codigopostal = ?,
                            tratamientocapilar = ?,
                            tratamientocorporal = ?,
                            observaciones = ?
                        WHERE idclientes = ?";

           }

            var_dump($datos);

            // Guardamos la variable SQL y preparamos la consulta con la conexion de la base de datos
            $query = $this->conexion_db->prepare($sql);

            // Ligamos parámetros marcadores (?,?,?,... es decir, $datos[nombre], $datos[apellidos], ...)
            // Especificación de tipos de caracteres
            //i->la variable correspondiente es de tipo entero
            //d->la variable correspondiente es de tipo double
            //s->la variable correspondiente es de tipo string
            //b->la variable correspondiente es un blob y se envía en paquetes

        $query->bindParam(1, $datos['nombre'], PDO::PARAM_STR);
        $query->bindParam(2, $datos['apellidos'], PDO::PARAM_STR);
        $query->bindParam(3, $datos['alias'], PDO::PARAM_STR);
        $query->bindParam(4, $datos['telefono'], PDO::PARAM_STR);
        $query->bindParam(5, $datos['movil'], PDO::PARAM_STR);
        $query->bindParam(6, $datos['email'], PDO::PARAM_STR);
        $query->bindParam(7, $datos['direccion'], PDO::PARAM_STR);
        $query->bindParam(8, $datos['poblacion'], PDO::PARAM_STR);
        $query->bindParam(9, $datos['provincia'], PDO::PARAM_STR);
        $query->bindParam(10, $datos['codigopostal'], PDO::PARAM_STR);
        $query->bindParam(11, $datos['tratamientocapilar'], PDO::PARAM_STR);
        $query->bindParam(12, $datos['tratamientocorporal'], PDO::PARAM_STR);
        $query->bindParam(13, $datos['observaciones'], PDO::PARAM_STR);
        $query->bindParam(14, $datos['idcliente'], PDO::PARAM_STR);

        // Ejecutamos la consulta y la guardamos en un array
        $query->execute();

            // Guardamos el resultado en una variable
            $resultado = $query;

            // Cerramos la query
            $query->closeCursor();

            // Devolvemos los resultados a la función
            return $resultado;

            // Vaciamos el objeto
            $this->conexion_db = null;

         } catch (Exception $e) {

           echo "Error en la ejecución de la consulta<br>";
           echo "Mensaje: " . $e->GetMessage() . "<br>";
           echo "Línea: " . $e->getLine();

       }

    }
}
?>

Я выполняю var_dump($datos) и var_dump($resultado) чтобы подтверждать, что, если берутся данные правильно, и это - то, что он показывает:

array (size=16)
  'idcliente' => string '10' (length=2)
  'nombre' => string 'Alicia' (length=6)
  'apellidos' => string 'a' (length=1)
  'alias' => string 'Alicia' (length=6)
  'telefono' => string '222' (length=3)
  'movil' => string '3333' (length=4)
  'email' => string 'a@a.com' (length=7)
  'direccion' => string 'a' (length=1)
  'poblacion' => string 'a' (length=1)
  'provincia' => string 'a' (length=1)
  'codigopostal' => string '1' (length=1)
  'tratamientocapilar' => string '1' (length=1)
  'tratamientocorporal' => string '555' (length=3)
  'observaciones' => string '444' (length=3)
  'enviar' => string 'Salvar' (length=6)
  'idclientes' => null

object(PDOStatement)[3]
  public 'queryString' => string 'UPDATE clientes SET

                            nombre = ?,

                            apellidos = ?,

                            alias = ?,

                            telefono = ?,

                            movil = ?,

                            email = ?,

                            direccion = ?,

                            poblacion = ?,

                            provincia = ?,

                            codigopostal = ?,

                            tratamientocapilar = ?,

           '... (length=646)

Изданный, включив правильной формы метод bindParam

Я исправил код, чтобы включать правильной формы bindParam для PDO, и он не показывает никакой ошибки, но не обновляет данных в базе данных и я не знаю, где может быть неудача.

С данными о var_dump, которые вы можете видеть, я вижу, что информация, которую я использую, чтобы идти в реестр idclientes будь как NULL. Информация в базе данных - целого типа и я попытался помещать текст как я сообщаю, но когда я делаю один gettype он говорит мне, что это тип string.

Неудача может приходить отсюда?

Изданный, решив это

Уже я встретил проблемы, он не смотрел правильно в неудар в лунку idcliente, это было во множественном числе в закладке в положении у 14 bindParam.

1
задан 13.04.2017, 16:00
0 ответов

PDOStatement::bindParam() не моги получать sss... как параметры.

Этот синтаксис используется в приготовлениях mysqli.

То, что ты можешь делать, состоишь в том, чтобы менять ты $query->bindParam( ... ) a:

$query->bindParam(1, $datos['nombre'], PDO::PARAM_STR);
$query->bindParam(2, $datos['apellidos'], PDO::PARAM_STR);
$query->bindParam(3, $datos['alias'], PDO::PARAM_STR);
$query->bindParam(4, $datos['telefono'], PDO::PARAM_STR);
$query->bindParam(5, $datos['nombre'], PDO::PARAM_STR);
$query->bindParam(6, $datos['movil'], PDO::PARAM_STR);
$query->bindParam(7, $datos['direccion'], PDO::PARAM_STR);
$query->bindParam(8, $datos['poblacion'], PDO::PARAM_STR);
$query->bindParam(9, $datos['provincia'], PDO::PARAM_STR);
$query->bindParam(10, $datos['codigopostal'], PDO::PARAM_STR);
$query->bindParam(11, $datos['tratamientocapilar'], PDO::PARAM_STR);
$query->bindParam(12, $datos['tratamientocorporal'], PDO::PARAM_STR);
$query->bindParam(13, $datos['observaciones'], PDO::PARAM_STR);
$query->bindParam(14, $datos['idclientes'], PDO::PARAM_STR);
2
ответ дан 03.12.2019, 17:56

Ошибка показывает тебе то, что неправильное:

PDOStatement:: bindParam () expects at most 5 parameters, 15 given

Ты перемещаешь его 15 параметров, когда ты был бы должен перемещать его только 5.

С документации PHP, это параметры, которые ты был бы должен перемещать его:

  • parameter

    Идентификатор параметра. Для готовых решений, которые используют параметры sustición с именем, это будет имя параметра с формой: имя. Для готовых решений, которые используют параметры sustición вопросительных знаков, это будет положение индекс-1 параметра.

  • переменная

    Имя переменной PHP, которое нужно связывать с параметром решения SQL.

  • data_type

    Ясный тип данных для параметра, используя постоянные величины PDO:: PARAM_*. Чтобы возвращать параметр INOUT с хранившейся процедуры, должен быть использованным оператор OR на уровне бит, чтобы устанавливать биты PDO:: PARAM_INPUT_OUTPUT для параметра data_type.

  • length

    Длина типа данных. Чтобы показывать, что параметр - параметр OUT хранившейся процедуры, нужно устанавливать ясно длину.

  • driver_options

1
ответ дан 03.12.2019, 17:56

Ты можешь использовать синтаксис :variable и в PDOStatement::execute перемещать его ассоциативную договоренность, например:

$gsent = $gbd->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$gsent->execute(array(':calories' => $calorías, ':colour' => $color));

Примененный к тебе код:

$sql = "UPDATE clientes SET
          nombre = :nombre,
          apellidos = :apellidos,
          alias = :alias,
          telefono = :telefono,
          movil = :movil,
          email = :email,
          direccion = :direccion,
          poblacion = :poblacion,
          provincia = :provincia,
          codigopostal = :codigopostal,
          tratamientocapilar = :tratamientocapilar,
          tratamientocorporal = :tratamientocorporal,
          observaciones = :observaciones
          WHERE idclientes = :idcliente";

 // ...codigo...

 $query = $this->conexion_db->prepare($sql);

 // Eliminamos el valor que esta de mas
 unset($datos['enviar']);

 // Pasamos el arreglo con exactamente los datos a mapearse
 $query->execute($datos);
1
ответ дан 03.12.2019, 17:56

Теги

Похожие вопросы