助けてください、お願いします。
phpadminで管理しているmysqlのDBへ、perlのDBIモジュールを使ってレコードの追加(INSERTINTO)をやっても、phpadminでDBをみてみると追加されていません。
DBIを組み込んだCGIを実行してみてもエラーはでないのですが、DBへの追加ができていません。
色々とやってみたのですが、どうしても追加ができません。考えられる要因があれば教えてください、お願いします。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect('DBI:mysql:データベース名:サーバホスト','ユーザ名','パスワード') or die $DBI::errstr;
$sthandler = $dbh->prepare("INSERT INTO `table名` (`姓`, `名`, `メールアドレス`, `年齢`) VALUES ('名字', '名前', 'mailaddress', '0')");
$sthandler->execute;
$sthandler->finish();
$dbh->commit;
$dbh->rollback;
$dbh->disconnect;
本当に困っています。どうかお助けください。
No.2ベストアンサー
- 回答日時:
こんにちは。
1.データベースとの接続はちゃんとできている。
2.SQL文ではこけていない。
という前提で・・・、
# DBIモジュールの読み込み
use DBI;
# 接続
$dbh=DBI->connect('DBI:mysql: 略');
# INSERT文発行
$sth = $dbh->prepare("INSERT INTO 略");
# SQL実行
$sth->execute;
# 開放
$sth->finish;
# AUTO COMMITがOFFの場合はCOMMITが必要
$dbh->commit;
# 切断
$dbh->disconnect;
の順番でいいはずですよ。
(^^ゞ
この回答への補足
お返事ありがとうございますtaka451213さん。
言われてとうりにやってみたのですが、やはりテーブルへの追加ができません。追加だけでなく削除などもやってみましたが、やはりDBに変化はありませんでした。接続がうまくいってないのでしょうか?
use DBI;
$dbh=DBI->connect('DBI:mysql: 略');
$sth = $dbh->prepare("INSERT INTO 略");
$sth->execute;
$sth->finish;
$dbh->commit;
$dbh->disconnect;
の下に
print "成功";
と書いていて、それはちゃんとブラウザで表示されます。エラーメッセージは出てきません。
それでもCGIを実行してもDBには全く変化ありません。
本当に何がいけないのかわかりません。どんな初歩的なものでもかまいませんので、考えられるミスを教えてください。徹底的に検証してみたいと思います。
それと僕はレンタルサーバで提供されてるphpmyadminというDB管理ツールを使っているわけですが、「リレーション機能を動かすためのリンクテーブルが有効になっていません。」と出てきました。何か関係があるのでしょうか?
perlでのDB操作は初めてで、わからないことが多く迷惑をおかけします。
僕はHTMLフォームから受け取った名前などDBのテーブルに追加するというのが、今の所の目標です。
どうかお助けください。お願いします。
No.4
- 回答日時:
こんばんは。
うーん、おかしいところは特にないですねぇ。
SQLは怪しそうですが・・・。
INSERT文自体は問題ないんですよね?
(ダブルコーテーションの内側だけをコンソールから流したら、INSERTされますよね?)
後はエラーですが、「500Internal Server Error」なんですよね?
これもちょっと変かなぁ・・・。
>>データベースをperlから操作するために、学ぶべきいいサイトがあればぜひ教えてください。お願いします。
これがなかなか・・・。
どこも似たような内容ですよ。
logicalpinkyさんの場合は、記述は間違ってないので、ほかの所を疑った方がいですよ。
あんまりアドバイスできなくてすみません・・・。
(^^ゞ
こんにちはtaka451213さん。
解決しました!!
しかし、これが不思議なんです!!
「追加はされないが、エラーがでない」ソースを、エディタにコピペして、SELECTなどにソースを変更してエラーが出たら、その変更したソースを全部消して、エディタから「追加されないが、エラーがでない」ソースを持ってきて全文貼り付けしてから、「よし、一応エラーは出ないが、追加はされない状態に戻したぞ。さてまた考えるか。」といった作業を、ここ2週間繰り返していたのです。
そして今日、またエラーが出るようになり、いつもどうり「また、エラーは出ないが、追加もされない状態に一応戻しとくか。」とエディタからソースをもってきて貼り付けたのです。(僕はエラーが出る状態のままにして、眠りにつくのが嫌なんです。)
すると!!画面確認のためCGIを実行したら、DBに値が追加されたのです。
もう何がなんだかわかりません。今だにどうして追加されなかったかわかりません。原因不明です。
ともあれCGIがちゃんと働いてくれるようになったので、感謝の言葉をお伝えします。
ありがとうございました。
初心者である僕に、何度もアドバイスをくれたことを感謝します。
またわからないことが出てきたときは、またよろしくお願いします。
本当にありがとうございました。
No.3
- 回答日時:
こんにちは。
>>接続がうまくいってないのでしょうか?
SELECT文で、データの取得はできているのでしょうか?
CGIで取得したデータ(1つでいい)をHTMLに書き出してみてください。
後は変数の中を書き出して、その時に何が入っているかを見てみましょう。
どこがおかしいかは、切り分けないとわからないので・・・。
手間がかかりますが、やってみてください。
(^^ゞ
この回答への補足
こんにちはtaka451213さん。
あるサイトのソースコードをみて下のようにやってみました。
use DBI;
print "Content-type: text/html\n\n";
print "<html><body>test => ";
$dbh=DBI->connect("DBI:mysql:データベース名:ホスト名", "ユーザ名", "パス") || die $DBI::errstr;
if(!$dbh){
print "接続失敗\n";
}else{
print "接続成功\n";
# INSERT文発行
$sth = $dbh->prepare("INSERT INTO '顧客リスト' ('姓','名','メールアドレス','購入回数') VALUE ('田中','太郎','mailaddress','0')");
#実行
$sth->execute;
# 開放
$sth->finish;
# AUTO COMMITがOFFの場合はCOMMITが必要
$dbh->commit;
# 切断
$dbh->disconnect;
}
print "</body></html>\n";
とやってみると、接続成功とでました。接続はうまくいってるということですかね??いぜんDBに追加はされませんが・・・。
INSERTの部分をSELECTに変えてやってみたのですが、500Internal Server Errorになります。多分SELECTの文法が間違っているのだと思います。色々なサイトを見てやってみたのですが、SELECTは、いまいちよくわかりません。
今はフォームから値を受け取るのではなく、はじめからCGIの中に上のソースのように値をいれて状態で、ブラウザ上(アドレスのところにURLを入れて)から実行しています。
SELECT自体、自信がないので何とも言えません。
データベースをperlから操作するために、学ぶべきいいサイトがあればぜひ教えてください。お願いします。
No.1
- 回答日時:
こんにちは。
finishしてからcommitしてrollbackしてるんですか???
(^^ゞ
この回答への補足
お返事ありがとうございます。
データベースへのDBI操作がはじめてで、うまくいきません。上のソースをcommitしてrollbackして、finishしても、テーブルに追加されませんでした。
色々なwebページの通りにやってみたのですが、どうしてもできなくて本当に困っています。
だれかよろしければ、DBIを使ったデータベース接続から、レコード追加して、接続遮断までの方法を教えてください。お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- PHP php エラー 2 2022/10/23 16:43
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- フリーソフト 色々な形式の個人情報を後で参照しやすいようWindow10で管理したいのですが、どんな方法があるの? 1 2023/04/29 16:46
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLにリモートホストから接続...
-
perlのDBIからmysqlにINSERTINT...
-
ACCESSとXサーバーをODBCで接続...
-
cseの使い方について
-
接続ができません
-
参考書に従って入力したつもり...
-
ODP.NETのバージョン確認
-
INT型は金額の型に使用するべき...
-
VBAで変数内に保持された二次配...
-
文字化けが解消できません…MySQ...
-
SQLiteについて
-
LIKE で清音と濁音・半濁音を区...
-
insertでのエラーについて
-
PHPのサンプルコードが意図した...
-
旧filemakerで和暦(令和など)...
-
テーブル作成でエラーが出てき...
-
root@localhostを消してしまった
-
MySQL Connector C++について
-
MySQLカラム名は日本語と英数字...
-
副問合せにLIKE文を使う方法は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLにリモートホストから接続...
-
ポート3306へつながらず、MySQL...
-
Puttyでサーバー上のMySQLを操...
-
MySQL sleep が溜まる
-
mySQLでエラーが出ます。
-
mysql_close();の必要性について
-
ログイン履歴について
-
MySQLに外部PCから接続できない
-
ACCESSとXサーバーをODBCで接続...
-
perlからMySQL5に接続できません
-
MySQLでエラーがでて前に進めま...
-
クエリー実行中に強制終了した場合
-
localhostで接続できない!
-
DBから取得した値を加工して別...
-
MySQLサーバのコンピュータ名変...
-
mysqlにドメインで接続できない。
-
外部からのMYSQLへの接続方法と...
-
max_sp_recursion_depthを設定...
-
Mysqlのサーバーを立ち上げる方法
-
MySQLのリモート接続
おすすめ情報