PHP таинственные дополнительные вставки в БД - PullRequest
1 голос
/ 05 марта 2010

Я решил, что хотел бы отслеживать запросы пользователей на моем сайте, поэтому я создал таблицу MySQL под названием «Поиск» с несколькими простыми полями и модель (класс) для облегчения вставки и управления сохраненные поиски.

Функция модели, которая сохраняет поиск:

public function create() {
    $q = $this->db->query("INSERT INTO 
                                `searches` (
                                    `section`,
                                    `keywords`,
                                    `results`,
                                    `location`,
                                    `date`
                                ) VALUES (
                                    %s, 
                                    %s,
                                    %s,
                                    %s,
                                    %s
                                )",
                                $this->section,
                                $this->keywords,
                                $this->results,
                                $this->location,
                                date('Y-m-d G:i:s'));
    $this->id = $this->db->last_insert($q);
}

... и в моем контроллере, когда страница загружена, я иду:

    /* lets save the search if there is one */
    if(isset($_GET['q'])) {
        $search = $this->load->model('Searches_Single',null);
        $search->set('section','sale');
        $search->set('keywords',$_GET['q']);
        $search->set('results',$grand_total);
        $search->set('location',$this->location->id);
        $search->create();
        unset($search);
    }

Что меня удивляет, так это то, что часто вставляются 1-4 повторяющихся строки вместо только одной, которую я ожидаю.

Нет циклов, нет перенаправления ... просто очень простая загрузка страниц. Честно говоря, я верю, что это случилось со мной в прошлый раз, когда я пытался это сделать.

UPDATE

Этого не происходит в моей локальной среде разработки ... только на производстве (страшно). Оба используют один и тот же код ... это может быть сервер?

ОБНОВЛЕНИЕ НОМЕР 2 Я обнаружил, что это происходит при открытии и закрытии страницы. АКА - я проверяю время, когда открывается страница, и затем сценарий регистрирует поиск ... и затем я проверяю, когда страница заканчивает загрузку, и, кажется, что сценарий также регистрирует поиск там ...

GAHHH

Ответы [ 5 ]

2 голосов
/ 05 марта 2010

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

Ваши результаты поиска разбиты на страницы? Если да, уверены ли вы, что вставляете строку только при соблюдении этих условий?

  • Пользователь на странице 1.
  • Пользователь впервые загрузил страницу 1.

Возможно, что вы вставляете на каждой странице загрузку ИЛИ что вы всегда вставляете на страницу 1, что вызывает дублирование, если пользователь заходит на страницу 2 и решает вернуться на страницу 1.

1 голос
/ 31 марта 2011

У меня была похожая проблема с добавлением дополнительных строк. Это работало нормально, когда я выполнял запрос INSERT из командной строки в Perl, но ни один PHP-скрипт, который я мог бы написать, не вставил бы только одну строку. Я даже дошел до того, что попробовал другой физический сервер, а затем и виртуальную машину, пытаясь найти самый простой код:

<?php
mysql_connect("localhost", "USER", "PASSWORD") or die(mysql_error());
mysql_select_db("ci3") or die(mysql_error());
mysql_query("INSERT INTO trialsets (text) VALUES('values')");
header( 'Location: http://5.87.12.89/~tsbertalan/done.html' ) ;

echo "done";

В конце концов, я попытался WGET ввести URL-адрес для моего php-скрипта с моего ноутбука, который создал только одну новую запись в PHPMyAdmin. У меня тогда была гениальная идея ПОПРОБОВАТЬ ДРУГИЕ БРАУЗЕРЫ. Оказалось, что Chrome по какой-то причине несколько раз без промедления заходил на страницу. Ввод

header( 'Location: http://5.87.12.89/~tsbertalan/done.html' ) ;

строка сразу после строки mysql_query решила проблему. Я бы даже не заметил этого, если бы следовал хорошей практике и сразу после обработки ввода POST перенаправлял на целевую страницу, как я в конечном итоге намеревался сделать.


0 голосов
/ 26 октября 2010

Я решил, что проблема в том, что роботы Google, которые следуют за человеком на странице, чтобы определить, какое объявление Google отображать, вызывают вторую загрузку страницы и, следовательно, создают зеркальную вставку БД. иногда несколько раз на одной странице загрузки.

Вздох. cmon google.

0 голосов
/ 05 марта 2010

После диагностики, если разделы кода запускаются несколько раз, и вы определили, что перенаправлений нет, вы можете использовать debug_backtrace, чтобы увидеть, что стек вызовов для вашей функции. Контроллер не может быть перенаправлен, но он может вызывать фрагмент кода несколько раз в разных местах. Используйте отладочную обратную трассировку в секции, которая вызывается несколько раз, затем, когда вы выходите из стека вызовов, добавьте строку регистрации, чтобы сказать «входящая функция» перед вызовом и «выходящая функция» после вызова.

0 голосов
/ 05 марта 2010

Самый лучший способ диагностировать это (IMHO) - просто записать ваш запрос базы данных в файл в / tmp во время выполнения запроса. Вы должны быть в состоянии сделать это в своем классе БД. Если вы выполните fopen / fwrite для входа в систему, убедитесь, что вы используете режим добавления «a» вместо «w», иначе дублирующие запросы страниц перезапишут журнал, и вы не сможете сказать, что запрос выполняется несколько раз. Несколько раз я сталкивался с тем, что страница загружалась 2-3 раза, чего я не ожидал из-за какого-то перенаправления, о котором я забыл. Журнал запросов базы данных должен помочь вам определить, есть ли у вас неправильно сформированный оператор вставки или выполняется дублирующий оператор вставки.

...