プログラム内のINSERT文が実行されない

このQ&Aのポイント
  • プログラム内のINSERT文が実行されない原因を調査するためのツールはありますか?
  • 問題があるとしたら、プログラムの中にある可能性があります。具体的な原因が分かりません。
  • プログラムの中で実行されるSQL文が正しくない可能性があります。データベースで実行して成功したことから、問題はプログラム側にあると考えられます。
回答を見る
  • ベストアンサー

プログラム内のINSERT文が実行されない。

CGIのソース内でINSERT INTO テーブル名 SELECT文を使って行追加しているのですが、処理がエラーの場合の処理が動いてしまい実行されません。 ただ、同じSQL文をphpMyAdminのデータベースサーバーのSQLにコピペして実行すると問題なく行追加されました。 なので、問題があるとしたらそのプログラムだと思うのですが、原因がつかめません。 SQL文を変数に格納してから実行させてその結果によってエラーメッセージを出す処理は以下の通りです。 $sql = (INSERT INTO テーブル名 SELECT ****** FROM ***** WHERE ******) $ins_result = $db->prepare($sql); $num = $ins_result->execute; if ( not $num ) { &db_rollback; &db_disconnect; &msgout("エラー1","エラーメッセージ","システムエラー"); } すでに作られているプログラムを修正しています。ちなみに、そのプログラムを作った人はすでに現場にはいませんので聞けません。 msgout内に$ins_resultと$numを表示してみましたら、前者は「DBI::st=HASH(0x9f38560)」で、後者は何も入っていないつまり空でした。 【if ( not $num )】のif文も意味が分からないです。私の知識から解読すると $numの否定が真だったらカッコ内の処理を実行するという意味だと思いますが、$numは空なので空でないことが真だったらとなりますが、どういう意味なんでしょうか? プログラム内のSQL文がなぜ実行できなかったのかその原因を調べることができるツールとかあれば試すことができるのですが、データベースで実行して成功したところを考えるとあまり意味ないかもしれませんが。 過去カラム数が違ってたとか、追加データの長さが範囲外だったとかが原因だったことがありましたが今回はそのどちらでもなさそうです。

  • CGI
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
noname#251971
noname#251971
回答No.1

当方、PHPはまったく触れたことがありませんが、 一般的な観点からの回答をさせて頂きます。 まず、戻り値 $num とif文の件からですが、 $db がどんな型のオブジェクトなのか質問文からわかりませんので executeが何を返すのかを調べて見れませんが、 変数名から推測すると追加された行(レコード)数を返すのではないでしょうか? 通常、だいたいのプログラミング言語では 数値の場合 0 が 偽 でそれ以外が 真、 オブジェクトなどであれば空やnullが 偽 でなにかあれば 真、 と評価されるかと思います。 if文はnotで真偽を反転していますので、 $numが偽であればif文内を実行することになりますね。 # とはいえ、表示しても空だったということですので、 # 追加行数では無くて別のオブジェクトかもしれませんが。 次に、DBサーバーでSQLを実行して問題なく追加されたとのことですが、 これは、実行前には行が存在せず、SQL実行後に行追加されたことが確実でしょうか? または、複数回実行することでエラーが起きるなどはないでしょうか? # たとえば、SELECTの結果レコードが無く、0行追加で正常に実行終了した、 # というようなことは起きていないでしょうか。 # もしくはSQLでデータを追加済みのためプログラムでは # 一意制約や主キー制約によってエラーが出てしまう、などないでしょうか。 そのあたりも特に問題なければ、 質問文に引用されている箇所のSQL文を、 たとえばSELECT以降のみを含む内容で実行してみてexecuteの戻りに抽出結果が戻るかどうかを見てみるとか、 (SELECTを含まない)定型のINSERTを行わせてみて行追加出来るかなど、 領域を絞って問題を特定していくしかないのではないでしょうか。 ちなみに、質問分に記載のコードで、SQL文が括弧で囲んでありますが これは元コードそのままなのでしょうか? 括弧が文字列の引用符になるんでしょうか? # $sql を出力してみると意図したとおりの内容でしょうか。

