Нарушение ограничения целостности: дубликат записи «*****» для ключа «ПЕРВИЧНЫЙ» - PullRequest
1 голос
/ 11 февраля 2020

Я работаю над проектом с использованием Zend Framework и создаю простую форму регистрации. я создал mysql db в phpmyadmin со столбцом tel (номер телефона) в качестве первичного ключа. при тестировании формы в браузере у меня возникает следующая проблема.

pic1

при отправке я получаю сообщение об ошибке

pic2

pic3

, тогда как данные фактически сохраняются

pic4.

Я предполагал, что Zend Framework навязывает использование 'id' в качестве первичного ключа, но у меня нет идентификатора на моей таблице. я так, как я могу ovveride или установить первичный ключ? или любое другое решение, спасибо.

Файлы моделей

<?php
namespace Registration\Model;

class Registration
{
    public $fullName;
    public $userName;
    public $email;
    public $tel;
    public $gender;
    public $password;
    public $confirmPassword;

public function exchangeArray(array $data)
{
    $this->fullName     = ($data['fullName']) ? $data['fullName'] : null;
    $this->userName = ($data['userName']) ? $data['userName'] : null;
    $this->email  = ($data['email']) ? $data['email'] : null;
    $this->tel  = ($data['tel']) ? $data['tel'] : null;
    $this->gender  = ($data['gender']) ? $data['gender'] : !null;
    $this->password  = ($data['password']) ? $data['password'] : null;
    $this->confirmPassword  = ($data['confirmPassword']) ? $data['confirmPassword'] : null;
}


}

<?php
namespace Registration\Model;
use Zend\Db\TableGateway\TableGatewayInterface;

class RegistrationTable
{
private $tableGateway;
public function __construct(TableGatewayInterface $tableGateway)
{
    $this->tableGateway = $tableGateway;
}

public function saveRegistration(Registration $register)
{
    $data = [
        'fullName' => $register->fullName,
        'userName'  => $register->userName,
        'email'  => $register->email,
        'tel'  => $register->tel,
        'gender'  => $register->gender,
        'password'  => $register->password,
        'confirmPassword'  => $register->confirmPassword,
    ];

    $this->tableGateway->insert($data);
    $this->tableGateway->update($data);
}

}

1 Ответ

0 голосов
/ 11 февраля 2020

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

Кстати, почему вы вставляете И обновляете строку одновременно? Или, почему вы всегда вставляете строку, если, возможно, это будет просто обновление?

Я предлагаю: не используйте телефон в качестве первичного ключа. Добавьте значение идентификатора вашей модели.

Модель

namespace Registration\Model;

class Registration
{
    public $registrationId;
    // ... And all other fields


public function exchangeArray(array $data)
{
    $this->registrationId = ($data['registrationId']) ? $data['registrationId'] : null;
    // And all other fields

}

Таблица моделей

<?php
namespace Registration\Model;

class RegistrationTable
{

    public function saveRegistration(Registration $register)
    {
        $data = [
            'registrationId' => $register->registrationId,
            // ... And all other fields
        ];

        if(!$register->registrationId) 
        {
            // No registration id, it is an insert
            $this->tableGateway->insert($data);
            // If you want to have its id:
            return $this->tableGateway->lastInsertValue;
        }
        else 
        {
            // Ideally, here you'd also check if the row actually exists
            //
            // if(!$this->tableGateway->select(['registrationId' => $register->registrationId]))
            // {
            //    throw new \Exception('Element not found');
            // }

            $this->tableGateway->update($data, ['registrationId' => $register->registrationId]);
            // Return id to keep consistency (always return an int)
            return $register->registrationId;
        }
    }

}

Не забудьте добавить его в форму! В противном случае, вы никогда не закончите обновление (registrationId будет потеряно в процессе ..).

...