• 締切済み

DBIでメールアドレスにマッチさせてselect

質問させてください。 PERL、DBI、MYSQL5でメールアドレスにマッチさせてデータを呼び出したいのですが動きません。 下記の(1)では動くのですが、(2)になるとダメになります。 ■(1) #$noには'1'が入っています。 my $query = "select * from TABLE_NAME where no = $no "; ■(2) #$mailには'test@test.com'が入っています my $query = "select * from TABLE_NAME where mail = $mail"; SQL文以外の部分は過去正常に動いているので問題無いと思います。 今回メールアドレスでwhereするというのが初めてですので、 なにかその部分でダメになっているのではと考えています。 ちなみに直接書いた場合(以下)は正常に動きます。 my $query = "select * from TABLE_NAME where mail = test\@test\.com"; なぜでしょう… 検索しても全く原因がわかりませんでした。 分かる方いらっしゃいましたらご回答いただければ幸いです。 よろしくお願いします。

みんなの回答

回答No.1

テーブル上でメール部分は文字列で定義していると思いますが、 SQL ではシングルクォー テーションでくくったものが文字列となります。つまり、 select * from TABLE_NAME where mail = 'test@test.com'; という SQL を渡さなければなりません。 (以下、表示がくずれるの 1 バイトのスペースを全角のスペースにしていることに注意) #!/usr/bin/perl use strict; use warnings; use DBI; my $db_name = 'sqlite_test.db'; unlink $db_name; my $dbh = DBI->connect(   'dbi:SQLite:dbname=' . $db_name,   '', '',   {  AutoCommit => 0,     RaiseError => 1   } ) || die "$db_name : $!"; my $sql; my $table = 'user_info'; print '--- Create Table', "\n"; $sql   = 'CREATE TABLE '   . $table   . '(id integer primary key, name string, mail string)'; $dbh->do($sql); $dbh->commit; my $sth; print '--- Insert Record', "\n"; $sth = $dbh->prepare(   'INSERT INTO ' . $table . '(id, name, mail) VALUES (?, ?, ?)' ); $sth->bind_param( 1, '1' ); $sth->bind_param( 2, 'user' ); $sth->bind_param( 3, 'user@xxx' ); $sth->execute; $dbh->commit; print '--- Select Record', "\n"; my $mail    = 'user@xxx'; my $quote_mail = $dbh->quote($mail); $sql = "select * from $table where mail=$quote_mail;"; print $sql, "\n"; # select * from user_info where mail='user@xxx'; $sth = $dbh->prepare($sql); $sth->execute; while ( my $ref = $sth->fetch() ) {   for my $array_ref (@$ref) {     print "$array_ref\n";   } } $sth->finish(); $dbh->disconnect; unlink $db_name;

関連するQ&A