10代と話して驚いたこと

質問させてください。
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";


なぜでしょう…
検索しても全く原因がわかりませんでした。
分かる方いらっしゃいましたらご回答いただければ幸いです。

よろしくお願いします。

A 回答 (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;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報