Обновлять реестры используя PDO

У меня есть следующая проблема: у меня есть формуляр где, где я избавляю реестр базы данных и кнопки обновления, чтобы издавать реестр в вопросе.

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

Я провожу некоторое время пытаясь и пытаясь, но не могу видеть, где - ошибка. Я показываю вам то, что у меня есть.

Файл, где я подбираю данные о формуляре в includes/datoscliente.php

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

<?php
    $id = $_POST["idcliente"];
    $datonombre = $_POST["nombre"];
    $datoapellidos = $_POST["apellidos"];
    $datoalias = $_POST["alias"];
    $datotelefono = $_POST["telefono"];
    $datomovil = $_POST["movil"];
    $datoemail = $_POST["email"];
    $datodireccion = $_POST["direccion"];
    $datopoblacion = $_POST["poblacion"];
    $datoprovincia = $_POST["provincia"];
    $datocodigopostal = $_POST["codigopostal"];
    $tratamientocapilar = $_POST["tratamientocapilar"];
    $tratamientocorporal = $_POST["tratamientocorporal"];
    $observaciones = $_POST["observaciones"];
?>

Формуляр, где я избавляю данные клиента в зависимости от идентификации (editar.php)

Эта часть функционирует хорошо и не дает проблемы. Я использую класс, который называется EditarCliente что содержит решение mysql, который ищет клиент из-за идентификации.

<?php
   // Incluimos la clase EditarCliente
   require("includes/editarcliente.php");

   // Instanciamos un objeto de la clase editar clientes
   $cliente = new EditarCliente;

   // Traemos el valor del cliente a editar
   $idcliente = $_GET['id'];

   // Creamos un objeto nuevo que traiga el cliente a editar usando el método EditClient de EditarCliente
   $editarcliente = $cliente->EditClient($idcliente);

   // Recorremos todo el array y guardamos cada elmento del campo en su correspondiente variable
   foreach ($editarcliente as $elemento) {
      $id = $elemento['idclientes'];
      $nombre = $elemento['nombre'];
      $apellidos = $elemento['apellidos'];
      $alias = $elemento['alias'];
      $telefono = $elemento['telefono'];
      $movil = $elemento['movil'];
      $email = $elemento['email'];
      $direccion = $elemento['direccion'];
      $poblacion = $elemento['poblacion'];
      $provincia = $elemento['provincia'];
      $codigopostal = $elemento['codigopostal'];
      $tratamientocapilar = $elemento['tratamientocapilar'];
      $tratamientocorporal = $elemento['tratamientocorporal'];
      $observaciones = $elemento['observaciones'];
   }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html lang="es">
    <head>
     <?php
     // Incluimos el header de la página
      include("includes/header.php");
     ?>
    </head>

    <body>
         <div class="container">
             <header class="header">
                  <h1>Gestión Clientes <small>NNNN</small></h1>
             </header>
         </div>
         <div class="container menu-create">
           <form action="actualizarcliente.php" method="POST">
              <div class="form-horizontal">
                   <div class="form-group">
                        <label class="col-lg-2 control-label">ID Cliente</label>
                        <div class="col-lg-10">
                           <input type="text" name="idcliente" id="idcliente" class="form-control input_size" value="<?php echo $id;?>" required>
                        </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Nombre</label>
                       <div class="col-lg-10">
                           <input type="text" name="nombre" id="nombre" class="form-control input_size" value="<?php echo $nombre;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Apellidos</label>
                       <div class="col-lg-10">
                           <input type="text" name="apellidos" id="apellidos" class="form-control input_size" value="<?php echo $apellidos;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Alias</label>
                       <div class="col-lg-10">
                           <input type="text" name="alias" id="alias" class="form-control input_size" value="<?php echo $alias;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Teléfono</label>
                       <div class="col-lg-10">
                           <input type="number" name="telefono" id="telefono" class="form-control input_size" value="<?php echo $telefono;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Móvil</label>
                       <div class="col-lg-10">
                           <input type="number" name="movil" id="movil" class="form-control input_size" value="<?php echo $movil;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">E-mail</label>
                       <div class="col-lg-10">
                           <input type="email" name="email" id="email" class="form-control input_size" value="<?php echo $email;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Dirección</label>
                       <div class="col-lg-10">
                           <input type="text" name="direccion" id="direccion" class="form-control input_size" value="<?php echo $direccion;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Población</label>
                       <div class="col-lg-10">
                           <input type="text" name="poblacion" id="poblacion" class="form-control input_size" value="<?php echo $poblacion;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Provincia</label>
                       <div class="col-lg-10">
                           <input type="text" name="provincia" id="provincia" class="form-control input_size" value="<?php echo $provincia;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Código Postal</label>
                       <div class="col-lg-10">
                           <input type="number" name="codigopostal" id="codigopostal" class="form-control input_size" value="<?php echo $codigopostal;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Tratamiento Capilar</label>
                       <div class="col-lg-10">
                           <input type="text" name="tratamientocapilar" id="tratamientocapilar" class="form-control input_size" value="<?php echo $tratamientocapilar;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Tratamiento Corporal</label>
                       <div class="col-lg-10">
                           <input type="text" name="tratamientocorporal" id="tratamientocorporal" class="form-control input_size" value="<?php echo $tratamientocorporal;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <label class="col-lg-2 control-label">Observaciones</label>
                       <div class="col-lg-10">
                           <input type="text" name="observaciones" id="observaciones" class="form-control input_size" value="<?php echo $observaciones;?>" required>
                       </div>
                   </div>
                   <div class="form-group">
                       <div class="col-lg-offset-2 col-lg-10">
                           <button type="submit" name="enviar" value="Salvar" class="btn btn-default">Salvar</button>
                       </div>
                   </div>
              </div>
            </form>
         </div>
    </body>

</html>

Класс ModificarCliente (modificarcliente.php)

У меня есть этот класс, чтобы изменять клиента с этим кодом:

<?php

   // Incluimos los datos del formulario para PHP
   require("datosclientes.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($id) {

       // try and catch para capturar errores
       try {

           // Sentencia SQL
           $sql = "UPDATE clientes SET
                    nombre = '$datonombre',
                    apellidos = '$datoapellidos',
                    alias = '$datoalias',
                    telefono = '$datotelefono',
                    movil = '$datomovil',
                    email = '$datoemail',
                    direccion = '$datodireccion',
                    poblacion = '$datopoblacion',
                    provincia = '$datoprovincia',
                    codigopostal = '$datocodigopostal',
                    tratamientocapilar = '$tratamientocapilar',
                    tratamientocorporal = '$tratamientocorporal',
                    observaciones = '$observaciones'
                WHERE idclientes = '$id'";

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

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

            // 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();

       }

    }
}
?>

И в конце концов у меня есть страница actualizarcliente.php где instancio класс ModificarCliente используя метод ModificarCliente с параметром $id что у меня есть формуляра editar.php

<?php

   // Incluimos los datos del formulario para PHP
   require("includes/datosclientes.php");

   // Incluimos la clase Modificar cliente
   require("includes/modificarcliente.php");

   // Instanciamos un objeto de modificar cliente
   $modificarcliente = new ModificarCliente;

   $modificarcliente->ModificarCliente($id);

   echo $id;

   if($modificarcliente == false) {
      echo "error";
   } else {
      echo "Cliente modificado";
   }
?>

Проблема

Когда я нажимаю в кнопке Salvar формуляра editar.php то, что делает программу, состоит в том, чтобы опустошать меня реестр в вопросе. А именно, если я издаю в клиента с id 12, мне опустошает все поля клиента с id 12.

Когда он это выполнит, он показывает мне ошибку из-за каждого поля формуляра:

Notice: Изменчивый Undefined: datonombre in C:\wamp64\www\elena\includes\modificarcliente.php он-лайн 31

Notice: Изменчивый Undefined: datoapellidos in C:\wamp64\www\elena\includes\modificarcliente.php он-лайн 32

И потом в ошибках, которые я показываю с классом ModificarCliente покажи следующее:

Сообщение: SQLSTATE [HY000]: Общая ошибка

Однако if это делает и показывает текст "Клиент Модификадо".

У меня есть с include данные о формулярах, но из-за ошибок, которые он помечает, он как будто PHP не может избавить данные о формуляре editar.php.

Что я врежу?

var_dump ($sql)

C:\wamp64\www\nnn\includes\modificarcliente.php:48:string 'UPDATE clientes SET

                    nombre = 'David',

                    apellidos = 'nnn',

                    alias = 'nnn',

                    telefono = '000000000',

                    movil = '00000',

                    email = 'a@a.com',

                    direccion = 'nnnn',

                    poblacion = 'nnnn',

                    provincia = 'p',

                    codigopostal = '222',

                    tratamientocapilar = 'prueba',

     '... (length=645)

var_dump ($datos)

array (size=15)
  'idcliente' => string '11' (length=2)
  'nombre' => string 'David' (length=5)
  'apellidos' => string 'nnn' (length=15)
  'alias' => string 'nnn' (length=6)
  'telefono' => string '000000000' (length=9)
  'movil' => string '00000' (length=5)
  'email' => string 'a@a.com' (length=7)
  'direccion' => string 'nnn' (length=14)
  'poblacion' => string nnn' (length=12)
  'provincia' => string 'p' (length=1)
  'codigopostal' => string '222' (length=3)
  'tratamientocapilar' => string 'prueba' (length=6)
  'tratamientocorporal' => string 'prueba' (length=6)
  'observaciones' => string 'prueba' (length=6)
  'enviar' => string 'Salvar' (length=6)
0
задан 29.03.2019, 09:37
0 ответов

Проблема - что переменные $datonombre, $datonapellido, и т.д. изменчиво, что существуют вне области класса ModificarCliente

Решения:

  • Включать datosclientes.php внутри метода ModificarCliente (мало многословное)

    public function ModificarCliente($id) {
        //
        require("datosclientes.php");
    
        // ... codigo actual ...
    

    Это будет функционировать, потому что в переменную $_POST он global.

  • Переходить в метод ModificarCliente договоренность с данными клиента (более многословного)

    В actualizacliente.php мы будем перемещать данные клиента в договоренности.

    // La variable `$_POST` es un arreglo en la cual 
    // ya se encuentran todos los datos del cliente.
    $modificarcliente->ModificarCliente($_POST);
    

    В modificarcliente.php мы идем изменять метод ModificarCliente для use договоренность данных.

    public function ModificarCliente($datos) {
    
       // try and catch para capturar errores
       try {
    
           // Sentencia SQL
           $sql = "UPDATE clientes SET
                nombre = '$datos[nombre]',
                apellidos = '$datos[apellidos]',
                alias = '$datos[alias]',
                telefono = '$datos[telefono]',
                movil = '$datos[movil]',
                email = '$datos[email]',
                direccion = '$datos[direccion]',
                poblacion = '$datos[poblacion]',
                provincia = '$datos[provincia]',
                codigopostal = '$datos[codigopostal]',
                tratamientocapilar = '$datos[tratamientocapilar]',
                tratamientocorporal = '$datos[tratamientocorporal]',
                observaciones = '$datos[observaciones]'
            WHERE idclientes = '$datos[idcliente]'";
    
           // ... codigo ...
    

Заметь: Твой код восприимчивый к вставке SQL, я советую тебе, чтобы ты прочитал этот ответ для того, чтобы ты научился предотвращать это.

3
ответ дан 03.12.2019, 17:58
  • 1
    Despué s реализации изменений со второй opció n останься, не функционируя, возврати ту же ошибку, что не существуют переменные полей. –  27.12.2016, 16:55
  • 2
    @David я обновил мой ответ. Corregí имя полей в договоренности $datos. –  27.12.2016, 17:06
  • 3
    я существую añ adido, что ты сказал мне и изменил данные, и сейчас он не дает ошибку, но só это меня изменяет три ú ltimos поля. Должен будь быть tonterí в, в мое возвращение я это смотрю основательно и miraré tambié n это закладок PDO, чтобы предотвращать inyecció n SQL. –  27.12.2016, 17:21
  • 4
    Решенный, спасибо @Marcos Стройный, сейчас revisaré тема inyecció n SQL. –  27.12.2016, 19:09