Что нового

Как правильно переделать код php на AutoIT

La2Angel

Новичок
Сообщения
156
Репутация
1
Многоуважаемые пользователи, сломал уже всю голову себе... но ни как не могу перевести данный скрипт 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 "
<font color='red'>Извините, к сожалению на данный момент этот сервис не доступен.
".$error."</font>
"; 
        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=@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, получает уже с таблицы учета, получал ли человек за это премию, если нет, то тут уже идет запрос на добавление премии и в таблицу учета.


Добавлено:
Сообщение автоматически объединено:

Я написал код, но он огромный очень и после выдачи 1 бонуса начинает циклится на одном и том же человеке и в итоге ходит по кругу и не выдает больше ничего. Код выкладывать стремно, т.к. он в строк 350, а то и больше.... Да и думаю там ахинея полная...
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Большое спасибо, что откликнулись, вчера я тупил, уставший был, сегодня с утра удалил весь код на свежую голову смог его упростить и ура! Все работает! Упростил до 143 строки. Вот код, мб кто ешё сможет упростить его ещё компактнее сделать :smile:

Код:
#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 - Скачать
Ниже прикрепил инклюды для библиотек.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
La2Angel
В целом хорошо, но я заметил 2 недостатка:

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


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

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


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

La2Angel

Новичок
Сообщения
156
Репутация
1
Ну я новичек в этом деле ))), по этому и прошу, помогите, тыкните меня носом)). А как можно в место глобальных сделать переменные ?
 
Верх