Delphi - ZEOS MySQL - доступ запрещен

Я пытаюсь подключиться к моему серверу базы данных mysql (версия 5.6) в Интернете из приложения Delphi 7 ...

С Mysql Workbench он работает нормально, я могу запускать запросы выбора с моим тестовым пользователем (тем же пользователем, который не работает в Delphi 7) ...

В Delphi, где используется TZEosConn 7.1.4-stable, введено правильное имя хоста для сервера БД, правильное имя пользователя и пароль ... (параметр loginprompt = false) Когда я меняю "connected" на true, все работает нормально ...

Но когда я пытаюсь выполнить простой запрос:

zq.SQL.Text: = 'ВЫБРАТЬ поле ИЗ БД. ТАБЛИЦА, где id =' + inttostr (x) + ';'; zq.ExecSQL;

где zq - это TZQuery, а x - целое число,

Я получил эту ошибку: ** EZSQLException .. Команда SELECT отклонена для @my_internet_hostname **

Когда я вошел в MySQL Workbench, я вижу того же пользователя с сеансом подстановочных знаков, например mydbuser @%, тот же выбор работает нормально

Итак, я думаю, проблема в компоненте ZEOS, он автоматически добавляет имя хоста моего интернет-провайдера ...

На сервере mysql мне разрешены подстановочные имена хостов (просто - '%' - чтобы все хосты могли получить доступ к моей базе данных MYSql)

Может кто-нибудь подсказать мне, в чем проблема с моим компонентом ZEOS ???

PS: извините за мой английский и форматирование


person Fero    schedule 24.02.2016    source источник
comment
вы можете посмотреть мой ответ здесь. Не зачитывайте слишком далеко только часть разрешения для стола. Другая часть не связана с этим. разрешение. Может, это поможет.   -  person moskito-x    schedule 24.02.2016
comment
@ moskito-x спасибо за ответ, я думаю, что нет проблем с разрешениями таблиц, потому что с моего локального ПК (тот же IP-адрес хоста, но другое приложение) - то же самое, что работает на верстаке mysql, и, к сожалению, то же самое не работа в Delphi с компонентами Zeos ... Проблема, как я уже сказал, компонент zeos добавляет неправильное имя хоста после имени пользователя, то есть [email protected], а правильное имя пользователя должно быть user @%   -  person Fero    schedule 24.02.2016
comment
нет пользователя @%. Вы всегда получаете хост, с которого происходит соединение.   -  person moskito-x    schedule 24.02.2016
comment
Это изображение из MySQL WorkBench, где все работает нормально: i67.tinypic.com/11l0bkh.png   -  person Fero    schedule 24.02.2016
comment
Помните: ваше соединение в порядке. Только у пользователя нет разрешения на команду SELECT.   -  person moskito-x    schedule 24.02.2016
comment
Пользователь предоставил все, кроме разрешения GRANT ... И на стороне сервера mysql разрешены узлы с подстановочными знаками   -  person Fero    schedule 24.02.2016
comment
посмотрите на базу данных на сервере, найдите таблицу, к которой вы хотите получить доступ. и покажите мне скриншот разрешения.   -  person moskito-x    schedule 24.02.2016
comment
У меня пустая таблица Information_schema.TABLE_PRIVILEGES - может быть проблема?   -  person Fero    schedule 24.02.2016
comment
на мгновение добавьте на сервер [email protected]. Дайте ему для этой таблицы разрешение на выбор, обновление, изменение таблицы. и попробуй еще раз.   -  person moskito-x    schedule 24.02.2016
comment
Я добавил имя хоста к разрешенным хостам на сервере, не помогло ... затем я воссоздал тестового пользователя, сбросил привилегии, и теперь все работает нормально .. странно ... Но спасибо за идею, теперь моя проблема решена .. .   -  person Fero    schedule 24.02.2016


Ответы (2)


Ваш сервер MySQL из Интернета?

  • Прежде всего: позволяет ли ваш интернет-провайдер получить прямой доступ к базе данных MySQL с помощью соединения «канал / сокет»? Обычно интернет-провайдер не разрешает этого из соображений безопасности. (Они могут открыть для этого специальный IP / порт, если вы их спросите).

  • Во-вторых: у вас была возможность получить грант? это может вызвать проблемы с компонентом ZEOS.

    ПРЕДОСТАВЛЯЙТЕ ИСПОЛЬЗОВАНИЕ . TO 'root' @ '%'

    ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА _1 _. * 'Root' @ '%' С ОПЦИЕЙ GRANT

Если я хорошо помню, после того, как я изменю привилегию, как это работает. это было с сервером mysql локальной сети (с протестированным EasyPHP и WAMP).

Я бы также посоветовал вам подключиться с помощью строки DSN: проверьте ниже способ подключения:

http://synopse.info/forum/viewtopic.php?id=1547

var
  dsn : string;
begin
  dsn := 'zdbc:mysql://192.168.2.60:3306/world?username=root;password=dev';

Вы можете использовать его для инициализации ZEOSConnexion, а также будьте осторожны с используемой кодировкой: iso-8859-1, iso-8859-15, utf-8, ansi. Потому что Delphi 7 использует ANSI, а интернет-серверы часто используют другие, например UTF-8.

в любом случае я вижу ошибку в вашем коде:

zq.SQL.Text:='SELECT field FROM database.TABLE where id='+inttostr(x)+';';
zq.ExecSQL;

ExecSQL используется для команд UPDATE, INSERT, DELETE, обычно для команды select, которая возвращает записи, удобнее использовать команду open:

zq.Close;
zq.SQL.Text:='SELECT field FROM database.TABLE where id='+inttostr(x)+';';
zq.Open;

Я даю много путей для исследования, надеюсь, это поможет.

person ffert2907    schedule 24.02.2016

Я думаю, что вы должны добавить какую-то строку в свойствах вашего компонента TZConnection:

перед открытием соединения с вашим компонентом TZConnection попробуйте следующее:

function openConnection(BD, User, Host, Pass: string; DBConnection: TZConnection): boolean;
begin
    Result:= false;
    if DBConnection = nil then exit;

    DBConnection.HostName := Host; // Host name to connect
    DBConnection.Protocol := 'mysql-5';
    DBConnection.Port     := 3306; //default port
    DBConnection.Database := DB; // your database name
    DBConnection.User     := User;
    DBConnection.Password := Pass;
    DBConnection.Properties.clear;
    DBConnection.Properties.Add('CLIENT_MULTI_STATEMENTS=1');
    DBConnection.Properties.Add('controls_cp=GET_ACP');

    try
        DBConnection.Connect;
        Result:= DBConnection.Connected;    
    except
        On e:Exception do
        begin
            Result:= false;
            ShowMessage(e.Message);
        end;
    end;
end;
person BMS    schedule 24.02.2016