При обновлении фрейма выполняется код

linpc

Гуру форума
Регистрация
6 Апр 2012
Сообщения
178
Реакции
55
Подскажите пожалуйста, после выполнения кода допустим, если если нажмут перегрузить фрейм то данные снова добавятся, как дубликат, как мне это исправить?
PHP:
$timenow = time();

if(isset($_POST['post_id']) and trim($_POST['post_id']) and $_POST['post_id']=='2'){
    if(isset($_POST['act']) and trim($_POST['act']) and $_POST['act']=='4' and $_POST['vcode'] == md5( $_SESSION['u'].".account" )){
   
       foreach ( $_POST as $key => $value )
            {
                if ( strpos( $key, "SID_" ) !== false )
                {
                    $SSQL .= ( $SSQL ? "," : "" ).intval( $value );
                }
            }
           
             if (isset($SSQL) )
            {
                 $serv_min = 2000000000;
                 $res = mysql_query( "SELECT users_services.service_type,users_services.time,service_types.service_class FROM users_services,service_types WHERE users_services.playerid=".$player['id']." AND service_types.service_type=users_services.service_type" );
                 while ($rx = mysql_fetch_row( $res ) )
                {
                    if ( $timenow < $rx[1] )
                    {
                        if ( $rx[1] < $serv_min )
                        {
                            $serv_min = $rx[1];
                        }
                        $_SESSION['PA'] |= pow( 2, $rx[0] );
                        if ( 259200 < $rx[1] - $timenow )
                        {
                            $stype[] = $rx[2];
                        }
                        else
                        {
                            $active[$rx[2]] = $rx[1];
                        }
                    }
                }
               $res = mysql_query( "SELECT service_list.service_type,service_list.service_days,service_list.service_dnv,service_types.service_class FROM service_list,service_types WHERE service_list.list_id IN (".$SSQL.") AND service_types.service_type=service_list.service_type" );
                 
                    $dnv = 0;
                    $newserv = array( );
                 
                    if ($rx = mysql_fetch_row( $res ) )
                    {
                       
                        if ( $rx[0] == 18 )
                        {
                            $wmlog = date( "d.m.Y H:i", $timenow )."|".$player['login']."|".$rx[2];
                        }
                        else
                        {
                            if ( in_array( $rx[0], array( 18, 19, 20 ) ) )
                            {
                                $CLSQL .= !$CLSQL ? "INSERT INTO service_clients (playerid,service_type,service_dnv,service_time) VALUES (".$player['id'].",".$rx[0].",".$rx[2].",".$timenow.")" : ",(".$player['id'].",".$rx[0].",".$rx[2].",".$timenow.")";
                            }
                            $newserv[$rx[3]] = array( $rx[1], $rx[2], $rx[0] );
                            $dnv += floatval( $rx[2] );
                        }
                    }
                    $fault = 1;
                    print_r(mysql_num_rows( $res ));
                    if(( 0 < mysql_num_rows( $res ) )){
                    if (isset($fault) )
                    {
                        $dnv = round( $dnv, 2 );
                        $dmo = round( floatval( $player['dhr'] ), 2 );
                        if ( $dnv <= $dmo )
                        {
                            mysql_query( "UPDATE user SET dhr=dhr-".$dnv." WHERE id=".$player['id']." AND dhr>=".$dnv );
                           
                                $player['dhr'] = $dmo - $dnv;
                                $oper_log = $dnv." DNL списано со счета персонажа ".$player['login'];
                                $timemax = 0;
                                foreach ( $newserv as $key => $value )
                                {
                                    $oper_log .= "\n".( "Сервис (класс: " ).$key." тип: ".$value[2]." / ".$value[0]." суток) ";
                                    $stime = !$active[$key] ? $timenow + 86400 * $value[0] : $active[$key] + 86400 * $value[0];
                                    if ( $timemax < $stime )
                                    {
                                        $timemax = $stime;
                                    }
                                    if ( $stime < $serv_min )
                                    {
                                        $serv_min = $stime;
                                    }
                                    mysql_query( "INSERT INTO users_services (playerid,service_type,time) VALUES (".$player['id'].",".$value[2].",".$stime.")" );
                                        $oper_log .= "TRUE";
                                        $_SESSION['PA'] |= pow( 2, $value[2] );
                                   
                                }
                                if ( $player['account'] < $timemax )
                                {
                                    $oper_log .= "\n".( "Время аккаунта в таблице user " );
                                    mysql_query( "UPDATE user SET account=".$timemax." WHERE id=".$player['id'] );
                                   
                                        $oper_log .= "TRUE";
                                 
                                }
                                if ( $CLSQL )
                                {
                                    $oper_log .= "\n".( "Фиксирование в таблице клиентов " );
                                    mysql_query( $CLSQL );
                                   
                                        $oper_log .= "TRUE";
                                   
                                }
                                mysql_query( "UPDATE user SET account_min=".$serv_min.",access=".$_SESSION['PA']." WHERE id=".$player['id'] );
                               
                                    $player['access'] = $_SESSION['PA'];
                                    $player['account_min'] = $serv_min;
                               
                                mail( "kuzmenko@ussurstroydvor.ru", "Платные сервисы", $oper_log."\n\n".microtime( )." ".uniqid( mt_rand( ) ), "From: NeverLands Service <robot@neverlands.ru>" );
                           
                        }
                    }
            }else{
                echo'fff';
            }
               
                }
             }
}
 
Очень мало информации.
Судя по коду у скрипта всего два действия, при успешном выполнение отправляет отчет на почту, иначе echo ffff, где ffff - предположительно сообщение об ошибки.
Зачем заменили на ffff не понятно, но вас с праздником, 12 лет не мало!)

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

то данные снова добавятся, как дубликат
Предполагаю, вы про повторное выполнение кода после F5 ??
Код и будет выполнятся повторно, пока существуют переменные POST !!
Когда бабушка наставляла писать красиво, она же не зря это делала !
PHP:
$timenow = time();

$_DATA = $_POST;
$_POST = array();

$postID = (int) @$_DATA['post_id'];

if( 2==$postID )
{
    $act = (int) @$_DATA['act'];
    if( 4==$act && $_DATA['vcode'] == md5( $_SESSION['u'].".account" ))
    {
...
Но это только один из необходимых моментов.
Стоит так же добавить колоночку, в которой будет хранится информация об операции.
Ограничить выполнение на раз в определенное время.
Еще не понятно как образуется переменная сессии....
 
как уже написали выше - при инициализации скрипта нужно чистить переменные, а то так при каждом ребуте наплодите всякого разного в базе.
 
тег к ферейму добавте и проверяйте его
 
Проблема логичная при использовании php-скрипта в iframe.
Логика неверная. Сделай ваш php-обработчик отдельно (без iframe).
А его валидацию делайте через ajax, тогда каждый раз будет отправляться только свежие данные.

Ну или решение-костыль, добавить в конец php ифрейма
Код:
<script type="text/javascript">
location.href='страница';
</script>
чтобы принудительно обновить страницу и очистить post данные
 
пишите в сессию что уже данные сохранены или идентификаторы добавляйте
 
Назад
Сверху