dポイントプレゼントキャンペーン実施中!

はじめましてphp初心者ですが、ここ一ヵ月ほど悩みに悩んだのですが、答えがわかりませんので教えてください。初歩的なことだとは思うのですが、配列データのレコード登録方法がわかりません。

例えば、$a = array("あ","い","う","え","お");
とした場合に$aをレコードに追加するにはどうすればいいんでしょうか?

そのまま、$sql = "INSERT INTO (`test`) VALUES ('{$a}')";
とやってもarrayとなってしまいます。やりたいのは個別レコードにしての登録です。

1,あ
2.い
3.う

…というような。
どうか宜しくお願い致します。

A 回答 (4件)

まず、複数レコードを挿入する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])+"')";
}

この回答への補足

ループでのレコード追加はできたのですが、今度はループで個別にレコードを更新する方法で悩んでいます。下のようなスクリプトを書いてみたのですが、処理は行われているようなのですが、レコードの値が更新されない状態です。何が原因なのでしょうか?

<!--処理部分-->
<?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>

補足日時:2007/08/04 18:36
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
使用しているデータベースは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>

お礼日時:2007/08/04 18:20

$sql = "UPDATE `test` SET `txt` = '{$_REQUEST['txt']}' WHERE = '{$a}'";



$_REQUEST['txt']は、前出のとおりArrayをかえすのでだめでしょう。
しかもWHERE句にいきなりイコールをおかれても・・・。

そもそもこれはなにをどうUPDATEしたいのでしょうか?
かりにtxtフィールドが$aだったときtxtを$aにする処理にしてしまうと
更新がされないし・・・意味不明です、補足のひつようがあります。

この回答への補足

お返事遅くなってしまいました、すみません。
どのように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文にはどのように組み込めばよいのでしょうか?

質問内容がかなりちぐはぐになってますが、宜しくお願いします。

補足日時:2007/08/07 13:17
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/08 01:10

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

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。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>

お礼日時:2007/08/04 18:31

データベーステーブルの構造によって異なります。

お使いになるテーブルはどうなってるのでしょうか?

この回答への補足

説明不足ですみません。
テーブル名は`test`で構造は、

id(int)index│txt(text)

という風にしています。

id│txt
1 │あ
2 │い
3 │う
4 │え
5 │お

という形にしたいと考えております。

補足日時:2007/08/03 23:20
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!