- 締切済み
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"; なぜでしょう… 検索しても全く原因がわかりませんでした。 分かる方いらっしゃいましたらご回答いただければ幸いです。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- _--_1l1_1_
- ベストアンサー率67% (102/152)
テーブル上でメール部分は文字列で定義していると思いますが、 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;