Как я проверяю, является ли тип объекта конкретным подклассом в C++?

Предупреждение: mysql_connect (): доступ запрещен для имени пользователя '@' host '

Это предупреждение появляется при подключении к серверу MySQL / MariaDB с недопустимыми или отсутствующими учетными данными (имя пользователя / пароль). Таким образом, это обычно не проблема с кодом, а проблема конфигурации сервера.

  • См. Справочную страницу в mysql_connect("localhost", "user", "pw") для примеров.

  • Убедитесь, что вы действительно использовали кнопки $username и $password.

    • Необычно, что вы получаете доступ без пароля - вот что произошло, когда Предупреждение: сказано (using password: NO).
    • Только локальный тестовый сервер обычно позволяет подключаться с именем пользователя root, без пароля и с именем базы данных test.

    • Вы можете проверить, действительно ли они исправлены с помощью клиента командной строки:
      mysql --user="username" --password="password" testdb

    • Имя пользователя и пароль с учетом регистра и пробел не игнорируется. Если ваш пароль содержит метасимволы, такие как $, откройте их или поместите пароль в одиночные кавычки .

    • Большинство хостинг-провайдеров предопределяют учетные записи mysql в отношении учетной записи пользователя unix (иногда просто префиксы или дополнительные числовые суффиксы). См. Документы для шаблона или документации, а также CPanel или любой другой интерфейс для установки пароля.

    • См. Руководство по MySQL в Добавление учетных записей пользователей с помощью командной строки. При подключении к администратору вы можете выдать запрос, например:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Или использовать Администратор или [ 1137] WorkBench или любой другой графический инструмент для создания, проверки или исправления данных учетной записи.

    • Если вы не можете исправить свои учетные данные, тогда запрос в Интернете «пожалуйста, помогите» не будет иметь никакого эффекта. Только у вас и вашего хостинг-провайдера есть разрешения и достаточный доступ для диагностики и исправления.

  • Убедитесь, что вы могли достигнуть сервера базы данных, используя имя хоста, указанное вашим провайдером:
    ping dbserver.hoster.example.net

      ]
    • Проверьте это с консоли SSH непосредственно на своем веб-сервере. Тестирование с вашего локального клиента разработки на ваш хостинг-сервер редко имеет смысл.

    • Часто вы просто хотите, чтобы имя сервера было "localhost", которое обычно использует локальный именованный сокет, когда он доступен. В других случаях вы можете попробовать "127.0.0.1" как резерв.

    • Если ваш сервер MySQL / MariaDB прослушивает другой порт, используйте "servername:3306".

    • Если это не удается, тогда есть проблема с брандмауэром.

  • При использовании констант , таких как, например, [11144]. DB_USER или DB_PASSWORD, убедитесь, что они на самом деле определены .

    • Если вы получите "Warning: Access defined for 'DB_USER'@'host'" и "Notice: use of undefined constant 'DB_PASS'", то это ваша проблема.

    • Убедитесь, что ваш, например, xy/db-config.php был фактически включен и что угодно.

  • Проверьте правильность установки GRANT разрешений .

    • Недостаточно иметь пару username + password.

    • Каждая учетная запись MySQL / MariaDB может иметь прикрепленный набор разрешений.

    • Те могут ограничить, к каким базам данных вам разрешено подключаться, из которых клиент или сервер может возникнуть соединение и какие запросы разрешены.

    • Предупреждение «Доступ запрещен» может также отображаться для вызовов mysql_query , если у вас нет прав на SELECT из определенной таблицы или INSERT / UPDATE, и чаще всего DELETE.

    • Вы можете адаптировать разрешения учетной записи при подключении к каждому клиенту командной строки с помощью учетной записи администратора с запросом типа:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • Если предупреждение появляется сначала с помощью Warning: mysql_query(): Access denied for user ''@'localhost', тогда у вас может быть php.ini-preconfigured учетной записи / пароля .

    • Убедитесь, что mysql.default_user= и mysql.default_password= имеют значимые значения.

    • Часто это конфигурация провайдера. Поэтому обратитесь к их поддержке несоответствий.

  • Найдите документацию вашего хостинг-провайдера:

  • Обратите внимание, что вы также можете исчерпать доступный пул соединений . Вы получите доступ к запрещенным предупреждениям для слишком большого количества параллельных подключений.

  • Ваша версия клиента libmysql может быть несовместимой с сервер базы данных. Обычно MySQL и MariaDB-серверы можно получить с помощью PHP, скомпилированных в драйвере. Если у вас есть пользовательская настройка или устаревшая версия PHP, а также гораздо более новый сервер базы данных или значительно устаревший - тогда несоответствие версии может препятствовать подключению. (Нет, вам нужно исследовать себя. Никто не может угадать вашу настройку).

Дополнительные ссылки:

Кстати, вы, вероятно, больше не хотите использовать функции mysql_* [1156 ]. Новички часто мигрируют в mysqli , что, однако, так же утомительно. Вместо этого прочитайте в PDO и подготовленные утверждения .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");

blockquote>

61
задан Ziezi 6 June 2017 в 22:28
поделиться

7 ответов

Вы действительно не были должны. Если Ваша программа должна знать, каков класс объект, который обычно указывает на недостаток дизайна. Посмотрите, можно ли получить поведение, Вы хотите использовать виртуальные функции. Кроме того, больше информации о том, что Вы пытаетесь сделать, помогло бы.

я предполагаю, что у Вас есть такая ситуация:

class Base;
class A : public Base {...};
class B : public Base {...};

void foo(Base *p)
{
  if(/* p is A */) /* do X */
  else /* do Y */
}

, Если это - то, что Вы имеете, затем попытайтесь сделать что-то вроде этого:

class Base
{
  virtual void bar() = 0;
};

class A : public Base
{
  void bar() {/* do X */}
};

class B : public Base
{
  void bar() {/* do Y */}
};

void foo(Base *p)
{
  p->bar();
}

Редактирование: , Так как дебаты об этом ответе все еще продолжаются после такого количества лет я думал, что должен добавить некоторые ссылки. Если у Вас есть указатель или ссылка на базовый класс, и Ваш код должен знать производный класс объекта, то это нарушает принцип замены Лисков . Дядя Bob вызовы это" анафема на Объектно-ориентированное проектирование ".

41
ответ дан Dima 24 November 2019 в 17:00
поделиться

 

class Base
{
  public: virtual ~Base() {}
};

class D1: public Base {};

class D2: public Base {};

int main(int argc,char* argv[]);
{
  D1   d1;
  D2   d2;

  Base*  x = (argc > 2)?&d1:&d2;

  if (dynamic_cast<D2*>(x) == nullptr)
  {
    std::cout << "NOT A D2" << std::endl;
  }
  if (dynamic_cast<D1*>(x) == nullptr)
  {
    std::cout << "NOT A D1" << std::endl;
  }
}
98
ответ дан idmean 24 November 2019 в 17:00
поделиться

Можно сделать это с dynamic_cast (по крайней мере, для полиморфных типов).

На самом деле, вообще-то, если задуматься - Вы не можете сказать, является ли это КОНКРЕТНО конкретный тип с dynamic_cast - но можно сказать, случается ли так что тип или любой подкласс этого.

template <class DstType, class SrcType>
bool IsType(const SrcType* src)
{
  return dynamic_cast<const DstType*>(src) != nullptr;
}
22
ответ дан idmean 24 November 2019 в 17:00
поделиться

dynamic_cast может определить, содержит ли тип целевой тип где-нибудь в иерархии наследования (да, это - малоизвестная функция, что, если B наследовался от A и C, это может повернуться A* непосредственно в C*). typeid() может определить точный тип объекта. Однако они должны оба использоваться чрезвычайно экономно. Как уже был упомянут, необходимо всегда избегать динамической идентификации типа, потому что она указывает на недостаток дизайна. (также, если Вы знаете, что объект наверняка имеет целевой тип, можно сделать удрученное с static_cast. Повышение предлагает polymorphic_downcast, который сделает удрученное с dynamic_cast и assert в режиме отладки, и в режиме выпуска это будет просто использовать static_cast).

6
ответ дан coppro 24 November 2019 в 17:00
поделиться

Можно только сделать это во время компиляции использующие шаблоны, если Вы не используете RTTI.

Это позволяет Вам использовать функцию идентификатора типа, которая приведет к указателю на type_info структуру, которая содержит информацию о типе.

Read на нем в Википедия

1
ответ дан user32141 24 November 2019 в 17:00
поделиться

Я не знаю, понимаю ли я Вашу проблему правильно, таким образом позвольте мне вновь заявить о нем в своих собственных словах...

проблема: Учитывая классы B и D, определите, ли D подкласс B (или наоборот?)

Решение: Используйте некоторое шаблонное волшебство! Хорошо, серьезно необходимо смотреть на LOKI, превосходная шаблонная библиотека метапрограммирования, произведенная легендарным автором C++ Andrei Alexandrescu.

А именно, загрузите LOKI и включайте заголовок TypeManip.h от него в Вашем исходном коде, тогда используют SuperSubclass шаблон класса следующим образом:

if(SuperSubClass<B,D>::value)
{
...
}

Согласно документации, SuperSubClass<B,D>::value будет верно, если B будет общедоступная основа D, или если B и D псевдонимы того же типа.

т.е. или D подкласс [1 113] или D, совпадает с B.

я надеюсь, что это помогает.

редактирование:

обратите внимание, что оценка [1 116] происходит во время компиляции в отличие от некоторых методов, которые используют dynamic_cast, следовательно нет никакого штрафа за использование этой системы во времени выполнения.

4
ответ дан Community 24 November 2019 в 17:00
поделиться

В c# можно просто сказать:

if (myObj is Car) {

}
1
ответ дан Jason Plank 24 November 2019 в 17:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: