#mysql #database #perl
#mysql #База данных #perl
Вопрос:
Пожалуйста, помогите понять, что я здесь делаю не так. Я предполагаю, что экранирование неверно, но я не могу найти работоспособный пример в Google.
my $host = "localhost";
my $port = "3306";
my $user = "root";
my $pass = "111";
my $db_name = "test";
my $db_user = "test";
my $db_pass = "test";
my $dsn = "dbi:mysql::$host:$port";
my $dbh = DBI->connect($dsn, $user, $pass) or die "Unable to connect: $DBI::errstrn";
$dbh->do("CREATE DATABASE $db_name");
$dbh->do("CREATE USER $db_user@$host");
$dbh->do("GRANT ALL ON $db_name.* TO $db_user@$host IDENTIFIED BY $db_pass");
$dbh->disconnect();
Ошибка:
DBD::mysql::db do failed: Operation CREATE USER failed for 'test'@'localhost' at /home/andrew/sandbox/script.pl line 42.
DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'test' at line 1 at /home/andrew/sandbox/script.pl line 43.
Спасибо за ответы.
Ответ №1:
Вам нужно указать пароль.
$dbh->do("GRANT ALL ON $db_name.* TO $db_user@$host IDENTIFIED BY '$db_pass'");
^ ^
Хотя, конечно, подготовленные операторы / параметры были бы намного лучше (если MySQL разрешает их здесь, в чем я не уверен на 100%).
Вы $db_user
$host
также должны указать и (опять же, предполагая, что параметры не работают).
Если параметры работают:
$dbh->do(q{GRANT ALL ON ?.* TO ?@? IDENTIFIED BY ?}, {}, $db_name, $db_user, $host, $db_pass);
Я вполне уверен, что параметры будут работать с паролем, а также, вероятно, с пользователем и хостом. Имя базы данных, я не так уверен. Возможно, вам просто придется встроить его quote_identifier
.
редактировать: вы должны просто CREATE USER
полностью вычеркнуть строку. Предоставление разрешений создаст пользователя (и с паролем).
Комментарии:
1. извините, я вас не понял, $password содержит простую строку без пробелов, а ошибка указывает на команды «создать пользователя» и «предоставить»
2. @lush: синтаксис ПРЕДОСТАВЛЕНИЯ требует одинарных кавычек вокруг пароля. У вас их нет. Итак, вы получаете синтаксическую ошибку.
3. Это сработало. Да, цитирование не работает с пользователем, но я просто прокомментировал строку «создать пользователя», поскольку это не обязательно. Спасибо)
Ответ №2:
Похоже, вы пытаетесь создать пользователя каждый раз при запуске скрипта — я получаю точную ошибку, если пытаюсь создать пользователя более одного раза.
Комментарии:
1. Вы правы! Я удалил пользователя и указал его как ‘$ db_user’ @ ‘$ host’, теперь он полностью работает. Спасибо)