普段PHPerなんですがbatchの関係でperlを使用しなければならなくなり書いていたんですが、
下記のソースコードの中でINSERT INTOの部分でエラーが発生してしまいます。
最初selectしている部分はcreate tableで作っているテーブル構成と同じです。
それからサイト名に関するレコード部分は*で隠しています。
よろしくお願いいたします。
#!/usr/bin/perl
use DBI;
# データソース
$d = 'DBI:mysql:a_anime';
# ユーザ名
$u = '************';
# パスワード
$p = '************';
# データベースへ接続
$dbh = DBI->connect($d, $u, $p);
$sth = $dbh->prepare("select * from tweet where tweetid BETWEEN '1' AND '21562745' limit 5");
$sth->execute;
while( @row = $sth->fetchrow_array ){
$priduct_id = @row['3'];
$user_url= @row['6'];
$sth2= $dbh->prepare("show tables from a_anime like 'tweet_@row['3']'");
$sth2->execute;
@row2 = $sth2->rows;
$sth2->finish;
if (@row2 != 1){
$sth22= $dbh->prepare("CREATE TABLE `tweet_@row['3']` (
`id` int(255) NOT NULL auto_increment,
`userid` int(25) DEFAULT NULL,
`text` text NOT NULL,
`product_id` int(255) NOT NULL,
`product_name` varchar(30) NOT NULL,
`date` varchar(20) NOT NULL,
`user_url` varchar(160) NOT NULL,
`username` varchar(100) NOT NULL,
`flag` int(1) NOT NULL DEFAULT '1',
`rev_point` int(1) NOT NULL DEFAULT '1',
`t_tweetid` bigint(255) DEFAULT NULL,
`rev_id` int(10) DEFAULT NULL,
`rev_flag` int(1) NOT NULL DEFAULT '0',
`*****_flag` int(1) DEFAULT NULL,
`res_info` int(100) DEFAULT NULL,
`fav_info` int(255) DEFAULT NULL,
`user_img` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index3` (`flag`),
KEY `user url` (`user_url`),
KEY `t_tweetid` (`t_tweetid`),
KEY `index4` (`flag`,`rev_point`,`product_id`),
KEY `index5` (`flag`,`product_id`),
KEY `index6` (`userid`,`flag`),
KEY `index7` (`username`,`flag`),
FULLTEXT KEY `index2` (`text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8");
$sth22->execute;
$sth22->finish;
}
$sth3= $dbh->prepare("select user_url from tweet_@row['3']");
$sth3->execute;
print "@row['3']\n";
print "@row['6']\n";
@row3 = $sth3->fetchrow_array;
$sth3->finish;
#if ($user_url != $row3){
print @row['2'] ;
print "\n";
$sth4 = $dbh->prepare("INSERT INTO tweet_@row['3'] VALUES (@row['1'],@row['2'],@row['3'],@row['4'],@row['5'],@row['6'],@row['7'],@row['8'],@row['9'],@row['10'],@row['11'],@row['12'],@row['13'],@row['14'],@row['15'],@row['16'])");
print $sth4;
print "\n";
$sth4->execute;
$sth4->finish;
}
}
$sth->finish;
$dbh->disconnect;
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
@row['1'] みたいな表記がたくさんありますが、Perlでは
@row : 配列 row 全体のリスト
@row['1'] : 配列rowの一部を抜き出したリスト (スライス)
$row['1'] : 配列の添字'1'の要素(スカラー)
となります。また'1'とは書きましたが、文字と数値の区別が曖昧なため可能な表記で、普通は、引用符無しに
$row[1]
等と書きます。
Perl で気を付ける点として「コンテキスト」というものがあります。
同じ関数やメソッドが、リストのコンテキストとスカラーのコンテキストで違う動作になります。
詳しくは長くなるので、下のURLや「リスト スカラー コンテキスト」で検索したりしてください。
http://perldoc.jp/docs/perl/5.10.0/perldata.pod
@row2 = $sth2->rows;
これは、$sth2->rows;が返すのは、スカラー値です。
http://perldoc.jp/docs/modules/DBI-1.612/DBI.pod
これを @row2 に代入すると、要素数1のリストになります。
if (@row2 != 1){
上記のように @rowsは常に要素数1のリストです
この比較は、スカラーのコンテキストとなるので、 @row2 は 「@row2の要素数」 となります。つまり1です。
ということは、@row2 != 1は$sth2->rowsの結果にかかわらず、常に偽となります。
@row3 = $sth3->fetchrow_array;
#if ($user_url != $row3){
Perlでは
@row3 : リストrow3
$row3[0] : リストrow3の要素
は関係がありますが、同じプログラム中にある
$row3 : スカラー変数row3
はリストrow3とは独立したものになります。
また、PHPで使われているような比較演算子(==,!=,<.>等)は、「両辺を数値と見做して比較する」というものです。
文字列比較には専用の比較演算子( eq,ne,gt等)を使います。
http://perldoc.jp/docs/perl/5.18.1/perlop.pod
$sth4 = $dbh->prepare("INSERT INTO tweet_@row['3'] VALUES (@row['1'],@row['2'],
Perlの配列の添字は0から始まります。 (変更もできますが、普通はやりません)
$row[0]は不要なのでしょうか?
また、これらの値に文字列は無いのでしょうか?
文字列を自動でクオートなどはしません。sqlインジェクションの危険もあります。
内容を確認するのなら
$sql="INSERT INTO tweet_$row[3] VALUES ($row[1],$row[2],$row[3],$row[4], ..
print $sql . "\n" ;
などとすればよいでしょう
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- MySQL MYSQL エラー 2 2022/10/18 11:37
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Can't use string ("0") as an ...
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
VBのReturnの使い方
-
DoEventsが必要な理由について
-
クラスに配列を渡す方法
-
pythonでファイルのコメント行...
-
DOSコマンドのループ内のTIMEコ...
-
For文を使った九九表の作成
-
VBAで3秒だけ時間を止めたい
-
英語でのシャープとコメの呼び...
-
vbscriptでIE自動入力(途中で...
-
ループ内での条件処理
-
CSVファイルの特定の行だけを読...
-
GIFアニメをループさせたくない
-
VBA横データを縦にしたいです
-
vb.netからエクセル関数書き込み
-
VBScript 配列
-
エクセル関数で1〜12の数字がル...
-
vb.netです。2次元配列の要素を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Can't use string ("0") as an ...
-
行指向処理でデータの読み込み...
-
サンプルの意味
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
VBAのautofilter、criteriaの配...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
ハッシュ検索はなぜ速い
おすすめ情報