2012-10-13 3 views
0

Я пытаюсь создать таблицу в MySQL на основе ввода пользователем. В идеале сценарий Perl подключается к базе данных и создает таблицу с переменной, полученной от пользователя. Вот мой сценарий:Ошибка создания таблицы с переменной с использованием Perl в MySQL

print "Please enter a name for the table: "; 
$tableName = <>; 
chomp($tableName); 
&createTable ($tableName); 

sub createTable 
{ 
    use DBI; 
    my $platform = "mysql"; 
    my $database = "example"; 
    my $host = "localhost"; 
    my $user = "user"; 
    my $pw = "pw"; 
    my $dsn = "dbi:$platform:$database:$host"; 
    my $dbh = DBI->connect($dsn, $user, $pw) or die "Unable to connect: $DBI::errstr\n"; 
    $dbh->do("DROP TABLE IF EXISTS $_"); 
    $dbh->do("CREATE TABLE $table (column VARCHAR(17))"); 
    $dbh->disconnect; 
} 

Но когда я выполнить сценарий, и введите значение (скажем, «тест»), он выпаливает это ко мне спиной:

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 '' at line 1 at /path/to/scripts/dbTest.pl line 28, <> line 2. 
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 '(column VARCHAR(17))' at line 1 at /path/to/scripts/dbTest.pl line 29, <> line 2. 

Строка 28 является команда DROP , а строка 29 - команда CREATE. Я проверил свой синтаксис много раз, но я не понимаю, где находится ошибка. Я пропустил что-то настолько простое ...?

ответ

1

Попробуйте это:

use warnings; use strict; 
use DBI; 
print "Please enter a name for the table: "; 
$tableName = <>; 
chomp($tableName); 
createTable($tableName); 

sub createTable { 
    my $table = shift; 

    my $platform = "mysql"; 
    my $database = "example"; 
    my $host = "localhost"; 
    my $user = "user"; 
    my $pw = "pw"; 
    my $dsn = "dbi:$platform:$database:$host"; 
    my $dbh = DBI->connect($dsn, $user, $pw) 
     or die "Unable to connect: $DBI::errstr\n"; 
    $dbh->do("DROP TABLE IF EXISTS $table"); 
    $dbh->do("CREATE TABLE $table (column VARCHAR(17))"); 
    $dbh->disconnect; 
} 

Вы не можете использовать $_ подобное в ваших функциях. Вы должны иметь дело с @_ вместо (или используйте shift, как я). См. perldoc perlsub

+0

Ну, это определенно сделал трюк! Я думал, что где-то читал, что вы можете использовать @_, $ _ [0-inf] и $ _ взаимозаменяемо. Если я не пойму ОП на нем. [ЗДЕСЬ] (http://www.comp.leeds.ac.uk/Perl/subroutines.html) прямо в разделе «Параметры». Я вижу, теперь он имел в виду, что вы можете использовать его, но не как аргумент, переданный подпрограмме. Спасибо! – Arkevius

+0

'$ _' - это переменная по умолчанию. '@ _' - это массив по умолчанию. '$ _ [1]' является вторым элементом массива '@ _'. –

Смежные вопросы