dポイントプレゼントキャンペーン実施中!

CGIからデータベースにデータを登録したいのですが。。

ブラウザ(文字コードはUTF-8)からデータをCGIで取得し、そのデータをMySQLに登録したいと考えています。

このようにしています。


$sth = $db->prepare("
INSERT INTO tbl (hiduke,code,namae,suryo,biko,sakuseibi,kosinbi)
    VALUES($hiduke,$code,$namae,$suryo,$biko,$sakuseibi,$kosinbi)
");
$sth->execute;


$biko の部分にはデータが入ったり入らなかったりします。

この$bikoにデータが入っているときは、ちゃんとテーブルに登録されるのですが、
空の場合はテーブルに登録されないのです。

試しに、このようにしてみると

$sth = $db->prepare("
INSERT INTO tbl (hiduke,code,namae,suryo,biko,sakuseibi,kosinbi)
VALUES($hiduke,$code,$namae,$suryo,'',$sakuseibi,$kosinbi)
");
$sth->execute;


bikoの部分が空でちゃんと登録されます。

テーブル定義もbikoの部分はNULL値OKにしてあります。

bikoのデータ型がTEXTでもVARCHARでもダメです。


どうしてなのかわっぱりわからず、ここ数日、ずっと悩んでおります。


テーブルに登録するコードの直前で、$biko='';

としても登録されません。。


わかりづらい質問かと思いますが、ご不明点がございましたら
ご質問ください。

よろしくお願い致します。

A 回答 (2件)

プレースホルダを使う or 変数をクォートで囲む


でどうでしょうか?
    • good
    • 0
この回答へのお礼

kuroizellさん

ありがとうございました!!!!

ここ数日、ずっとこれで悩んでいまして、ホントに泣きそうでした!!!

シングルクォーテーションで囲んだらテーブルにデータが入りました!!

これは何ででしょう??

変数の名前をそのまま入れているようなイメージがありますが、、、


あと、データは入ったのですが、文字化けしたテキストデータが入っていました。。。

これはどのように対処すればよろしいでしょうか?

重ね重ね申しわけございませんが、教えてください!!

お礼日時:2010/05/12 17:35

すでに回答がありますが、プレースホルダでやると以下のようになります。


データが入らないところは、undef を入れます。

(表示がくずれるので、スペース2文字を全角空白で書いています)
use strict;
use warnings;
use DBI;

# DB Name
my $db_name = 'sqlite_test.db';
unlink $db_name;

print '--- Connect DB', "\n";
my $dbh = DBI->connect( 'dbi:SQLite:dbname=' . $db_name,
  q{}, q{}, { RaiseError => 1 } )
  || die "$db_name : $!";

my $sql;
my $table = 'user_info';

print '--- Create Table', "\n";
$sql = "CREATE TABLE $table (id integer primary key, name varchar NULL)";
$dbh->do($sql);

my $sth;
print '--- Insert Record', "\n";
$sth = $dbh->prepare( 'INSERT INTO ' . $table . '(id, name) VALUES (?, ?)' );
$sth->bind_param( 1, '1' );
$sth->bind_param( 2, 'AAA' );
$sth->execute;

$sth->bind_param( 1, '2' );
$sth->bind_param( 2, undef );  # NULL
$sth->execute;

print '--- Select Record', "\n";
$sql = 'select * from ' . "$table" . ';';
print $sql, "\n";
$sth = $dbh->prepare($sql);

print '--- fetchrow_hashref', "\n";
$sth->execute;
while ( my $row_hashref = $sth->fetchrow_hashref() ) {
  my $id  = $row_hashref->{id};
  my $name = $row_hashref->{name};
  $id  = 'NULL' if !defined $id;
  $name = 'NULL' if !defined $name;
  print "id:$id name:$name", "\n";
}
    • good
    • 0
この回答へのお礼

_--_1l1_1_さん

ご親切にプログラムまで書いてくださってありがとうございました!!

ですが、、私には難しすぎて理解ができないです。。。(泣


SQL文でDBと接続しているんだなー。。というのはわかるのですが、、

文字化けの対処をしているのはどの部分なのでしょうか。。。

良かったら教えてください!!

お願いします!!

お礼日時:2010/05/14 16:42

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