• 締切済み

配列データのレコード登録

はじめましてphp初心者ですが、ここ一ヵ月ほど悩みに悩んだのですが、答えがわかりませんので教えてください。初歩的なことだとは思うのですが、配列データのレコード登録方法がわかりません。 例えば、$a = array("あ","い","う","え","お"); とした場合に$aをレコードに追加するにはどうすればいいんでしょうか? そのまま、$sql = "INSERT INTO (`test`) VALUES ('{$a}')"; とやってもarrayとなってしまいます。やりたいのは個別レコードにしての登録です。 1,あ 2.い 3.う …というような。 どうか宜しくお願い致します。

  • PHP
  • 回答数4
  • ありがとう数3

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

$sql = "UPDATE `test` SET `txt` = '{$_REQUEST['txt']}' WHERE = '{$a}'"; $_REQUEST['txt']は、前出のとおりArrayをかえすのでだめでしょう。 しかもWHERE句にいきなりイコールをおかれても・・・。 そもそもこれはなにをどうUPDATEしたいのでしょうか? かりにtxtフィールドが$aだったときtxtを$aにする処理にしてしまうと 更新がされないし・・・意味不明です、補足のひつようがあります。

tarou_hana
質問者

お礼

配列の更新ですがなんとか解決することができました。ありがとうございました。

tarou_hana
質問者

補足

お返事遅くなってしまいました、すみません。 どのようにUPDATEしたいかと言うとまず、 <form action="<?=$_SERVER['PHP_SELF']?>" method="post"> <?php //レコード呼び出し $sql = "SELECT * FROM `test(テーブル名)`"; $result = mysql_query($sql); while ($row = mysql_fetch_array($result)) {?> <input type="text" name="txt[<?=$row["id"]?>]" value="<?=$row["txt"]?>"> <?php } ?> <input type="submit" name="submit" value="submit"> </form> という感じで全体のレコードを一覧で表示したあと、 それぞれのレコードをループで個別にUPDATEしたいと思っております。 for文を使って、 for($a = 0; $a <= count($_POST['txt']); $a++) { $sql = "UPDATE `test` SET `txt` = '{$_POST['txt'][$a]}' WHERE `id` = '{$a}'"; mysql_query($sql); if ($a == count($_POST['txt'])) { print "レコードを追加しました!"; } } このように書いてみましたが、$sqlをprintすると下のような命令文になってしまいます。 UPDATE `test` SET `txt` = '' WHERE `id` = '0' UPDATE `test` SET `txt` = '123' WHERE `id` = '1' UPDATE `test` SET `txt` = '456' WHERE `id` = '2' ※フォーム部分には上から順に123、456、789、と値を入れてます。 命令文のどこがおかしいのかはなんとなくわかるのですが、解決方法がわかりません。 配列をPOSTで受け取る場合、$_POST["txt"]だと思いますが、キー番号を(この場合`id`)一緒に受け取る場合はどのように指定すればよいのでしょうか? またその場合UPDATE文にはどのように組み込めばよいのでしょうか? 質問内容がかなりちぐはぐになってますが、宜しくお願いします。

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

まず、複数レコードを挿入するSQL構文を知る必要があります。 お使いのデータベースは何でしょう? MySQLと異なる構文に見えるのだけど? とりあえずMySQLなら INSERT INTO table_name (id,txt) VALUES (1,'a'),(2,'b'); となるので for を使ってこのようになる文字列を作ります。 $sq = "insert into table_name (id,txt) values "; for($i=0; $i<count($a); $i++){ if($i>0){ $sql += ','; } $sql += "("+($i+1)+",'"+mysql_real_escape_string($a[$i])+"')"; }

tarou_hana
質問者

お礼

ご回答ありがとうございます。 使用しているデータベースはMySQLになります。 教えて頂いたサンプルスクリプトを参考に自分で下のように組んでみましたら思い通りの結果になりました。まだわからない関数などがありますが、自分で調べてちゃんと理解したいと思っております。 /*処理部分*/ if ($_POST['submit']) { for($a = 0; $a < count($_REQUEST['txt']); $a++) { $sql = "INSERT INTO `test` (`id`,`txt`) VALUES (0, '{$_REQUEST['txt'][$a]}')"; mysql_query($sql); print "登録しました;"; } } ?> /*フォーム部分*/ <form action="<?=$_SERVER['PHP_SELF']?>" method="post"> <input type="text" name="txt[]"><br /> <input type="text" name="txt[]"><br /> <input type="text" name="txt[]"><br /> <input type="submit" name="submit" value="submit"> </form>

tarou_hana
質問者

補足

