Что нового

Работа с базой MySQL

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
Здравствуйте, возникла потребность использовать в скрипте возможность общения с базой данных MySql, расположенной далеко на сервере :smile:
Необходимо только считывать нектоторые значения из базы, они используются в самом скрипте, скажем в качестве переменных. Т е при каждом запуске лезем на сервер, читаем нужные данные, запоминаем, и дальше работаем автономно)

Также меня интересуют такие аспекты как безопасность и нагрузка на сервер.
Если скрипт может читать значения из базы, то как уберечься от того, чтобы все это не отловилось сниффером и пользователь не смог сам напрямую копаться в базе?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Здесь уже выкладывались UDF
http://autoit-script.ru/index.php?topic=2073.0
По безопасности: думаю все что ты хранишь в скрипте при желании можно извлечь.
Разграничивай права и веди логи.
Если для работы нужны данные из одной таблицы, то не нужно давать права на всю базу.
Или, например, заведи спец. пользователя для твоего приложения и смотри кто им слишком активно копается.
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
я видел этот топик, я бы хотел нормальных примеров.
нашел вот это и вот это
либо толком не работает либо старое
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
пробовал пимеры подключения из поста выше но не работает, помогите)
 

XpycT

Скриптер
Сообщения
380
Репутация
133
Bloodrinker
Если ты ODBC драйвер брал с офф сайта то в UDF надо поменять версию ODBC драйвера с "{MySQL ODBC 3.51 Driver}" на "{MySQL ODBC 5.1 Driver}"
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
в какой именно UDF?
также я понял в чем ошибка, мой хостер не дает доступ к мускулу по TCP, ищу дешевый VPS/VDS потом отпишу....
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
а ничего что она очень старая? нормально работает?
 

XpycT

Скриптер
Сообщения
380
Репутация
133
Bloodrinker
У меня работала, но потом я отказался от нее и перешел полностью на использование драйвера на прямую

Но если у тебя
хостер не дает доступ к мускулу по TCP
то тогда она тебе наврядли поможет
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
ну вот я и ищу дешевый VPS ))) не найду никак) а как драйвер напрямую? api?)
 

XpycT

Скриптер
Сообщения
380
Репутация
133
Bloodrinker [?]
а как драйвер напрямую?
Вот так
Код:
#Region Includes
#Include <Array.au3>
#EndRegion Includes
#NoTrayIcon

Global $oMySQLError = ObjEvent("AutoIt.Error", "_MySQLError")

Dim $sDBServerIP = "" ; IP адресс севера с MySQL
Dim $sDBUsername = ""        ; Имя пользователя для подключения к базе данных
Dim $sDBPassword = ""      ; Пароль
Dim $sDatabase   = "test_db"      ; База Данных к которой будем подключаемся

; Подключаемся к Серверу
Global $MySQLConn = ObjCreate("ADODB.Connection")
$MySQLConn.Open("DRIVER={MySQL ODBC 5.1 Driver};SERVER=" & $sDBServerIP & ";DATABASE=" & $sDatabase & ";UID=" & $sDBUsername & ";PWD=" & $sDBPassword & ";PORT=3306")

; Создаем таблицу
Dim $sTableName = "test_tbl"

Dim $sCreateTableQuery = "CREATE TABLE `" & $sTableName & "` (`col0` VARCHAR( 15 ) NULL, `col1` VARCHAR( 15 ) NULL, `col2` VARCHAR( 15 ) NULL, `col3` VARCHAR( 15 ) NULL, PRIMARY KEY (`col0`))"
$sCreateTableQuery &= "ENGINE = MYISAM"
$MySQLConn.Execute($sCReateTableQuery)

; Добавляем Записи в Таблицу
Dim $sInsertQuery = "INSERT INTO `" & $sTableName & "` (`col0`, `col1`, `col2`, `col3`) VALUES ('Col 0 Row 1', 'Col 1 Row 1', 'Col 2 Row 1', 'Col 3 Row 1');"
$MySQLConn.Execute($sInsertQuery)

; Получаем кол-во столбцов в таблице
Dim $iColCount = 0
$oColCountQuery = $MySQLConn.Execute("SHOW COLUMNS IN `" & $sTableName & "`")
With $oColCountQuery
    While Not .EOF
        $iColCount += 1
    .MoveNext
    WEnd
EndWith
MsgBox(0, "MySQL", "Кол-во Столбцов в таблице = " & $iColCount)

; Получаем кол-во строк в таблице
Dim $iRowCount = 0
$oRowCountQuery = $MySQLConn.Execute("SELECT COUNT(*) FROM `" & $sTableName & "`")
With $oRowCountQuery
    While Not .EOF
        $iRowCount = $oRowCountQuery.Fields(0).Value
    .MoveNext
    WEnd
EndWith
MsgBox(0, "MySQL", "Кол-во Строк в таблице = " & $iRowCount)

; Получаем значения из таблицы
Dim $r = 1
Dim $aDBRecords[$iRowCount + 1][$iColCount] = [[$iRowCount, ""]] ; Создаем массив для хранения данных
Dim $oGetRecords = $MySQLConn.Execute("SELECT * FROM `" & $sTableName & "`")
With $oGetRecords
    While Not .EOF
        For $c = 0 To $iColCount - 1
            $aDBRecords[$r][$c] = $oGetRecords.Fields($c).Value ; Заносим данные в массив

            MsgBox(0, "MySQL", "Столбцец : " & $c & @CRLF & "Строка : " & $r & @CRLF & "Значение : " & $aDBRecords[$r][$c])
        Next
        $r += 1
        .MoveNext
    WEnd
EndWith
_ArrayDisplay($aDBRecords)

; Удаляем Запись из таблицы
Dim $sDereteRecordQuery = "DELETE FROM `" & $sTableName & "` WHERE `col0` = 'Col 0 Row 1'"
$MySQLConn.Execute($sDereteRecordQuery)

; Удаляем только что созданую таблицу
$MySQLConn.Execute("DROP TABLE `" & $sTableName & "`")

; Отключаемся от сервера
$MySQLConn.Close


Func _MySQLError()
  $HexNumber = Hex($oMySQLError.number, 8)

  MsgBox(16, "MySQL Error", "err.description is  : " & @TAB & $oMySQLError.description & @CRLF & _
                            "err.windescription  : " & @TAB & $oMySQLError.windescription & @CRLF & _
                            "err.number is       : " & @TAB & $HexNumber & @CRLF & _
                            "err.lastdllerror is : " & @TAB & $oMySQLError.lastdllerror & @CRLF & _
                            "err.scriptline is   : " & @TAB & $oMySQLError.scriptline & @CRLF & _
                            "err.source is       : " & @TAB & $oMySQLError.source & @CRLF & _
                            "err.helpfile is     : " & @TAB & $oMySQLError.helpfile & @CRLF & _
                            "err.helpcontext is  : " & @TAB & $oMySQLError.helpcontext)

    Exit

    SetError(1)  ; to check for after this function returns
EndFunc   ;==>MyErrFunc
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
не могу подключиться никак, использя твой последний скрипт. если через HeidiSQL - без проблем, скриптом ошибку выдает при создании таблички
 

XpycT

Скриптер
Сообщения
380
Репутация
133
А какую ошибку выдает скрипт??

Только что проверил, у меня нормально сработал
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
Если использовать UDF MySQL - работает нормально, а в твоем скрипте шибка, пока не могу заскриншотить, после обеда скину
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
XpycT

У меня на ХР последний скрипт работает нормально, а вот в Win 7 MySQL ODBC 3.51 Driver не работает(видимо, для Win 7 он устарел), настроить не могу. MySQL ODBC 5.1 Driver - работает, но скрипт выдает сообщение об ошибке из последней функции. Что это значит?
 

XpycT

Скриптер
Сообщения
380
Репутация
133
WSWR
Какую ошибку выдает скрипт? Сделай скрин и выложи.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
если для своего удобства делать то да варианты выше подходят, НО если у тебя другая ситуация, то redline прав - все что находится в скрипте - может оттуда быть вытащенным (т.э безопасность не ахти)...
По поводу советов, то вот как можно сделать:
1. завести пользователя мускула с правами только на чтения
2. Создать промежуточное звено через которое скрипт будет брать переменные используя учётку только для чтения... Например php -скрипт который будет генерировать страницу с необходимыми тебе переменными, а скрипт будет считывать уже с нее. Скорость работы может чуть меньше будет чем напрямую, но система обмена будет безопасной и скрипт будет получать уже готовую переменную, что может упростить код твоего скрипта. И что немаловажно для тебя не нужно переходить на более дорогой вариант с VDS, так как при такой схеме не требуется доступ к мускулу по TCP.
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
всмысле брать переменные со странички, на котрой генерим переменные с помощью PHP, который в свою очередь берет все из MySQL базы? но толда надо чтобы страничка генерилась лиш на время "взятия" переменных, всмысле чтобы не попала в индекс, и не была видна при вводе этого адреса в браузер. но как посылать запрос на генерацию - без понятия.
И вообще, есть же много программ, которые "сотрудничают" с сервером её разработчика, для прроверки лицензии там и прочего, как все это прооисходит?

Не поверишь в чем ошибка была))) Имя пользователя и имя БД совпадали, удалил старую базу, добавил новую, и запустил скрипт - все без ошибок, выдало мне это (см 1 картинку)
PS может ошибка конечно была не в одингаковых именах, но вдруг... кстати, а вот при выходе все еще кажет ошибку (2 картинка)
 

XpycT

Скриптер
Сообщения
380
Репутация
133
Если я правильно понял то что предложил beliy, то примерно так

Создаем php фаил вот с таким скриптом:
PHP:
<?php

if ($_GET["app"] == "MySQLApp") { echo "mysql_password"; }

?>
и кладем фаил на сервер.

Далее из AutoIt скрипта делаем GET запрос
Код:
$sURL = "" ; Здесь надо указать Аддрес Севера и название файла с php скриптом указаным выше
$sGET = "?app=MySQLApp" ; GET запрос

Global $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTTP.Open("GET", $sURL & $sGET)
$oHTTP.Send("")
$oHTTP.WaitForResponse
$sMySQLPassword = $oHTTP.ResponseText
ConsoleWrite("$sMySQLPassword = " & $sMySQLPassword & @CR)


php скрипт проверит данные из GET запроса, высылаемого AutoIt скритпом и если все правильно выдаст пароль к MySQL, который будет записанн в переменную $sMySQLPassword
 
Автор
B

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
матать паролем туда-сюда не лучшая идея, все отлавливается на лету)
Кстати почему у меня такая ошибка при выходе? кто знает?
 
Верх