関連するQ&A

  • 連続で実行するには?

    下のように、PostgreSQL に接続して insert を実行するプログラムを書いたのですが、 これらの3つのinsert 文を一気に実行してしまいたい場合、どうすればよいのでしょうか? // insert $sql = "insert into area values (1,'中央区')"; $sql = "insert into area values (2,'東区'); $sql = "insert into area values (3,'西区'); //ここより本文です。 <?php // connect $db_con = pg_connect("","","fuk_gourmet"); if($db_con == false) {print "cannot connect"; exit;} // insert (これだと一つしか実行できない) $sql = "insert into area values (1,'中央区')"; // execute $rs = pg_exec($db_con, $sql); if($rs == false) {print "execute error"; exit;} pg_freeresult($rs); pg_close($db_con); ?>

    • ベストアンサー
    • PHP
  • JDBCでのinsertについて

    JDBCを使ってDBを扱います。 データベースはPostgresqlです。 Servlet+JSP+Beanで開発しているのですが、 以下のようなinsert処理をBeanで行っています。 String sql_insert = "INSERT INTO tal_ks(cd,kbn)" + " VALUES(" + vl1 + ",'" + vl2 + "')";System.out.println(sql_insert); System.out.println("SQL文発行"); int in = stmt.executeUpdate(sql_insert); System.out.println("(SQL文発行後"); ・ ・ ・ これを行うと、例外処理には流れず 実行したかのように見えるんですが、 実際はデータがはいっておりません。 このSQLと同じものをpsqlで直接実行すると insert できました。 これは、どういうことが原因なのでしょうか? 教えていただきたいです。

    • ベストアンサー
    • Java
  • mysql insert文

    恐れ入ります。 input 送信で、perl にてレコードをinsertしたいのですが、なかなかうまくいきません。 <form action="./xxx.cgi" method="post"> <input type ="hidden" name=num></input> <input type="text" name="col1"></input> <input type="text" name="col2"></input> <input type="text" name="col3"></input> <input type="submit" value="登録"> </form> として送信して、 $sql = "insert into kensou(num,col1,col2,col3) "; $sql.="values('$form{num}','$form{col1}','$form{col2}','$form{col3}')"; # SQL実行 $sth = $db->prepare($sql); if(!$sth->execute){ print "SQL失敗\n"; exit; } で受け取ろうとしているのですが、うまくいきません。 どなたかご教授いただけないでしょうか。

  • PHP+MySQLによるINSERTについて

    質問させていただきます。 先日からPHPよりSQLテーブルへの値の追加を試しているのですが、なかなかうまくいきません。いろいろなサイトで資料を探しましたが、それでもできませんでした。 //問題個所 $sql = "INSERT INTO whatsnew(date,title,body) VALUES('.$ThisTime.','.$Title.','.$Body.')"; $result = mysql_query($sql); date、title、bodyは(dateも含め)すべてTEXTです。ちなみにエラーが出るのではなく、何事もなかったかのようになりました(直後にif(!$result){print 'INSERT Error!';}を挿入するとINSERT Error!と表示される)。 どうすればいいか教えていただければ幸いです。

    • ベストアンサー
    • MySQL
  • INSERTできません

    以下のSQL文でテーブルに追加したいのですが、実行すると 実行中のメッセージがでたまま動かなくなってしまいます。 他のテーブルで同じようなINSERT文を実行すると追加できるので SQL文の間違いではないと思うのですが、原因がわかりません。 どなたか教えてください。 INSERT INTO table (CODE_A, CODE_B, SAISYUU_KOUSIN_DATE) values('9999', '999999', TO_DATE('2005/11/0716:15:14','YYYY/MM/DD HH24:MI:SS'));

  • ファイルに記述されている複数のSQL文を一度に実行させたい

    こんにちわ。 ファイルに記述されているSQL文を、Linuxのコマンドラインなどから 実行したいと考えています。 ファイルに insert into DB_NAME(aaa,bbb,ccc) values(111,222,333); insert into DB_NAME(ddd,eee,fff) values(333,777,222); insert into DB_NAME(aaa,ttt,ddd) values(111,000,999); ... などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して なんかしらの方法で一度に実行させたいのです。 mySQLでは、このようなやり方があるのですが postgreではどのようにすればいいのか、わかりません。 どなたかご存知の方、よろしくお願い致します。 OSはLinuxです。

  • SELECT実行中にINSERTしたい

    テーブルTに対し、データ抽出に数分かかるようなSELECT文を実行しているとして、 そのSELECT文の実行中にInsertしたらどのような挙動になるでしょうか。 (INSERTした瞬間にエラーが発生する?) また、SELECT文の実行中にInsertしたら、 「SELECT文が実行終了するまで待って、そのあとにINSERTする」 という動きにしたい場合、どのように設定(or SQLを書けば?)すればよいでしょうか。

    • ベストアンサー
    • MySQL
  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • SQLite:項目が存在しない場合のみINSERT

    SQLiteのテーブル内にunique属性を持つフィールドがあります。このフィールドと同名の内容を追加するとエラーが返りますが、SQLiteを呼び出すプログラム側で逐一そのエラーを例外処理しているため、プログラムとしては効率が悪いです。「(If not exist (...) insert ...のような)もしこの項目内容が存在しなければフィールドを追加する」という処理をSQLのクエリ文で完結させたいのですが、このようなことはできますでしょうか。

  • 緊急です。insert文が実行されない

    フォームで入力された値をINSERT文でMYSQLへ保存しようとしているのですが、 以下のように記述して実行し、phpmyadminでテーブルを確認しても データが入力されておらず空のテーブルとなっています ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー <?php $SCR = $_POST['junni']; $Name = $_POST['namae']; $Day = $_POST['hiduke']; $conn = mysql_connect($url,$user,$pass); $sdb = mysql_select_db($db,$conn); $sql = "insert into `seiseki`(`name`,`day`,`score`)values('$Name','$Day','$SCR')"; $res = mysql_query($sql,$sdb,$conn); mysql_free_result($res); mysql_close($conn); ?> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 補足として、 実行後、 Warning: mysql_query() expects at most 2 parameters, 3 given in 「phpの場所とファイル名」 on line 26 Warning: mysql_free_result() expects parameter 1 to be resource, null given in 「phpの場所とファイル名」 on line 28 という表示がされます また、$conn =のあとに print ($Day"); print ($Name"); などを入れると値は表示されているため、受け渡しは問題ないかと思います また、$url,$user,$pass,$dbは、$SCR = $_POST['junni'];以前に $url = "localhost";というような形で代入しており、入力ミスなどは何度も確認しましたがありません 知識がほとんどありませんので、説明足らずかもしれませんが、 文法、入力間違いや解決策がありましたらよろしくお願いいたします

    • ベストアンサー
    • MySQL

専門家に質問してみよう