【问题标题】:Change primary Key with PDO使用 PDO 更改主键
【发布时间】:2017-04-03 16:53:00
【问题描述】:

我已经创建了一个包含 7 个表的数据库,它们之间都有关系。

在该 Web 界面中,我需要修改表中的所有记录,包括主键字段,但我永远无法编辑它,当我接近它时它告诉我它是重复的。

我在我的 sql 和我的 php 中附加了一个超级链接,我可以在其中修改它,或者我不知道你希望它如何发生在你身上。

https://mega.nz/#!3NZjzIYR!dFqK-HNp-EIj-zGLB4tAbZWIIYVv8aegu8pbJJwOBRE

【问题讨论】:

  • 什么,你希望我们为你做这件事吗?在此处发布您的代码。
  • 另外,您到底想做什么,为什么需要更改主键?在大多数情况下,主键不需要更改。

标签: php mysql pdo


【解决方案1】:

这就是它不起作用的原因。假设你有一个这样的表:

Primary_Key  Name
1            Fred
2            Wilma
3            Pebbles

如果您尝试将 Wilma 的主键从“2”更改为“3”,您将无法这样做,因为 Pebbles 已在使用主键“3”。这就是为什么您会收到重复键错误的原因,因为您不能有两个主键“3”。您只能将主键更改为尚未使用的新键,例如“4”。

【讨论】:

    【解决方案2】:

    索引.php

    <?php
    require_once 'alumno.entidad.php';
    require_once 'alumno.model.php';
    
    // Logica
    $alm = new Categoria();
    $model = new CategoriaModel();
    
    if(isset($_REQUEST['action']))
    {
    switch($_REQUEST['action'])
    {
        case 'actualizar':
    
            // Recupero el acronimo del campo hidden
    
            $alm->__SET('acronimo',   $_REQUEST['acronimo']);
            $alm->__SET('categoria',  $_REQUEST['categoria']);
    
            $update_results = $model->Actualizar($alm);
            header('Location: index.php');
            break;
    
        case 'registrar':
            $alm->__SET('acronimo',  $_REQUEST['acronimo']);
            $alm->__SET('categoria', $_REQUEST['categoria']);
    
            $model->Registrar($alm);
            header('Location: index.php');
            break;
    
       case 'eliminar':
            $model->Eliminar($_REQUEST['acronimo']);
            header('Location: index.php');
            break;
    
        case 'editar':
            // Recupero los datos por el acronimo
            // $obj_categoria es un objeto del tipo Categoria
            $obj_categoria = $model->Obtener($_REQUEST['acronimo']);
            break;
        default: 
            // MENSAJE 404 PARA CUANDO LA ACCION NO ES VALIDA
            header('HTTP/1.0: 404 Not Found');
            die('<h1>404 Page Not Found</h1>');
    }
    } 
    
    ?>
    
    <!DOCTYPE html>
    <html lang="es">
    <head>
        <title>Anexsoft</title>
        <link rel="stylesheet" href="css/bootstrap.min.css">
        <meta name="viewport" content="width=device-width, user-scalable=no">
    </head>
    <body style="padding:15px;">
    
        <div class="table table-striped">
            <div class="pure-u-1-12">
    
                <form action="?action=<?php echo isset($obj_categoria) ? 'actualizar' : 'registrar'; ?>" method="POST" class="pure-form pure-form-stacked" style="margin-bottom:30px;">
                    <input type="hidden" name="acronimo" value="<?php echo isset($obj_categoria) ? $obj_categoria->__GET('acronimo') : ''; ?>" />
    
                    <table style="width:500px;">
                        <tr>
                            <th style="text-align:left;">Acronimo</th>
                            <td><input type="text" name="acronimo"  value="<?php echo isset($obj_categoria) ? $obj_categoria->__GET('acronimo') : ''; ?>" style="width:100%;" required /></td>
                        </tr>
                        <tr>
                            <th style="text-align:left;">Categoria</th>
                            <td><input type="text" name="categoria"  value="<?php echo isset($obj_categoria) ? $obj_categoria->__GET('categoria') : ''; ?>" style="width:100%;" required/></td>
                            <td colspan="2">
                                 <button type="submit" class="btn btn-primary">Guardar</button>
                            </td>
                        </tr>
                    </table>
                </form>
    
                <table class="pure-table pure-table-horizontal">
                    <thead>
                        <tr>
                            <th style="text-align:left;">Acronimo</th>
                            <th style="text-align:left;">Categoria</th>
    
                        </tr>
                    </thead>
                    <?php foreach($model->Listar() as $r): ?>
                        <tr>
                            <td><?php echo $r->__GET('acronimo'); ?></td>
                            <td><?php echo $r->__GET('categoria'); ?></td>
    
                            <td>
                                <a href="?action=editar&acronimo=<?php echo $r->acronimo; ?>">Editar</a>
                            </td>
                            <td>
                                <a href="?action=eliminar&acronimo=<?php echo $r->acronimo; ?>">Eliminar</a>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                </table>
    
            </div>
        </div>
          <script>js/jquery.js</script>
          <script>js/bootstrap.min.js</script>
    </body>
    

    alumno.entidad.php
    
    <?php
    class Categoria
    {
    private $acronimo;
     private $categoria;
    
    public function __GET($k){ return $this->$k; }
    public function __SET($k, $v){ return $this->$k = $v; }
    }
    
    
    alumno.model.php
    
    <?php
    class CategoriaModel
    {
    private $pdo;
    
    public function __CONSTRUCT()
    {
        try
        {
            $this->pdo = new PDO('mysql:host=localhost;dbname=deimos1',                'root', '');
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE,   PDO::ERRMODE_EXCEPTION);
        }
        catch(Exception $e)
        {
            die($e->getMessage());
        }
    }
    
    public function Listar()
    {
        try
        {
            $result = array();
    
            $stm = $this->pdo->prepare("SELECT * FROM categoria");
            $stm->execute();
    
            foreach($stm->fetchAll(PDO::FETCH_OBJ) as $r)
            {
                $alm = new Categoria();
    
                $alm->__SET('acronimo', $r->acronimo);
                $alm->__SET('categoria', $r->categoria);
                $result[] = $alm;
            }
    
            return $result;
        }
        catch(Exception $e)
        {
            die($e->getMessage());
        }
    }
    
    public function Obtener($acronimo)
    {
        try
        {
            $stm = $this->pdo->prepare("SELECT * FROM categoria WHERE  acronimo = ?");
    
            $stm->execute(array($acronimo));
            $r = $stm->fetch(PDO::FETCH_OBJ);
    
            $alm = new Categoria();
    
            $alm->__SET('acronimo', $r->acronimo);
            $alm->__SET('categoria', $r->categoria);
    
            return $alm;
        } catch (Exception $e)
        {
            die($e->getMessage());
        }
    }
    
    public function Eliminar($acronimo)
    {
        try
        {
            $stm = $this->pdo
                      ->prepare("DELETE FROM categoria WHERE acronimo = ?");
    
            $stm->execute(array($acronimo));
        } catch (Exception $e)
        {
            die($e->getMessage());
        }
    }
    
    // ##############################################################################################
    // CAMBIOS REALIZADOS
    // - USO DE PARAMETROS NOMBRADOS EN EN METODO .execute()
    // ##############################################################################################       
    public function Actualizar(Categoria $data)
    {
        try
        {
            $sql = "UPDATE categoria SET acronimo =:acronimo, categoria =:categoria WHERE acronimo=acronimo";
    
            return $this->pdo->prepare($sql)
                 ->execute(
                    array(
                        ':acronimo' => $data->__GET('acronimo'),
                        ':categoria' => $data->__GET('categoria')
                    )
                );
        } catch (Exception $e)
        {
            die($e->getMessage());
        }
    }
    
    // ##############################################################################################
    
    public function Registrar(Categoria $data)
    {
        try
        {
        $sql = "INSERT INTO categoria (acronimo,categoria)
                VALUES (?, ?)";
    
        $this->pdo->prepare($sql)
             ->execute(
            array(
                $data->__GET('acronimo'),
                $data->__GET('categoria')
                )
            );
        } catch (Exception $e)
        {
            die($e->getMessage());
        }
    }
    

    }

    【讨论】:

    • 这应该成为您问题的一部分,而不是您问题的答案。如果您想包含代码,请编辑您的原始问题,但只包含相关部分。
    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多