Автор Тема: Как правильно переделать код php на AutoIT  (Прочитано 3937 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн La2Angel [?]

  • Новичок
  • *
  • Сообщений: 144
  • Репутация: 0
    • Награды
Многоуважаемые пользователи, сломал уже всю голову себе... но ни как не могу перевести данный скрипт php Выдачи бонусов на AutoIT.

Config.php
<?php

$config
['host']='127.0.0.1';

//Порт MySQL сервера
$config['port']='3306';

//Имя пользователя для коннекта к базе данных
$config['user']='root';

//Пароль от пользователя базы данных
$config['pasw']='root';

//Имя базы данных
$config['date']='root';


//Ссылка (URL) на лист информации о последних проголосовавших.
$config['url_info']='Мой_Сайт';

//ID премии, которая будет выдаваться в виде приза
$config['bonus_id']='6673'

//Их количество
$config['numberous']='1';

//Название вещи (В единственном числе)
$config['name']='Вещь1';

function 
connect()
{
    global 
$config;
$host=$config['host']; 
$port=$config['port']; 
$user=$config['user']; 
$pasw=$config['pasw']; 
$date=$config['date']; 
$connect_mysql = @mysql_connect($host.":".$port,$user,$pasw);
if($connect_mysql)
      {
      
$connect_db = @mysql_select_db($date,$connect_mysql);
      if(!
$connect_db)
        {
        
$error="Ошибка #2";
        }
      }
    else
      {
      
$error="Ошибка #1";
      }
      if (
$error
        {
        echo 
"<br><font color='red'>Извините, к сожалению на данный момент этот сервис не доступен.<br>".$error."</font><br>"
        exit;
        }
}
?>

Файл голосования который загружаю в браузере для выдачи голосов
<?php
require_once 'config.php';

connect();

$limit true;
$limit_count intval($config['limit']);
$prefixList array_map("trim"explode(","$la2config["l2top"]["prefix_list"]));
    
$bonus_id_sql=mysql_escape_string($config['bonus_id']);
    
$numberous_sql=mysql_escape_string($config['numberous']);
    
$html[email protected]file_get_contents(htmlspecialchars_decode($config['url_info']));
    if (
preg_match_all("#([0-9]{4}\-[0-9]{2}\-[0-9]{2}\s+[0-9]{2}:[0-9]{2}\:[0-9]{2})\t+([0-9a-zA-Zа-яА-Я \-\=]*)#",$html,$matches)) { 
for($i 0$i count($matches[1]); $i++) {

$time substr($matches[1][$i],0,20);

if (preg_match("#([a-zA-Zа-яА-Я0-9]+)\-([a-zA-Zа-яА-Я0-9 -]*)#"$matches[2][$i], $char_matches)) {
if (($server array_search($char_matches[1])) === false) {
$server intval($char_matches[1]);
}
$nick substr($char_matches[2],0,30);
} else {
$server "0";
$nick substr($matches[2][$i],0,30);
}

if ($nick != "") {
$char_id_arr=mysql_fetch_assoc(mysql_query("SELECT `obj_Id` FROM `characters` WHERE `char_name` = '$nick';"));
            
$char_id_sql=mysql_escape_string($char_id_arr['obj_Id']);
            
$time_sql=mysql_escape_string($time);
            
$array=mysql_fetch_assoc(mysql_query("SELECT * FROM `character_vote` WHERE `char_name` = '$nick' AND `date` = '$time_sql';"));
            if (
$array == array())
              {
                
$SQL=mysql_query("INSERT INTO `items_delayed` (`owner_id`, `item_id`, `count`, `enchant_level`, `flags`, `payment_status`, `description`)
VALUES('
$char_id_sql', '$bonus_id_sql', '$numberous_sql', '0', '0', '0', 'L2Top')");
                }
              if (
$SQL)
                {
                
mysql_query("INSERT INTO `character_vote` (`char_name`, `date`) VALUES ('$nick', '$time');");
}
}
}
}
?>


Скрипт делает примерно такую работу:

Загружает данные с сайта "Мой_сайт" данные в исходном коде такие же как показано ниже, без каких либо тегов.
Пример данных с Мой_сайт:
Статистика голосования для http://мой_сайт/
2012-12-07 22:56:03   NIck1
2012-12-07 22:51:12   Nick2
2012-12-07 22:49:58   Nick3
2012-12-07 22:48:29   Nick4
2012-12-07 22:47:25   Nick5
и т.д.

После получения данных (пример 2012-12-07 22:56:03   NIck1), он регулярным выражением получает ник (Nick1), делает запрос в базу, есть ли такой ник, если нету проходит мимо, если есть, то получет у ника obj_Id. После получения obj_Id, получает уже с таблицы учета, получал ли человек за это премию, если нет, то тут уже идет запрос на добавление премии и в таблицу учета.


Добавлено: Декабрь 08, 2012, 03:23:21
Я написал код, но он огромный очень и после выдачи 1 бонуса начинает циклится на одном и том же человеке и в итоге ходит по кругу и не выдает больше ничего. Код выкладывать стремно, т.к. он в строк 350, а то и больше.... Да и думаю там ахинея полная...
« Последнее редактирование: Декабрь 08, 2012, 03:23:21 от La2Angel, Причина: Объединение сообщений »

Русское сообщество AutoIt

Как правильно переделать код php на AutoIT
« Отправлен: Декабрь 08, 2012, 03:11:41 »

Оффлайн DarWiM [?]

  • Продвинутый
  • ***
  • Сообщений: 527
  • Репутация: 90
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: Как правильно переделать код php на AutoIT
« Ответ #1, Отправлен: Декабрь 08, 2012, 09:52:57 »
La2Angel
Давай код :)

Оффлайн La2Angel [?]

  • Новичок
  • *
  • Сообщений: 144

  • Автор темы
  • Репутация: 0
    • Награды
Re: Как правильно переделать код php на AutoIT
« Ответ #2, Отправлен: Декабрь 08, 2012, 12:45:57 »
Большое спасибо, что откликнулись, вчера я тупил, уставший был, сегодня с утра удалил весь код на свежую голову смог его упростить и ура! Все работает! Упростил до 143 строки. Вот код, мб кто ешё сможет упростить его ещё компактнее сделать :)

Код: AutoIt [Выделить]
#include <file.au3>
#include <Array.au3>
#include <MySQL.au3>

Global $obj_Id, $aResult1, $aResult2, $aResult3, $aResult4, $hResult1, $hResult2, $hResult3, $hResult4, $hConnect, $hMySQL, $array

; Настройка подключения к базе данных.
Dim $sDBName = "Имя базы" ; Название базы
Dim $sHost = "Хост" ; Хост по которому будет подключаться программа к базе
Dim $sLogin = "Логин" ; Логин от базы
Dim $sPassw = "пароль" ; Пароль от базы
Dim $httpUrl="ссылка на голосование, можно заменить текстовым файлом, пример давал выше." ; адрес сайта, где будем получать список голосовавших

InitDB() ; соеденяемся с базой данных.

; Производим запрос на сайт и получаем код страницы с голосами.
$txtnew=BinaryToString(InetRead($httpUrl,1))

; Производим поиск даты и ника по регулярным выражениям, где $array[$i] - дата, $array[$i+1] - ник
$array = StringRegExp($txtnew, '([0-9]{4}\-[0-9]{2}\-[0-9]{2}\s+[0-9]{2}:[0-9]{2}\:[0-9]{2})\t+([0-9a-zA-Zа-яА-Я \-\=]*)', 3)

for $i = 0 to UBound($array)-1 step 2
;Начинаем свой жизненный цикл
$obj_Id="" ; приравниваем пустату, иначе будет накрутка
sleep(100) ; маленький перерыв, что бы не нагружать процессор.
obj_Id() ; запрос данных на индентификатор персонажа
; Проверить состояние запроса, равен 0 - нет такого персонажа. Просто уходим мимо, если нет, делаем запросы дальше.
If $aResult1=0 Then
Else
InitObj_Id() ; Обработка полученных данных и запоминание их
Nick() ; получаем дату и ник, мб персонаж уже получал бонус?
If $aResult2=0 Then AddItem() ; после обработки снова сверяем, если равно 0 - то персонаж не получал бонуса, выдаем его ему и заносим в таблицу учета.
EndIf
;Конец жизненного цикла
Next

ClosedDB() ; разрываем соединение с базой данных

MsgBox(0,"","")


;Функция инициализации с базой данных
Func InitDB()

_MySQL_InitLibrary()
If @error Then
    MsgBox(16, @ScriptName, "Error open library!")
    Exit
EndIf

$hMySQL = _MySQL_Init()
If @error Then
    MsgBox(16, @ScriptName, _MySQL_Error($hMySQL) & " (" &  _MySQL_Errno($hMySQL) & ")")
    Exit
EndIf

$hConnect = _MySQL_Real_Connect($hMySQL, $sHost, $sLogin, $sPassw, $sDBName)
If @error Then
    MsgBox(16, @ScriptName, _MySQL_Error($hMySQL) & " (" &  _MySQL_Errno($hMySQL) & ")")
    Exit
EndIf

EndFunc

;Функция запроса данных из базы на индентификатор персонажа
Func obj_Id()
If _MySQL_Real_Query($hConnect, "SELECT `obj_Id` FROM `characters` WHERE `char_name` = '"& $array[$i+1] &"'") Then
    MsgBox(16, @ScriptName, _MySQL_Error($hMySQL) & " (" &  _MySQL_Errno($hMySQL) & ")")
    Exit
Else
    $hResult1 = _MySQL_Store_Result($hConnect)
    If $hResult1 Then
        $aResult1 = _MySQL_Fetch_Result_StringArray($hResult1)
    EndIf
EndIf
EndFunc

; Обрабатываем полученные данные, что бы использовать дальше

; функция обработки полученных данных о идентификаторе персонажа
Func InitObj_Id()
    ; Если результат равен 0 - значит данных по данному персонажу нету, просто проходим мимо.
For $i = 1 To UBound($aResult1, 1)-1
    For $j = 0 To UBound($aResult1, 2)-1
        $obj_Id &= $aResult1[$i][$j] & @CRLF
    Next
    $obj_Id &= @CRLF
Next
EndFunc

;Запрос на ник и дату, мб мы уже получили бонус?

; функция запроса ника и даты, получал ли персонаж уже бонус?
Func Nick()
; Запрос на даты и ник.
If _MySQL_Real_Query($hConnect, "SELECT * FROM `character_vote` WHERE `char_name` = '"& $array[$i+1] &"' AND `date` = '"& $array[$i] &"'") Then
    MsgBox(16, @ScriptName, _MySQL_Error($hMySQL) & " (" &  _MySQL_Errno($hMySQL) & ")")
    Exit
Else
   
    $hResult2 = _MySQL_Store_Result($hConnect)
    If $hResult2 Then
        $aResult2 = _MySQL_Fetch_Result_StringArray($hResult2)
    EndIf
EndIf
EndFunc


; Т.к. у персонажа нет ещё бонусов, выдаем их ему.
Func AddItem()
; Выдаем предмет персонажу
If _MySQL_Real_Query($hConnect, "INSERT INTO `items_delayed` (`owner_id`, `item_id`, `count`, `enchant_level`, `flags`, `payment_status`, `description`) VALUES('"& $obj_Id &"', '6673', '1', '0', '0', '0', 'L2Top')") Then
    MsgBox(16, @ScriptName, _MySQL_Error($hMySQL) & " (" &  _MySQL_Errno($hMySQL) & ")")
    Exit
Else
   
    $hResult3 = _MySQL_Store_Result($hConnect)
    If $hResult3 Then
        $aResult3 = _MySQL_Fetch_Result_StringArray($hResult3)
    EndIf
EndIf
; Заносим данные в таблицу учета
If _MySQL_Real_Query($hConnect, "INSERT INTO `character_vote` (`char_name`, `date`) VALUES ('"& $array[$i+1] &"', '"& $array[$i] &"')") Then
    MsgBox(16, @ScriptName, _MySQL_Error($hMySQL) & " (" &  _MySQL_Errno($hMySQL) & ")")
    Exit
Else
   
    $hResult4 = _MySQL_Store_Result($hConnect)
    If $hResult4 Then
        $aResult4 = _MySQL_Fetch_Result_StringArray($hResult4)
    EndIf
EndIf
EndFunc

; функция разрыва соединения.
Func ClosedDB()
_MySQL_Free_Result($hResult1)
_MySQL_Free_Result($hResult2)
_MySQL_Free_Result($hResult3)
_MySQL_Free_Result($hResult4)
_MySQL_Close($hMySQL)
_MySQL_EndLibrary()
EndFunc
 


библиотека MySql - Скачать
Ниже прикрепил инклюды для библиотек.
« Последнее редактирование: Декабрь 08, 2012, 12:53:54 от La2Angel »

Русское сообщество AutoIt

Re: Как правильно переделать код php на AutoIT
« Ответ #2 Отправлен: Декабрь 08, 2012, 12:45:57 »

Оффлайн DarWiM [?]

  • Продвинутый
  • ***
  • Сообщений: 527
  • Репутация: 90
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: Как правильно переделать код php на AutoIT
« Ответ #3, Отправлен: Декабрь 08, 2012, 12:56:58 »
La2Angel
В целом хорошо, но я заметил 2 недостатка:

Код: AutoIt [Выделить]
If $aResult1 = 0 Then
Else
    InitObj_Id() ; Обработка полученных данных и запоминание их
    Nick() ; получаем дату и ник, мб персонаж уже получал бонус?
    If $aResult2 = 0 Then AddItem()
EndIf


Лучше заменить на:

Код: AutoIt [Выделить]
If $aResult1 <> 0 Then
    InitObj_Id() ; Обработка полученных данных и запоминание их
    Nick() ; получаем дату и ник, мб персонаж уже получал бонус?
    If $aResult2 = 0 Then AddItem()
EndIf


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

Оффлайн La2Angel [?]

  • Новичок
  • *
  • Сообщений: 144

  • Автор темы
  • Репутация: 0
    • Награды
Re: Как правильно переделать код php на AutoIT
« Ответ #4, Отправлен: Декабрь 08, 2012, 15:12:48 »
Ну я новичек в этом деле ))), по этому и прошу, помогите, тыкните меня носом)). А как можно в место  глобальных сделать переменные ?

