Это предупреждение появляется при подключении к серверу 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=
имеют значимые значения.
Часто это конфигурация провайдера. Поэтому обратитесь к их поддержке несоответствий.
Найдите документацию вашего хостинг-провайдера:
, например. HostGator , GoDaddy , 1 и 1 , DigitalOcean , BlueHost , DreamHost , ] MediaTemple , ixWebhosting , lunarhosting или просто google yours ».
Еще раз обратитесь к своему провайдеру хостинга через свои каналы поддержки.
Обратите внимание, что вы также можете исчерпать доступный пул соединений . Вы получите доступ к запрещенным предупреждениям для слишком большого количества параллельных подключений.
Ваша версия клиента libmysql может быть несовместимой с сервер базы данных. Обычно MySQL и MariaDB-серверы можно получить с помощью PHP, скомпилированных в драйвере. Если у вас есть пользовательская настройка или устаревшая версия PHP, а также гораздо более новый сервер базы данных или значительно устаревший - тогда несоответствие версии может препятствовать подключению. (Нет, вам нужно исследовать себя. Никто не может угадать вашу настройку).
Дополнительные ссылки:
Кстати, вы, вероятно, больше не хотите использовать функции
blockquote>mysql_*
[1156 ]. Новички часто мигрируют в mysqli , что, однако, так же утомительно. Вместо этого прочитайте в PDO и подготовленные утверждения .$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");
Вы действительно не были должны. Если Ваша программа должна знать, каков класс объект, который обычно указывает на недостаток дизайна. Посмотрите, можно ли получить поведение, Вы хотите использовать виртуальные функции. Кроме того, больше информации о том, что Вы пытаетесь сделать, помогло бы.
я предполагаю, что у Вас есть такая ситуация:
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 вызовы это" анафема на Объектно-ориентированное проектирование ".
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;
}
}
Можно сделать это с dynamic_cast
(по крайней мере, для полиморфных типов).
На самом деле, вообще-то, если задуматься - Вы не можете сказать, является ли это КОНКРЕТНО конкретный тип с dynamic_cast
- но можно сказать, случается ли так что тип или любой подкласс этого.
template <class DstType, class SrcType>
bool IsType(const SrcType* src)
{
return dynamic_cast<const DstType*>(src) != nullptr;
}
dynamic_cast
может определить, содержит ли тип целевой тип где-нибудь в иерархии наследования (да, это - малоизвестная функция, что, если B
наследовался от A
и C
, это может повернуться A*
непосредственно в C*
). typeid()
может определить точный тип объекта. Однако они должны оба использоваться чрезвычайно экономно. Как уже был упомянут, необходимо всегда избегать динамической идентификации типа, потому что она указывает на недостаток дизайна. (также, если Вы знаете, что объект наверняка имеет целевой тип, можно сделать удрученное с static_cast
. Повышение предлагает polymorphic_downcast
, который сделает удрученное с dynamic_cast
и assert
в режиме отладки, и в режиме выпуска это будет просто использовать static_cast
).
Можно только сделать это во время компиляции использующие шаблоны, если Вы не используете RTTI.
Это позволяет Вам использовать функцию идентификатора типа, которая приведет к указателю на type_info структуру, которая содержит информацию о типе.
Read на нем в Википедия
Я не знаю, понимаю ли я Вашу проблему правильно, таким образом позвольте мне вновь заявить о нем в своих собственных словах...
проблема: Учитывая классы 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
, следовательно нет никакого штрафа за использование этой системы во времени выполнения.
В c# можно просто сказать:
if (myObj is Car) {
}