ループでのレコード追加はできたのですが、今度はループで個別にレコードを更新する方法で悩んでいます。下のようなスクリプトを書いてみたのですが、処理は行われているようなのですが、レコードの値が更新されない状態です。何が原因なのでしょうか? <!--処理部分--> <?php if ($_POST['submit']) { for($a = 0; $a < count($_REQUEST['txt']); $a++) { $sql = "UPDATE `test` SET `txt` = '{$_REQUEST['txt']}' WHERE = '{$a}'"; mysql_query($sql); print "更新しました"; } } ?> <!--フォーム部分--> <?php $sql = "SELECT * FROM `test`"; $result = mysql_query($sql); ?> <form action="<?=$_SERVER['PHP_SELF']?>" method="post"> <?php while ($row = mysql_fetch_array($result)) { ?> <input type="text" name="txt[<?=$row["id"]?>]" value="<?php print $row["txt"];?>"><br /> <?php } ?> <input type="submit" name="submit" value="submit"> </form>

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

いっぺんには無理ですのでforeach等のループで1個ずつINSERTしていくしかないです

tarou_hana
質問者

お礼

ご回答ありがとうございます。foreachを調べて下のようにスクリプトを書いてみたらforeachでも同じことができました。ループ処理にも色々あるのですね。勉強になりました。ありがとうございます。 <?php /*処理部分*/ if ($_POST['submit']) { foreach ($_REQUEST['a'] as $value) { $sql = "INSERT INTO `test` (`id`,`txt`) VALUES (0,'{$value}')"; mysql_query($sql); print "レコード追加完了"; } } ?> /*フォーム部分*/ <form action="<?=$_SERVER['PHP_SELF']?>" method="post"> <input type="text" name="txt[]"><br /> <input type="text" name="txt[]"><br /> <input type="text" name="txt[]"><br /> <input type="submit" name="submit" value="submit"> </form>

  • syuuiwsd
  • ベストアンサー率56% (17/30)
回答No.1

データベーステーブルの構造によって異なります。お使いになるテーブルはどうなってるのでしょうか?

tarou_hana
質問者

補足

説明不足ですみません。 テーブル名は`test`で構造は、 id(int)index│txt(text) という風にしています。 id│txt 1 │あ 2 │い 3 │う 4 │え 5 │お という形にしたいと考えております。