Русское сообщество AutoIt

Re: Как правильно переделать код php на AutoIT
« Ответ #4 Отправлен: Декабрь 08, 2012, 15:12:48 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
4720 Просмотров
Последний ответ Апрель 17, 2011, 16:29:11
от Medic84
3 Ответов
5229 Просмотров
Последний ответ Декабрь 24, 2014, 23:20:01
от blacklis
4 Ответов
2277 Просмотров
Последний ответ Январь 04, 2012, 18:10:39
от agikon
1 Ответов
1704 Просмотров
Последний ответ Октябрь 14, 2013, 23:37:01
от CreatoR
9 Ответов
2913 Просмотров
Последний ответ Август 27, 2015, 19:27:06
от firex
8 Ответов
1473 Просмотров
Последний ответ Февраль 07, 2017, 18:34:35
от reset86
0 Ответов
399 Просмотров
Последний ответ Июнь 30, 2017, 04:11:18
от Det
1 Ответов
808 Просмотров
Последний ответ Ноябрь 02, 2017, 20:20:55
от Garrett
4 Ответов
1366 Просмотров
Последний ответ Апрель 08, 2018, 19:02:35
от kyi
2 Ответов
349 Просмотров
Последний ответ Июнь 22, 2018, 09:59:57
от pvnn