• 締切済み

phpでのPostgresqlの配列型カラムへのinsert文の書き方

postgresql 7.0.2,スクリプト言語php4.12で請求書作成のデータベースを作っています。 データベースのカラムが配列型のものが複数あり、フォームから受け取った配列の値を インサートする方法がわからなくて悩んでいます。 for($i=0;$i< count(@$_POST["sum"]);$i++ ) { $summary[] = $_POST["summary"][$i]; $num[] = $_POST["num"][$i]; $tanka[] = $_POST["tanka"][$i]; sql = "insert into seikyu (summary,num,tanka) values('{$summary}','{$num}','{$tanka}')"; だと Warning: PostgreSQL query failed: ERROR: array_in: Need to specify dimension とエラーになります。 どういうSQL文を書けばよいのでしょうか?

  • irirs
  • お礼率50% (1/2)
  • PHP
  • 回答数2
  • ありがとう数3

みんなの回答

  • jxt
  • ベストアンサー率48% (42/86)
回答No.2

> ワーニングの内容は同じですが、ループ内で > $echo "$summary[$i]"; > という行をいれてみると$sumの値が表示されるのでループ内で配列の要素を文字列として > 扱えていると思うのですが。 ワーニングが出る箇所は$sqlをpg_queryしているところですよね。 ループの中にはそれらしき行が見あたりませんけど、どこで クエリを発行してます? あと、$sqlをechoしてみるとどうなりますか?

  • jxt
  • ベストアンサー率48% (42/86)
回答No.1

$summary,$num,$tankaは全て配列ですよね。一度printなり echoをしてみるとわかりますが、配列を文字列として 出力しようとするとPHPでは"Array"という文字列になって しまいます。つまりこれらの変数は配列であり、文字列 型ではないのでそのままでは使えませんよ、と。 配列の各要素は文字列なので、そちらを使う必要があります。 sql = "insert into seikyu (summary,num,tanka) values('{$summary[$i]}','{$num[$i]}','{$tanka[$i]}')"; これをループの中で発行してみてください。

irirs
質問者

お礼

ご指摘ありがとうございます。 if(count($_POST) > 0) { for($i=0;$i< count(@$_POST["summary"]);$i++ ) { $summary[] = $_POST["summary"][$i]; $summary_sub[] = $_POST["summary_sub"][$i]; $num[] = $_POST["num"][$i]; $tanka[] = $_POST["tanka"][$i]; $sum[] = $_POST["sum"][$i]; $sql = "insert into charge (summary,tanka,num,sum) values ('{$summary[$i]}','{$t anka[$i]}','{$num[$i]}','{$sum[$i]}' )"; } } exit; と書き換えました。ワーニングの内容は同じですが、ループ内で $echo "$summary[$i]"; という行をいれてみると$sumの値が表示されるのでループ内で配列の要素を文字列として 扱えていると思うのですが。

関連するQ&A

  • PostgreSQL へのINSERTについて

    度々失礼します。 現在、入力フォームからの新規データをPostgreSQLに登録する仕組みを作成しています。 そこで、リストボックスから選んだ複数のデータをPostgreSQLに入力したいのですが、配列ではなく1つのデータなら $in_hair=$_POST["inp_hair"]; //table_hairに登録 $sql =""; $sql .="INSERT INTO table_hair"; $sql .=" VALUES('$in_store_cd',"; $sql .=" '$in_hair')"; $result=pg_exec($sql); if ($result == false) { printf("SQL:\"$sql\"の実行に失敗しました。"); exit; } で、出来ますが、配列となると、上のコードを配列された数だけ作成し、また、$in_hairをその数だけ1つ1つ入れていかなければならないと思います。 その際の、特にコードの書き方が良く分かりません。 また、何か他に良い方法も思いつきません。 お手数ですがどなたかご教授ください。 よろしくお願いします。 phpは4.2です。

    • ベストアンサー
    • PHP
  • PHPのPostgresql インサート処理

    PHPである携帯用アプリを作成しています。 ユーザ登録処理画面でパソコン上からDBにインサートすると成功するのに携帯からだとDBエラーになります。 インサートする項目は10項目あります。 エラー文は以下です。 Warning: pg_exec(): Query failed: ERROR: parser: parse error at ornear "," at character27 . in /~path名(セキュリティ上書きません) 他の処理でインサート項目が1つだとインサートが成功します。 原因がどうしてもわかりません。 Postgresqlの規約があるのでしょうか?それとも携帯での規約でしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • php経由でpostgresqlにdate型カラムにNULLを入れるには

    psqlのコマンドからは INSERT INTO table VALUES (NULL); でdate型のカラムにNULLを入れられるようですが、 PHPで以下のようにしてもその下にあるエラーが出ます。 if(empty($date)){ $date = 'NULL'; エラーを回避してdate型カラムにNULLをいれる方法を 捜しています。 Warning: PostgreSQL query failed: ERROR: Bad date external representation 'NULL' PHP4.1 POSTGRES7.0 の環境です。

    • 締切済み
    • PHP
  • PHPのデータベース(postgresql)への保存

    いま日記機能付カレンダーを作成しています。 データベース(postgresql)に接続までできているのですが、保存ができません。エラーが出ている部分は--- $sql = "INSERT INTO DIARY_MASTA       VALUES('".$DIARY_DATE."','".$DIARY_DATA."');"; $result = pg_query($sql); ---です。 エラーメッセージはWarning: pg_query() [function.pg-query]: Query failed: ERROR: invalid input syntax for type date: "" in ・・・・ 保存方法や確認しなければいけない個所を教えていただきたいので、よろしくお願い致します。 //保存ボタンを押すと保存 if($_POST['enter'] == "保存"){ //日記の記入がない日 if($data == null){ $data = $day; } //記入年月日・日記内容 $DIARY_DATE = $year."年".$month."月".$day1."日"; $DIARY_DATA = $_POST["DIARY"]; } //データベース接続開始! //(ホスト名・データベース名・ユーザー名・パスワード) $conn = "host = localhost dbname = **** user = ****      password = ****"; $link = pg_connect($conn); if($link){ echo "接続成功 .\n"; //日記の日付・日記の内容をDIARY_MASTAより取得 $sql = "INSERT INTO DIARY_MASTA       VALUES('".$DIARY_DATE."','".$DIARY_DATA."');"; $result = pg_query($sql); if(!$result_pg){ die("保存できません"); } } else { echo "接続できません"; } //データベース切断 $close = pg_close($link); if($close){ echo("切断できました"); }

    • ベストアンサー
    • PHP
  • PHP+MySQLでの配列のinsert文について

    PHP+MySQLでの配列のinsert文について はじめまして。 POSTされた配列データのDB一括挿入方法で約2週間悩み中で非常に困っております。 私の配列の理解が不足しているため、初心者の私でもわかるように解決方法をご教示いただけましたら大変助かります!何卒、よろしくお願い致します。 行いたい処理といたしまして、 [index.php] CSVアップロード(名前・メアド・金額・年月日の4項目)→※解決しました。  ↓↓↓ [check.php] CSVデータをテーブルで入力されている行数分をループして表示→※解決しました。  ↓↓↓ [finish.php] check.phpで表示した配列データをPOSTで受け取りDBに登録する。→※未解決 となります。 ソースは下記のようになります。 ※index.phpは今回無関係と思うので省略します。 ━━━━ [check.php]ここから ━━━━ ・ ・ ・ <form action="finish.php" method="post"> <? while($arr = fgetcsv_reg($fp,1024)){ ?> <? //空行以外を処理 $num = count($arr); if(!$arr ==''){ // $namae = $arr[0]; //名前 $mail = $arr[1]; //メアド $money = $arr[2]; //金額 $year = $arr[3]; //年 $month_hen = $arr[4]; //月 $month = sprintf("%02d", $month_hen); //1~9月(1桁)の場合、前に0を付加する $day_hen = $arr[5];//日 $day = sprintf("%02d", $day_hen); //1~9日(1桁)の場合、前に0を付加する // ?> <input type="hidden" name="namae[]" value="<?php echo $namae ?>"> <input type="hidden" name="mail[]" value="<?php echo $mail ?>"> <input type="hidden" name="money[]" value="<?php echo $money ?>"> <input type="hidden" name="year[]" value="<?php echo $year ?>"> <input type="hidden" name="month[]" value="<?php echo $month ?>"> <input type="hidden" name="day[]" value="<?php echo $day ?>"> ・ ・ ・ <input type="submit" value="  一括登録する  " /> </form> ━━━━ [check.php]ここまで ━━━━ ━━━━ [finish.php]ここから ━━━━ ・ ・ ・ // DB登録部分開始 if ($_POST['submit']) { $arr = array( 'reg_id', //auto_increment 'user_id', //ユーザーID(セッションで保持) 'namae', //名前 'mail', //メアド 'money',//金額 'ymd'//年月日 ); $value = array( NULL, mysql_real_escape_string( $_SESSION['user_id'] ), mysql_real_escape_string( $_POST['namae'] ), mysql_real_escape_string( $_POST['mail'] ), mysql_real_escape_string( $_POST['money'] ), mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] ) ); // DB登録部分終了 //ループ処理開始 foreach ( $arr as $value ) { $sql = "insert into receipt_issue ( $arr ) values ( $value )"; mysql_query($sql); $result = mysql_query( $sql ) ; //ループ処理終了 } } ・ ・ ・ ━━━━ [finish.php]ここまで ━━━━ というソースなのですが、データベースに登録できません。 例えば「finish.php」内に、 print_r( $_POST['namae'] ); と記述すると、 Array ( [0] => ああ君 [1] => いい君 [2] => うう君 [3] => ええ君 ) とちゃんと配列は受けとれているようです。 そもそもDB接続ができていないということもありません。 ※配列でない場合のテストでちゃんと接続・登録できていました。 いろいろ調べた中で、$value = array内の記述方法に問題があるのか・・・ と思い、色々調べて試したのですがダメでした。。。 上記の仕組みでループさせてデータベースに登録するには、どのように記述したらよろしいでしょうか? 情報に不足がございましたら、申し訳ございません。その点ご指摘いただきましたら必要な情報を再度投稿します。 何卒、お力をお貸しいただけましたら幸いでございます。 宜しくお願い致します!

    • 締切済み
    • PHP
  • 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; } で受け取ろうとしているのですが、うまくいきません。 どなたかご教授いただけないでしょうか。

  • 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
  • JDBCで配列を使ったSQL文(INSERT)

    早速ですがお願いします。例えば下のプログラムでのSQL文なのですが、配列str1[0]の中身”みかん”をINSERTしたいのですが、やりかたがわかりません。プログラミングの素人なので簡単な質問で申し訳ないですけど、どなたか教えてくれないでしょうか? ちなみにこのプログラムでstr1[0]のところを直接みかんと入れたらデータベースに追加することはできました。 import java.sql.*; class jdbc{ public static void main(String args[]){ String[] str1 = new String[1]; str1[0] = "みかん"; try{ Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql:test"; String user = ""; String password = ""; System.out.println("URL :" + url); System.out.println("USER :" + user); System.out.println("PASSWORD :" + password); Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); int insertCount = stmt.executeUpdate("INSERT INTO shinamono (hinmei,nedan) VALUES ('+str1[0]+', 1500)"); if (insertCount >0){ System.out.println("追加しました"); }else{ System.out.println("追加できませんでした"); } conn.commit(); stmt.close(); conn.close(); }catch(SQLException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } } } なおエラーメッセージは次の通りです。 java.sql.SQLException: ERROR: column "みかん" does not exist at org.postgresql.Connection.ExecSQL(Connection.java:533) at org.postgresql.jdbc2.Statement.execute(Statement.java:294) at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:78) at jdbc.main(jdbc.java:21)

  • PHPですが、エラーがでます。下記の問題があるよう

    なんですが、どこがいけないのでしょうか? $sql = "insert into menber(name,passward) values($_POST["name"]."','".$_POST["passward"].)";//SQL文の作成 ?> エラーはParse error: syntax error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in です。よろしくお願いいたします。

  • PHPとPostgreSQL接続 (スキーマ)

    いつもお世話になっております。 現在、PHP(5.3.1)とPostgreSQL(9.2)で開発をしております。 エラーが発生しており大変困っております。 こちらが発生するエラーです。 Warning: pg_exec() [function.pg-exec]: Query failed: ERROR: schema スキーマが見つからないとのことです。 そして、以下がコードとなります。 <?php // PostgreSQL Connect if (!($cn = pg_connect("host=*** port=*** user=*** password=*** dbname=***"))) { die; } // PostgreSQL Select $sql = "select * from t_test.na1"; if (!($rs = pg_exec($sql))) { die; } // PostgreSQL Get Records $ct = pg_numrows($rs); for ($i = 0; $i < $ct; $i++) { $item = pg_fetch_array($rs, $i); $txt = "${item[1]}"; } // PostgreSQL Disconnect pg_close($cn); ?> 現在のデータベースのスキーマについてですが「na1」と「public」の2つが存在しています。 試しに、na1とpublicのテーブルをまったく同じにして SQLの部分を「select * from t_test」に変更すると「public」側のテーブルが覗けます。 しかし、SQLの部分を「select * from t_test.na1」に変更すると「スキーマが見つかりません」 というエラーが発生してしまいます。 スキーマがあるにもかかわらずこのエラーがでてしまうため原因が分からず困っております。 もしお分かりになる方いらっしゃいましたら、教えていただければと思います。 何卒よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう