Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/12: Рейтинг темы: голосов - 12, средняя оценка - 4.50
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
1

php скрипт + ajax

09.01.2012, 05:04. Показов 2119. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
К примеру использую ajax для влияния на рейтинг новости, дело в том, что если быстро нажать несколько раз скажем на плюс, то данные полетят в php скрипт и и рейтинг защитается скажем не +1, а +2, максимум +3. Возможно из-за того, что при очень быстром клике скрипт не успевает занести данные в базу и перепроверить. Обычно при очень быстром клике, данные дублируются раза 2 максимум 3.


Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function rating(param, news_id) {
$(document).ready(function() {
    var base_rating = document.getElementById("rating_"+news_id).innerHTML;
        $.ajax({
            type: "POST",
            url: "/operations/rating/",
            data: ({ 'param[]': [param, news_id]}),
        beforesend: document.getElementById("rating_"+news_id).innerHTML = '<div style="margin-left:5px;margin-top:3px;position:absolute;"><img src="/style/templates/myhopes/images/loading.gif" alt="loading" /></div>',
        success: function(data) {   
 
var yes = parseInt(base_rating)+1;
var no = parseInt(base_rating)-1;
 
    if(data == 1){      
                
        if(param == 'yes') {
            document.getElementById("rating_"+news_id).innerHTML = yes;
        }
        else {
            document.getElementById("rating_"+news_id).innerHTML = no;
        }
    
    } else {
                document.getElementById("rating_"+news_id).innerHTML = base_rating;
            _uWnd.alert('<p>'+language['rating_win']+'</p>',language['rating_title'],{w:250,h:90,tm:2000});
    }   
                }
        })
    });         
}

пхп скрипт же ведет вот такую табличку и проверяет перед голосованием, если к примеру ip 93.84.50.198
с news_id 2335 существует, то голосовать уже нельзя. Но вот быстрые клики его сбивают с толку.

idipnews_iduser_id
662027 93.84.50.198 2335 0
662028 93.84.50.198 2318 0
662029 93.84.50.198 2294 0
662030 93.84.50.198 2255 0
662031 93.84.50.198 2261 0
662032 93.84.50.198 2262 0
662033 93.84.50.198 2277 0
662034 93.84.50.198 2137 0
662035 93.84.50.198 2229 0
662036 93.84.50.198 2237 0
662037 93.84.50.198 2187 0
662038 93.84.50.198 2081 0
662039 176.8.177.19 3756 0
662040 93.84.50.198 2069 0
662041 93.84.50.198 2037 0
662042 93.84.50.198 2034 0
662043 93.84.50.198 2026 0
662044 93.84.50.198 2011 0
662045 93.84.50.198 2013 0
662046 93.84.50.198 1985 0


Подскажите пожалуйста, как можно избежать повтора данных в пхп скрипте, особенно если это касается добавления материала скажем.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2012, 05:04
Ответы с готовыми решениями:

Двойной ajax запрос в php скрипт
Имеется форма, в которой отправляются данные через ajax и скрытый фрейм в который юзер грузит...

Можно ли делать include php ,при котором если в загружаемом файле есть ошибки,то чтобы необваливался весь скрипт в который загружается другой скрипт?
Можно ли делать include php ,при котором если в загружаемом файле есть ошибки,то чтобы...

php + ajax
есть php скрипт который посылает запрос сайту и возвращает ответ... на отдельной странице есть...

PHP и ajax
Здравствуйте, написал небольшой сайт интернет-магазин и сейчас разрабатываю корзину. при заходе на...

15
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
09.01.2012, 11:12 2
nepster, У $.ajax() в есть success, error и complete. Функция complete вызывается всегда после завершения. Перед вызовом самого $.ajax(), например, отключаем кнопку (disabled="disabled"), либо как-то еще запрещаем/исключаем повторный вызов данного функционала. В функции в complete выполняем обратные действия по разрешению, если они нужны. Если нет, то в функции в error они точно нужны.

На стороне сервера (например, средствами БД через уникальные ключи) также надо на корню исключать возможность повторного голосования, если оно недопустимо.
1
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
09.01.2012, 16:47  [ТС] 3
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    public function rating($param,$param_id) {
        
        // проверяем голосование 
        $this->db->where('ip', $this->getRealIpAddr());
        $this->db->where('news_id', $param_id);
        $this->db->limit(1);
        $query = $this->db->get($this->site_project."-".'log'); 
        $resolution = $query->num_rows();
    
        if($resolution > 0 ) {return 0;}
        else {
        $this->db->where('id', $param_id);
        $query = $this->db->get($this->site_project."-".'news');    
        $row = $query->row_array();
        
        // кол-во очков рейтинга -+ 1
        if($param == 'yes'){$row['rating'] += 1;}
        else {$row['rating'] -= 1;}
        
        // перезаписываем 
        $data = array('rating' => $row['rating'],);
        $this->db->where('id', $param_id);
        $this->db->update($this->site_project."-".'news', $data);
            
        $data = array('ip' => $this->getRealIpAddr() ,'news_id' => $param_id);
        $this->db->insert($this->site_project."-".'log', $data);    
        return 1;
        }
    }

в скрипте проверка стоит и все работает на все 100%, но походу скрипт при быстром запросе не успевает обработать данные и появляются повторения.

Можно ли как то скажем поставить проверку, что пока скрипт полностью не отработал, новый запро послать нельзя. такое вообще можно реализовать?

Ведь если использовать в javascript запреты 2 кликов и так далее, ведь все равно можно на прямую обратить к скрипту.
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
10.01.2012, 12:52 4
News_id + User_id -> unique.
И все.
2
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
11.01.2012, 15:02  [ТС] 5
не много не понял, вы имеете ввиду выполнить 2 запроса вот таких?

SQL
1
2
ALTER TABLE `myhopes-log` CHANGE COLUMN `news_id` `news_id` INT NOT NULL UNIQUE;
ALTER TABLE `myhopes-log` CHANGE COLUMN `user_id` `user_id` INT NOT NULL UNIQUE;
то в таком случае, 1 и тот же пользователь не сможет голосовать за 2 разные новости например.

или как то совместить 2 поля ? тоесть, например что бы строка где юзер айди 35 и айди новости 43 не повторялись, если да то подскажите пожалуйста каким запросом можно реализовать?
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
12.01.2012, 18:16 6
nepster, Два поля вместе - уникальный ключ. Уникальна будет пара значений.
1
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
13.01.2012, 14:52  [ТС] 7
нашел запрос, сделал. все работает

SQL
1
ALTER TABLE `table` ADD UNIQUE KEY (`column1`,`column2`)

однако появилась другая проблема. Походу повторений в таблице прилично, так же нашел запрос удаления повторений из базы, но в базе почти 700 000 записей, и суток не хватило, что бы он выполнился.

Подскажите пожалуйста, как быть в такой ситуации (нет возможности держать ноут включенным неделю =( ) ?
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
13.01.2012, 15:08 8
Цитата Сообщение от nepster Посмотреть сообщение
Подскажите пожалуйста, как быть в такой ситуации
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- Создать новую таблицу с такой же структурой
CREATE TABLE `copy` LIKE `original`;
 
-- Скопировать данные из исходной в новую с помощью INSERT...SELECT
-- IGNORE будет игнорировать дубликаты. из-за этого будет потеря данных
INSERT IGNORE INTO `copy` SELECT * FROM `original`;
 
-- переименовать исходную таблицу в бекап
-- И новую в исходную
RENAME TABLE `original` TO `backup`, `copy` TO `original`;
 
-- Тщательно думать, что делать с теми данными, которые попали под IGNORE.
-- Если поможет, удалить из бекапа те записи, которые были успешно скопированы
-- Осторожно и очень внимательно!
-- Если страшно, ибо данные важны, скопировать бекап в новую таблицу и
-- экспериментировать уже с ней.
 
-- DELETE `b`
-- FROM `backup` AS `b` 
--     JOIN `original` AS `o` ON `b`.`уникальный-ключ` = `o`.`уникальный-ключ` AND ... ;
-- после этого в бекапе останется только то, что не было скопировано.
2
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
13.01.2012, 15:23  [ТС] 9
SQL
1
INSERT IGNORE INTO `copy` SELECT * FROM `log`;
выполняется, но походу таблица копируется целиком, так как выполнить запрос

SQL
1
ALTER TABLE `copy` ADD UNIQUE KEY (`news_id`,`ip`);
к пустой таблице я могу, а к `copy` нет:

Код
1062 - Duplicate entry '2599-121.12.249.207' for key 'news_id'

При выполнении
SQL
1
INSERT IGNORE INTO `copy` SELECT * FROM `log`;

mysql> INSERT IGNORE INTO `copy` SELECT * FROM `log`;
Query OK, 640838 rows affected
Records: 640838 Duplicates: 0 Warnings: 0
Может быть ли это связанно из-за праймари кей ? (тоесть из-за id)
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
13.01.2012, 15:26 10
nepster, Ну так, естественно, надо в пустой `copy` сначала создать уникальный ключ, а потом копировать с игнорированием.
1
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
13.01.2012, 16:05  [ТС] 11
что то все равно 0 дубликатов. Я уже оставил только те 2 полня, где повторения.
Миниатюры
php скрипт + ajax  
0
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
13.01.2012, 16:06  [ТС] 12
было бы конечно не принцепиально обнулить базу. Если бы весь рейтинг у меня не строился на данной таблице. через запрос

SQL
1
SELECT COUNT(*) FROM ...
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
13.01.2012, 16:58 13
а как же добавить
SQL
1
SELECT COUNT(*) FROM ... WHERE ....
0
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
13.01.2012, 23:51  [ТС] 14
с этим то все впорядке, суть в уникальных ключах. Я разобрался как их сделать, но не могу удалить повторяющиеся записи.

Есть запрос на удаления, я сутки держал комп онлайн, запрос так и не выполнился. А при копировании копируется вся база =(
0
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
15.01.2012, 02:02  [ТС] 15
нашел запрос, который сработал =)

SQL
1
CREATE TABLE tmp SELECT * FROM `myhopes-log` WHERE 1 GROUP BY news_id,ip;
0
0 / 0 / 0
Регистрация: 19.02.2011
Сообщений: 12
14.02.2012, 17:43 16
Ммммм..... а задержку на сам запрос в 1 секунду поставить и будет счастье тогда он сам обработчик все успеет sleep(1) где нить в верху файла пропиши
0
14.02.2012, 17:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2012, 17:43
Помогаю со студенческими работами здесь

PHP + ajax
Всем привет. Есть код, который обрабатывает Get запрос: if (isset($_GET) == $id_comm) { $id_comm...

Php + Ajax
Доброе время суток! Даже не знаю, к какой теме моя проблема больше относится, к php или ajax, но...

php и ajax
Доброго времени суток, подскажите, будет ли изменяться значение переменной и меняться ёё...

Не работает PHP+jQuery+AJAX
Есть файл, называется all.php. В нем есть Javascript код. Он расположен между тэгами &lt;head&gt;. Это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru