• ベストアンサー

プレースフォルダで複数の型を指定する

こんにちは。 Perl+DBIで書いています。 プレースフォルダを使う際に、複数の値を指定して、それぞれを別の型にしたい場合はどうすればよいのでしょうか? 例えば、doメソッドなどを使って、 $key=100; $name='myname'; $dbh->do("INSERT INTO table (key,name) VALUES (?,?)",?????,$key,$name); として、$keyと$nameを埋め込みたいのですが、それぞれ型が違います。 このような場合はどう記述すればよいのでしょうか?

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • uwi
  • ベストアンサー率74% (55/74)
回答No.1

bind_paramを使ってデータ型を指定します。 http://www.rfs.jp/sb/perl/dbi/06.html にわかりやすく説明されていると思います。

参考URL:
http://www.rfs.jp/sb/perl/dbi/06.html
titokani
質問者

お礼

なるほど、ひとつづつ指定するんですね。 ちょっと冗長ですが仕方ないですね。ありがとうございました。

関連するQ&A

  • perl+mysqlで変数が使えなくて困ってます。

    use DBI; $id=1; $nm="gootarou"; $mm="friend"; $user = '***'; $passwd = '***'; $db = 'DBI:mysql:***'; $dbh = DBI->connect($db, $user, $passwd); $sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); $sth -> execute; $sth -> finish; $dbh -> disconnect; exit; mysqlの勉強を始めたところでいきなり壁にぶちあたってしまいました^^; googleその他で検索かけてみましたが解決に至りませんでしたので 質問させてください。 >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); ↑ここの部分を >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ('1','gootarou','friend')"); と直接入力してやれば問題なく登録されるのですが、変数を使うと正常に処理がされません。 数字を変数に代入したものは大丈夫なのですが 英字や二バイト文字を変数に代入したものが問題あるようです。 それぞれのフォームの型はvarchar(100)で設定しています。 ループで一括処理したいのですが変数が使えないことには・・と困ってます。 よろしくお願いします。

  • mysqlデータベースにinsertできない

    こんにちは。 現在、perlでmysqlにデータをinsertしているのですが、ある記号があった場合、挿入することが出来ません。 以下のようにしたところ、もし$titleや$komentoに「'」があった場合、insert文のシングルクオートと引っかかってるみたいです。 $dbh->do(qq|insert into suredo values ('$no','$title','$koment')|); そこで、今度は $dbh->do(qq|insert into suredo values ("$no","$title","$koment")|); とした場合、今度は「"」があった場合ダメみたいです。 このような場合、「’」や「”」があってもinsertできる様にするにはどのようにしたらよろしいのでしょうか? どのたかよろしくお願いします。

    • ベストアンサー
    • Perl
  • 日付型の0000-00-00をなんとかしたい

    MySQLでDBを作っています。 -------------------------- | ID | name | date | -------------------------- |char(2)| cahr(4)| date | -------------------------- こういったDBです。 登録はPerlからなんですが、以下のプログラムで行うと dateが正確に入力されないときに0000-00-00で登録されてしまいます。 $statement = insert into table (id, name, date) values (?, ?, ?); @bind_values = ($FORM{id},$FORM{name},$FORM{date}}); $rv = $dbh->do($statement, \%attr, @bind_values); この後に0000-00-00をNULLでUPDATEすれば解決なんですが もっと良い方法は無いでしょうか? よろしくお願いします。

  • オラクル10で、perlのプレースフォルダーで日付型のデータを入れようとしていますがどのようにすればよいのでしょうか

    オラクル10で、perlのプレースフォルダーで日付型のデータを入れようとしていますがどのようにすればよいのでしょうか? オラクルのSYSDATE値と名前をインサートしたいのですが 以下の、[]の2つの部分がかわりません。 REGはDATE型です。 [オラクルのSYSDATE値の取得する] my $datetime = [オラクルのSYSDATE値をセットする]; my $sql = qq{insert into TEST (REG, NAMAE) VALUES (?, ?)}; my $sth = $dbh1->prepare( $sql ); $sth->bind_param(1, $datetime ); $sth->bind_param(2, "山田" ); $sth->execute(); よろしくお願いいたします。

  • 指定した条件の組み合わせのSQL文

    SQLite バージョン3.7.10 を使用しています。 以下のようなテーブル構造で、 「t1」テーブルの全ての行と 「t6」テーブルのdateカラムの年の部分を グループ化して全ての組み合わせの 「t6」テーブルのamount の合計を出力したいのですが、 どのようなSQL文を書けば良いのでしょうか? 例えばこのデータ内容なら、以下のような結果が得たいです。 +------+-------+-------+ | year | t1_name | 合計 | +------+-------+-------+ | 2011 |t1_name1|  5000| +------+-------+------+ | 2012 |t1_name1| 10000| +------+-------+------+ | 2012 |t1_name2| 45000| +------+-------+------+ PRAGMA foreign_keys = ON; DROP TABLE IF EXISTS t6; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t6 ( no INTEGER PRIMARY KEY AUTOINCREMENT, t1_key TEXT NOT NULL, date TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE ); CREATE INDEX date on t6(date); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2011-01-01', 5000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2012-01-01', 10000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-01-01', 15000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-02-01', 30000); http://ideone.com/I1mMba

  • 指定された趣味を持つメンバーがいるグループを抽出するSQL

    グループテーブル、メンバーテーブル、趣味テーブルの3つのテーブルがあります。 あるメンバーはあるグループに属しており、趣味を1つ持っています。 以下がそのSQLです。 CREATE TABLE groups ( g_id int primary key ); CREATE TABLE members ( m_id int primary key , g_id int , h_id int ); CREATE TABLE hobbies ( h_id int primary key, h_name text ); INSERT INTO groups VALUES ( 1 ); INSERT INTO groups VALUES ( 2 ); INSERT INTO groups VALUES ( 3 ); INSERT INTO members VALUES ( 1, 1, 1); INSERT INTO members VALUES ( 2, 1, 3); INSERT INTO members VALUES ( 3, 1, 4); INSERT INTO members VALUES ( 4, 1, 4); INSERT INTO members VALUES ( 5, 2, 1); INSERT INTO members VALUES ( 6, 2, 2); INSERT INTO members VALUES ( 7, 2, 3); INSERT INTO members VALUES ( 8, 3, 2); INSERT INTO members VALUES ( 9, 3, 3); INSERT INTO members VALUES ( 10, 3, 4); INSERT INTO hobbies VALUES ( 1, 'sports' ); INSERT INTO hobbies VALUES ( 2, 'music' ); INSERT INTO hobbies VALUES ( 3, 'book' ); INSERT INTO hobbies VALUES ( 4, 'drive' ); 指定された趣味を持つメンバーがいるグループを抽出するにはどうすればいいでしょうか? 例えば、「読書が趣味なメンバーとドライブが趣味なメンバーがいるグループは?」「グループ1とグループ3」のような感じです。 一応自分で考えてみたのが、以下ですが、これだと趣味の指定が増減すると大きくSQLが変わってしまいます。 もっといいやり方はないでしょうか? 私はPostgreSQL8を使ってますが、汎用的なSQLであれば、そっちの方がいいです。 SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'drive' INTERSECT SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'book';

  • DBD::mysqlで「表」という文字をテーブルへインサートしたい

    お世話になります。 環境は windows2000pro perl 5.8.8 mysql 5.0.22 です。 mysqlの文字コード関連の設定はmy.iniにてsjisに統一してあります。 DBIを使って、perlスクリプトからmysqlのテーブルへ「表」という文字をインサートしようとするとエラーになります。mysqlクライアントからならちゃんと「表」もインサートできました。 エラーは以下のようになっています。 「 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表 」 とにかくインサートしようとする文字列の最後の文字が「表」なら同様のエラーになります。 「表示」なら問題なくインサートできます。表の2バイト目が5cなのがまずいと思うのですが、どう対処すればよいかわかりません。 ヒントを下さい。よろしくお願いします。 ----- use strict; use DBI; use Encode qw(from_to); my $str = "表"; from_to($str,'utf8','shiftjis'); eval { my $dbh = DBI->connect( 'dbi:mysql:test,hostname=localhost', 'root','bnogl399',{ RaiseError => 1, PrintError => 0}); $dbh->do("set names sjis"); $dbh->do("use mydb"); $dbh->do("insert into foo values (3, " . $dbh->quote($str) . ")"); $dbh->disconnect(); }; print $DBI::errstr if $@;

  • PerlでSQLiteのデータテーブルを作成し

    PerlでSQLiteのデータテーブルを作成し、作成したテーブルへデータを追加するようにしたいのですが、 下記のように作成し、実行すると、 テーブルの作成のみ、もしくは、既存のテーブルへのデータの追加のみは可能なのですが、 両方処理させると、テーブルの作成のみされて、作成されたテーブルの中身はカラのままです。 #データベースに接続 $dbh = DBI->connect("dbi:SQLite:dbname=c:\\database\\tyumon.db"); open (DATA,"c.dat"); $data = <DATA>; close(DATA); $data = $data+1; $table = "user"; $table .= $data; #テーブル作成実行 $hst = $dbh->do("CREATE TABLE '$table'(name text,area text,tel text,mail text,jikan text, hoka text)"); #レコードの追加(INSERT文の実行) $st = $dbh->do("insert into '$table' values('$data','$name','$area','$tel','$mail','$jikan','$hoka')"); 「c.dat」には、カウントされた数字が入っています。 テーブル名は「user」+カウント数字で作成しています。 データベースと、CGIの勉強を兼ねて作成しているもので、 根本的な間違いなどあるかもしれません。 どなたか、ご指摘いただければ幸いです。

    • ベストアンサー
    • CGI
  • データベースの設計について

    現在PostgreSQL(ver 8.4)を使ってちょっとしたシステムの構築を計画していますが、データベースの設計に関して広くアドバイスを頂きたいです。 ユーザーの入力データをDBで効率よく管理したいと考えています。 例えば、次のようなテーブルを作るとします。 userテーブル id | name ---+------------- 1 | 山田太郎 2 | 高橋次郎 .. | ............. .. | ............. emailテーブル id | address ---+------------------------------ 1 | yamada@mail.com 2 | takahashi@mail.com .. | ................................. .. | ................................. この様な複数のテーブルにユーザーの入力を受け、1対1に対応するIDを振って名前やアドレスなどのデータをリアルタイムで挿入していく場合、どのようなテーブルを用意し、プログラムを組むのが適切なのでしょうか? 具体的には、PerlでCGIをつくり、ブラウザ上などからユーザーの入力したデータを取得してPostgreSQLに次々挿入していく形にしようとしています。 具体的なPerlのコードを書いていただけると助かるのですが、他の言語のコードでも一向に構いません。 今のところ、自分で考えたものとしては、 create table user( id serial, name text); create table email( id serial, address text); とテーブルを用意し、 Perlコードの概要は use DBI; # *実際にはユーザーの入力値から値を得る $input_user = 'name_hogehoge'; $input_email = 'address_hogehoge@mail.com'; # DBとの接続 $dbh = DBI->connect("dbi:Pg:dbname=hogehoge", ......); # プレースホルダの準備 $sth_user = $dbh->prepare("INSERT INTO user (name) VALUES(?)"); $sth_email = $dbh->prepare("INSERT INTO email (address) VALUES(?)"); # SQLの実行 $sth_user->execute("$input_user"); $sth_email->execute("$input_email"); # コミット $dbh->commit; といった感じで考えていました。しかしidの対応が確実に取れるかなど不安な点がありますので、アドバイスいただけたらと思います。 もちろんこの方法に固執する必要はなく、結果的に同じようなテーブルが得られれば問題ないです。 長々と失礼致しました。

  • PerlからSQLiteをうまく扱えません

    以下のような感じで、 Perlから、SQliteのデータベースと、そのテーブルを作成し INSERTさせてみるのを組んでみたのですが うまく行かないようです・・・。 何が原因なのかどうすればうまくいくのか、教えていただけないでしょうか。 よろしく御願いします。 #!/usr/bin/perl use DBI; $dbfilename = "./testdb"; &dbcon; $sth = $db->prepare("INSERT INTO user VALUES(\'1\',\'abc\')"); $sth->execute; $sth->finish; &dbuncon; exit; sub dbuncon { $db->disconnect; } sub dbcon { $makedbflag = '0'; unless (-f $dbfilename) { $makedbflag = "1"; } $db = DBI->connect("dbi:SQLite:dbname=$dbfilename","","",); if($makedbflag eq "1") { &dbmaketable; } } sub dbmaketable { $sql = "CREATE TABLE user (id, name);"; $db->do($sql); }

専門家に質問してみよう