Как циклы foreach работают в 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>

84
задан Peter Mortensen 31 October 2011 в 21:11
поделиться

4 ответа

На самом деле, строго разговор, все необходимо использовать foreach, общественность GetEnumerator() метод, который возвращает что-то с bool MoveNext() метод и ? Current {get;} свойство. Однако большинство распространенный значение этого - "что-то, что реализует IEnumerable / IEnumerable<T>, возвращаясь IEnumerator / IEnumerator<T>.

Косвенно, это включает что-либо, что реализует ICollection / ICollection<T>, такие как что-либо как [1 112], List<T>, массивы (T[]), и т.д. Таким образом, любой стандарт "набор данных" будет обычно поддерживать foreach.

Для доказательства первой точки, следующее работает просто великолепно:

using System;
class Foo {
    public int Current { get; private set; }
    private int step;
    public bool MoveNext() {
        if (step >= 5) return false;
        Current = step++;
        return true;
    }
}
class Bar {
    public Foo GetEnumerator() { return new Foo(); }
}
static class Program {
    static void Main() {
        Bar bar = new Bar();
        foreach (int item in bar) {
            Console.WriteLine(item);
        }
    }
}

, Как это работает?

цикл foreach А как [1 116] отчасти приравнивается к:

var tmp = obj.GetEnumerator();
int i; // up to C# 4.0
while(tmp.MoveNext()) {
    int i; // C# 5.0
    i = tmp.Current;
    {...} // your code
}

Однако существуют изменения. Например, это перечислитель (tmp) поддержки IDisposable, это используется также (подобный [1 118]).

Примечание различие в размещении объявления "1119" в (C# 5.0) по сравнению с [1 122] внешний (C# 4.0) цикл. Важно, если Вы используете i в анонимном методе/лямбде в Вашем блоке кода. Но это - другая история;-p

159
ответ дан Paul Groke 24 November 2019 в 08:34
поделиться

От MSDN:

foreach оператор повторяет группу встроенных операторов для каждого элемента в [1 111] массив или объектный набор . foreach оператор используется для итерации через набор для получения желаемой информации, но не должен использоваться для изменения содержания набора для предотвращения непредсказуемых побочных эффектов. (шахта акцента)

Так, если у Вас есть массив, Вы могли бы использовать foreach оператор для итерации через массив, как так:

 int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
    foreach (int i in fibarray)
    {
        System.Console.WriteLine(i);
    }

Вы могли также использовать его для итерации через List<T> набор, как так:

List<string> list = new List<string>();

foreach (string item in list)
{
    Console.WriteLine(item);
}
7
ответ дан George Stocker 24 November 2019 в 08:34
поделиться

Согласно сообщению в блоге Утиная Нотация , используется утиный ввод.

4
ответ дан Peter Mortensen 24 November 2019 в 08:34
поделиться

Вот документы: статья Main С Массивами С Объектами коллекции

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

Это генерирует исключение на этапе выполнения, если будет не-Apple в корзине фруктов, такой как апельсин.

List<Fruit> fruitBasket = new List<Fruit>() { new Apple(), new Orange() };
foreach(Apple a in fruitBasket)

Это безопасно фильтрует список только к Яблокам с помощью Счетный. OfType

foreach(Apple a in fruitBasket.OfType<Apple>() )
2
ответ дан Amy B 24 November 2019 в 08:34
поделиться
Другие вопросы по тегам:

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