関連するQ&A

  • 配列の初歩2

    PHP+MYSQLに挑戦しているプログラミング入門者です。、 昨日 http://oshiete1.goo.ne.jp/qa3720566.html に続き全く初歩的な質問で申し訳ございません。 知識が乏しいため本を読んでもわからず、 いろいろ試してもだめなため、再度質問させていただきます。 t1 +-+-+ |n|n2| +-+-+ |1|2| +-+-+ |3|4| $bat=array(5=>6,6=>7,7=>8); $sql = "insert into t1 values(5,number)"; なら |5|5| $sql = "insert into t1 values(5,'{$bat[5]}')"; なら |5|6| が追加されますが $sql = "insert into t1 values(5,'{$bat[number]}')"; だと |5|0| となってしまいます。これを |5|6| とするにはどうしたらよいのでしょうか 何卒よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列の初歩

    初めてのプログラミングのため、初歩的な質問で申し訳ございません。 PHP+MYSQLに挑戦していますが、 複数の値を配列(これがわかりません)を使って、レコードを増やすやり方がわかりません。 $area = 5; $area2 = 6; $sql = "insert into t1 (number,number2) values ('.$area.','.$area2.')"; $res = mysql_db_query($db,$sql); なら、レコードを増やすことができましたが、これを配列(5,6)を使ってやるにはどうしたらよいのでしょうか。何卒よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列内のデータを1つのテーブルに登録。

    配列内のデータを1つのテーブルに登録。 お世話になっております。 以下のような構成のテーブルがあり、カラム名1、2、3、4と100まであるのですが、そこへ 配列内にある100を数えるデータを登録するには、どのようなSQL文が適切なのでしょうか? no id date 1 2 3 4 5 6 ...... 100 安易に、$sql = "INSERT INTO test values(0, '$id', '$date', '$randam[0]', '$randam[1]', '$randam[2]',....とも考えたのですが、他に効率のいいものがあるのでは?と思い、投稿した次第です。色々と考えてはいるのですが他に思いつかないので・・ 補足:配列にあるデータはランダムな数値を格納してあり、このSQL文の前に、配列を生成したものとなっております。 以上、お忙しいなか恐縮ですがご指導のほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 配列データのMySQLへの登録

    下記の配列のデータをMySQLのデータベースに登録をしたいと思っています。 (参考)に記述しています内容で実行をしましたが、1つ目のデータしか登録がされず、 for文なども考え試行錯誤していましたが、うまく実行できない状況であります。 登録のための方法をご教授いただければと思います。よろしくお願いします。 array(3) { [0]=>"146-0082" [1]=>"東京都大田区" [2]=>"田中さん" array(3) { [0]=>"120-0015" [1]=>"東京都足立区" [2]=>"山田さん" -------------------- (参考) $sql = ('insert into table (number, adress, name) values (:number, :adress, :name)'); $stmt = $dbh->prepare($sql); $params = array( ":number" => $data[0], ":adress" => $data[1], ":name" => $data[2] );

    • ベストアンサー
    • PHP
  • 配列データに対する、要素の追加・削除方法

    PostgreSQLの配列に対して、要素の追加及び削除を行いたいのですが、下記のような動作をさせるには、※1と※2で、どのようなSQLを実行すれば良いでしょうか? よろしくお願いいたします。 >>> CREATE TABLE test ( id integer, data integer[] ); INSERT INTO test VALUES (1, '{0,1,2,3,4}'); INSERT INTO test VALUES (2, '{5,6,7,8,9}'); SELECT * FROM test; id | data ----+------------- 1 | {0,1,2,3,4} 2 | {5,6,7,8,9} (2 rows) UPDATE test [data配列に10を追加] WHERE id = 1; /* ※1 */ UPDATE test [data配列から6を除去] WHERE id = 2; /* ※2 */ SELECT * FROM test; id | data ----+------------- 1 | {0,1,2,3,4,10} 2 | {5,7,8,9} (2 rows) <<<

  • PHPでInsertを実行したら空白のレコードが追加される

    PostgreSQL 8.0.1 PHP 4 Apache 1.3 で環境を構築しています。 PHPで、 $sql=sprintf("insert into records values('20','test2','cal')"); と入力し実行すると、きれいにDBに登録できるのですが、 $sql=sprintf("insert into records values('%s','%s','%s')",$no,$name,$address); と入力したら、DBには空白で登録されてしまいます。 何がおかしいのか検討が付かなくて困っております 宜しくお願い致します。

  • 「~」文字の登録

    すみません。 以下のSQLを実行した後、登録した内容を 画面上で表示した時、 「あ~お」が「あ?お」となってしまいました。 「~」文字を登録する場合はSQLで何か処理しないといけないのでしょうか。 INSERT INTO TEST (A,B,) VALUES(1,'あ~お') よろしくお願いします。

  • トランザクションについて

    トランザクションについての質問なのですが、下にある1のSQLを実行すると 'a'だけ登録されるのは、分かるのですが、 2のSQLを実行すると、'c'と'd'の両方が登録されてしまいます。 私的には、両方登録されないのかなぁと思っていたのですが・・・ COMMITが来た時点で、START TRANSACTIONの開始位置は、 あまり関係ないということなのでしょうか? よろしくお願いします。 1. START TRANSACTION; insert into test values('a'); START TRANSACTION; insert into mtuser values('b'); ROLLBACK; COMMIT; 2. START TRANSACTION; insert into test values('c'); START TRANSACTION; insert into mtuser values('d'); COMMIT; ROLLBACK; 環境:Mysql4.1.19

    • ベストアンサー
    • MySQL
  • ポスグレでの幾何学データ配列の使い方について質問です。

    ポスグレでの幾何学データ配列の使い方について質問です。 create table test_table1 (id serial, test_lseg lseg[]); insert into test_table1(test_lseg) values (ARRAY[lseg'((0,44),(0,88))',lseg'((1,44),(1,88))',lseg'((2,44),(2,88))',lseg'((3,44),(3,88))',lseg'((4,44),(4,88))',lseg'((5,44),(5,88))'] ); という感じのテーブルを作成し、test_lsegカラムのArray内にある線分に特定の座標が含まれているかを調べるような事をしたいのですが、ARRAY内の要素を検索する際の演算子を指定する方法がよく分かりません。とりあえず以下のようなSQL文では検索できないようです。 SELECT * from test_table1 WHERE test_lseg && ARRAY[lseg'((0,80),(0,80))']; SELECT * from test_table1 WHERE lseg'((0,80),(0,80))' && any (test_lseg); test_lsegカラムのArray内にある線分に特定の座標が含まれているかが分かり、出来ればIndexが張れるようなやり方がありましたらご教授ください。

  • 配列に入ったデータをループを使ってmysqlに登録する方法

    独学でPHPを勉強しておりますが、まだまだ初心者で簡単なことなのかもしれませんが、教えてください。 たとえば  team_a|1|2|3|4|5|  ーーーーーーーーーーーーーー  team_b|5|4|3|2|1| のようなものを  senkou[]とkoukou[]という配列に入れているのでそれを、 ループを使ってsqlでmysqlに登録したいのですが、どうもうまくいかないです。 for($i=1;$i<=5;$i++){ $sql="" . "INSEART INTO team (" . "game_date," . "game_id," . "senkou${i}," . "koukou${i}" . ")VALUES(" . "${game_date}," . "${game_id}," . "senkou[${i}]," . "koukou[${i}]" . ");"; $result = mysql_query($sql,$con); } 多分{}の使い方がでたらめなんだろうなと思っていますが、それをどうやったものか悩んでおります。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう