Двойная запись в БД. ActiveRecord

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
PttRulez
Сообщения: 9
Зарегистрирован: 2019.05.31, 13:39

Двойная запись в БД. ActiveRecord

Сообщение PttRulez »

Код: Выделить всё

class Book extends ActiveRecord
{
    public static function tableName()
    {
        return '{{book}}';
    }
}

Код: Выделить всё

use frontend\models\Book;

class BookshopController extends \yii\web\Controller
{
    public function actionIndex()
    {
        $book = new Book();
        $book->name = 'Test book';
        $book->isbn = '878978878';
        $book->save();
        
        return $this->render('index');
    }

}
Код брался из урока https://www.youtube.com/watch?v=hdWqltG0uPM

Подскажите, пожалуйста, почему при переходе на страницу bookshop/index в БД дважды записывается одна и та же строка, будто я два раза подряд прошел по этому адресу? Один человек имел похожую проблему из-за .htaccess. У меня он такой:

Код: Выделить всё

RewriteEngine on
# If a direcrory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Двойная запись в БД. ActiveRecord

Сообщение leonenco »

вот .htaccess from basic

Код: Выделить всё

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
вот с advanced с моего проекта. Все работает ок

Код: Выделить всё

RewriteEngine on
 
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
# otherwise forward it to index.php
RewriteRule . index.php
Почему у вас сабмит происходит два раза, непонятно. Это у вас чистая установка или имеются какието JS подвешеные на событие onload или document.ready, также какой шаблон используете.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Двойная запись в БД. ActiveRecord

Сообщение maleks »

Может из-за дебаг панели?

Изменять данные по POST запросу надо, если это у вас не тестовый код.
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Двойная запись в БД. ActiveRecord

Сообщение an.viktory@gmail.com »

Безусловно нужно посмотреть что там в дебаг панели по последним запросам.... но один раз у меня была проблема из-за расширения браузера которое для каких то своих целей дублировала запросы на сервер и тем самым создавались две записи, после удаления расширения проблема ушла. Возможно в вашем случае проблема в другом.
PttRulez
Сообщения: 9
Зарегистрирован: 2019.05.31, 13:39

Re: Двойная запись в БД. ActiveRecord

Сообщение PttRulez »

maleks писал(а): 2019.06.01, 06:13 Может из-за дебаг панели?

Изменять данные по POST запросу надо, если это у вас не тестовый код.
Дебагер в проекте действительно используется. И у него в закладке database появляется столбец Duplicates, в котором напротив всех запросов стоит единичка.
Про POST - на тот момент POST запроса еще не было. Просто проверяли записываются ли записи в нужную таблицу при обращении к данному экшену.
Далее код изменился и все стало работать нормально. Код экшена такой стал:

Код: Выделить всё

 public function actionCreate()
    {   
        $book = new Book();
        $publishers = Publisher::getList();
        
        if ($book->load(Yii::$app->request->post()) && $book->save()) {
                Yii::$app->session->setFlash('success', 'Книга добавлена!');
                return $this->redirect(['bookshop/index']);
//                return $this->refresh();
        }
        return $this->render('create', [
            'book' => $book,
            'publishers' => $publishers,
        ]);
    }
 
И все работает приемлемо, никаких двойных записей. Но теперь в другом примере генерируем случайный контент и записываем его в БД. Опять двойная запись :( Экшен пока такой:

Код: Выделить всё

 public function actionGenerate()
    {
        // use the factory to create a Faker\Generator instance
        $faker = Factory::create();
        
        $newsItem = new News();

        $newsItem->title = $faker->text(35);
        $newsItem->content = $faker->text(rand(1000, 2000));
        $newsItem->status = rand(0, 1);
        
        $newsItem->save();
    }
Модель News стандартная сгенерирована в gii
PttRulez
Сообщения: 9
Зарегистрирован: 2019.05.31, 13:39

Re: Двойная запись в БД. ActiveRecord

Сообщение PttRulez »

leonenco писал(а): 2019.06.01, 04:43 Почему у вас сабмит происходит два раза, непонятно. Это у вас чистая установка или имеются какието JS подвешеные на событие onload или document.ready, также какой шаблон используете.
JS не прикручивался. Используются ActiveForm и ActiveRecord. Шаблон стандартный - ничего не менял
PttRulez
Сообщения: 9
Зарегистрирован: 2019.05.31, 13:39

Re: Двойная запись в БД. ActiveRecord

Сообщение PttRulez »

an.viktory@gmail.com писал(а): 2019.06.01, 13:29 Безусловно нужно посмотреть что там в дебаг панели по последним запросам.... но один раз у меня была проблема из-за расширения браузера которое для каких то своих целей дублировала запросы на сервер и тем самым создавались две записи, после удаления расширения проблема ушла. Возможно в вашем случае проблема в другом.
Похоже так и есть! Открыл в Internet Explorer - все впорядке. Спасибо
Единственно, мне сейчас любопытно, почему с новым кодом в предыдущем примере с public function actionCreate(), двойные записи перестали делаться
Ответить