使用PDO更改主键

时间:2017-04-03 16:53:01

标签: php mysql pdo

我创建了一个包含7个表的数据库,其中都有关系。

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

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

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

2 个答案:

答案 0 :(得分:0)

这就是它无法正常工作的原因。假设你有一个这样的表:

Primary_Key  Name
1            Fred
2            Wilma
3            Pebbles

如果你试图改变威尔玛的主要成员来自" 2"到" 3",你将无法这样做,因为主键" 3"已经被Pebbles使用了。这就是为什么你得到一个重复的键错误,因为你不能有两个主键#34; 3"。您只能将主键更改为尚未使用的新密钥,例如" 4"。

答案 1 :(得分:-1)

的index.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());
    }
}

}