Не знаю, как решить сообщение об ошибке, связанной с курсором, но я не думаю, что подготовленное заявление решит вашу проблему с производительностью - до тех пор, пока вы используете SQL Server 2005 или более позднюю версию, план выполнения для SELECT * from user WHERE login = $login
уже будет использоваться повторно. и не будет никакого повышения производительности от подготовленного заявления. Я не знаю ни о MySql, ни о других серверах баз данных SQL, но подозреваю, что у них тоже есть аналогичные оптимизации для специальных запросов, которые делают подготовленный оператор избыточным.
Похоже, что причина снижения производительности связана с тем, что вы совершаете 40 000 обращений к базе данных - вам следует попытаться переписать запрос, чтобы выполнить только один оператор SQL со списком логин. Правильно ли я считаю, что MySql поддерживает тип данных aray? Если это не так (или вы используете Microsoft SQL), вам следует рассмотреть возможность передачи какого-либо списка имен пользователей с разделителями.