Quote (Crayzi)
У меня такой нупский вопрос:
Как получить требуемую информацию из базы MySQL посредством 3D RAD (допустим запущена база на том же компе, логин 123 пароль 321 название "World" в ней раздел "Accounts", который состоит из 1 таблицы "Login", как получить данные из этой таблицы и как выполнить туда sql ф-цию)? Не судите строго, я работал с MySQL только через сторонние программы, да и 3D RAD только начал изучать.
Учитывая что NETWORK FUNCTIONS в AngelScript для 3D Rad специфичены, и не совместимы с БД типа MySQL, то средствами чисто 3D Rad никак. Однако у нас есть такой замечательный раздел как "EXTERNAL DLL FUNCTIONS"
EXTERNAL DLL FUNCTIONS
- int iDLLLoad(string)
- iDLLUnload(int)
- bool iDLLCall(int,string,int)
- iDLLArraySet(int,float)
- float iDLLArrayGet(int)
Code
//Функция первых два элемента массива помещает в третьем
int DLLHandle = 0;
void Main()
{
if (iInitializing())
{
DLLHandle = iDLLLoad(".\\3DRad_res\\objects\\Script\\MyDLL.dll");
}
else if (iDeinitializing())
{
if (DLLHandle != 0) iDLLUnload(DLLHandle);
}
else
{
if (DLLHandle != 0)
{
iDLLArraySet(0,3);
iDLLArraySet(1,4);
iDLLArraySet(2,0);
iDLLCall(DLLHandle,"MyFunction",0);
OUT_0 = iDLLArrayGet(2); //OUT_0 - вывод на value print
}
}
}
Не забываем юзать соглашение __stdcall
Либу необходиму для работы можно написать на любом ЯП например на Дельфине.
Не буду в даваться в подробности написания либы, но чтобы не было гемора с MySQL запросами то ставим дельфина, качаем эту либу компонентов. После скачки распаковываем в {$Delphi}/lib/.
При работе с MySQL добавляем в uses uMySqlVio, uMysqlCT, uMysqlClient, uMysqlHelpers
Добавим в объект:
MySQLClient: TMySQLClient;
Еще нам понадобится один объект для выполнения SQL запросов:
MySQLResult: TMysqlResult;
Пишем код для подключения к базе и выполнения запроса. Двойной клик на главной форме и в процедуре OnCreate пишем:
Code
MySQLClient := TMySQLClient.Create;
В процедуру OnDestroy добавляем такой код:
Code
MySQLClient.Free;
if MySQLResult <> nil then
MySQLResult.Free;
Чтобы соединиться с базой, нам нужно определить такие параметры как: хост, порт, пользователь, пароль, UNIX сокет и имя базы данных.
Code
if FMysql.Connect(Edit1.Text, Edit3.Text, Edit4.Text, 'db', StrToInt(Edit2.text), '', false, 0) then ShowMessage('connected ok!');
Аргументы этой функции располагаются в таком порядке:
host, username, password, db, port, socket, try, sockets, client, flag
Сам запрос ничем не отличается от такого же, написанного на PhP.
Результат выполнения запроса присваивается переменной MySQLResult, а для выполнения используется объект MySQLClient. Функция выполнения запроса принимает три аргумента: сам SQL запрос, флаг - сохранять ли результат и переменную, куда будет записан флаг выполнения (true, false).
Code
MySQLResult := MySQLClient.Query('SELECT * FROM admin_users WHERE username=''dummy_username'' and password=''dummy_pass''', True, OK);
Таким образом, строка кода, которую вы видите выше, присваивает результат выполнения запроса переменной MySQLResult. В запросе извлекается запись из таблицы admin_users. В логической переменной OK сохранен флаг выполнения, то есть, значение true свидетельствует об успешном выполнении, а false означает ошибку.
Теперь можно получить значение поля:
Code
MySQLResult.FieldValueByName('username');
Как можно было догадаться, это скрипт проверки имени пользователя и пароля. Осталось только сделать проверку.
Я решил сделать это таким образом, что все проверяется в одном операторе IF, и конкретная причина не выдается:
Code
if (MySQLResult.FieldValueByName('username') <> 'dummy_username') or (MySQLResult.FieldValueByName('password') <> 'dummy_pass') then
Здесь мы проверили жестко закодированное имя пользователя dummy_username с тем, которое возвратил запрос. Пароль проверяется таким же образом.
Для проверки пасов разумеется юзаем md5 хеш. На всякий случай прикрепил Uses для md5
PS: в общем пишите либу и через нее работайте.