AS-B
@AS-B

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ループ内のテキストを登録したいです

Q&A

Closed

解決したいこと

foreachで繰り返しの中にテキストボックスを入れており、
submitでDBに内容を登録したいのですが、イメージ通りに動きません。

発生している問題・エラー

登録されない

該当するソースコード

<?php
require_once( dirname(dirname(dirname(dirname(dirname( __FILE__ ))))) . '/db.php' );
global $wpdb;
$tablename =  $wpdb->prefix . "XXX";

$server = "XXX";
$database = "XXX";
$user = "XXX";
$password = "XXX";
$conn = odbc_connect("Driver=SQL Server;Server=$server;Database=$database;", $user, $password);

$year = date("Y");
$month = date('m');
$lastmonth = date('m') - 1;
$lastyear = date("Y") - 1;
$code = filter_input(INPUT_POST,'code');

$array = [
    "A" => "01",
    "B" => "02",
    "C" => "03"
];


echo "<form method='post' action=''>";
echo "<table>";
//ここからテーブル作成していますが省略します。

foreach($array as $NAME => $CODE) {
$memo = '${"memo".$CODE}';
$$memo = filter_input(INPUT_POST, $CODE.'memo');
$memo_val = $wpdb->get_var( "SELECT memo FROM $wpdb->XXX where code='$CODE'");
//$memo_valは、すでに登録されたデータを参照しています。
//その他にもデータを読み込んでいますが省略します。

echo "<input type='text' name='".$CODE."memo' value='".$memo_val."' placeholder='メモ' />";
echo "<input type='hidden' name='code' value='".$CODE."'>";

}

echo "<input style='width:100%;' type='submit' name='update' value='メモ更新' />";
echo "</table>";
echo "</form>";

if(isset($_POST["update"])) {
    $wpdb->update($tablename,array('memo' => ${"memo".$CODE}),array('code' => $code),array('%s'),array('%d'));
    header("Location: " . $_SERVER['PHP_SELF']);
    exit;
}

odbc_close($conn);

?>

自分で試したこと

自分の中ではループでそれぞれに名前をつけてテキストボックスを作り、
そのいずれかを単純にsubmitするというイメージで作りたかったのですが、
ちょこちょこ配置を変えたりしても上手く達成できませんでした。
お分かりになられる方いらっしゃいましたら、恐れ入りますがご助力ください。
よろしくお願い申し上げます。

0

1Answer

なんとなくソースコードから抜粋されているような感じもするのですが……
まずformタグがないのでsubmitは動作しません。
次にforeachループの中にformタグを含め、input type="submit"も無いので「いずれかをsubmit」ができません。
そして$_POST["update"]とあるのですが、updateの名前を付けたinputタグがないのでDB更新ルーチンに入ることはありません。
他にも$memo_valってどこからも値をもらってないみたいとか、いろいろ不思議な感じがするのですが。

0Like

Comments

  1. @AS-B

    Questioner

    ごめんなさい、要点(機能部?)のみ伺おうと思い省略しておりましたが、どうやら省略し過ぎだったようです。
    今後気をつけます。
    コードにつきましては少々書き足しました。
    まだ$yearが関係なかったりなどありますがご容赦ください。

    foreachループの中にformタグを含め、「input type="submit"も無い」
    との事でしたので、これが原因か!?と試してみましたが、更新されませんでした。

    恐れ入りますが、引き続きよろしくお願いいたします。
  2. なんとなくわかりました。
    今のソースコードだとすべてのメモが更新対象になります(PHPの出力したHTMLを確認するのが良いと思います)。

    また、今の状態だと$CODEはforeachで回した最後の値になっていると思います。
    希望した値が渡されているかどうか、db更新の直前で表示させる(更新後のheaderは一時的にコメントアウトする)のが良いでしょう。

    もし、希望した値が渡されているのであれば、問題はdb.phpかもしれません。


  3. @AS-B

    Questioner

    コメントありがとうございます。
    アドバイスいただいたことを試してみたいと思います。

    やりたいことについて、なかなか言語化できませんでしたが、

    -----※フォーム部分-----
    <form method='post' action=''>

    //$memo_valは、既にデータが登録してある場合に参照するだけです。
    <input type='text' name='01memo' value='$memo_val' placeholder='メモ' /> //コード01の入力
    <input type='text' name='02memo' value='$memo_val' placeholder='メモ' /> //コード02の入力
    <input type='text' name='03memo' value='$memo_val' placeholder='メモ' /> //コード03の入力
    //以降もこれを繰り返します。

    <input type='submit' name='update' value='メモ更新' /> //一括更新

    </form>

    -----※php部分-----
    $01memo = filter_input(INPUT_POST,'01memo');
    $02memo = filter_input(INPUT_POST,'02memo');
    $03memo = filter_input(INPUT_POST,'03memo');
    //以降もこれを繰り返します。

    if(isset($_POST["update"])) {
    $wpdb->update($tablename,array('memo' => $01memo),array('code' => '01'),array('%s'),array('%d'));
    $wpdb->update($tablename,array('memo' => $02memo),array('code' => '02'),array('%s'),array('%d'));
    $wpdb->update($tablename,array('memo' => $03memo),array('code' => '03'),array('%s'),array('%d'));
    //以降もこれを繰り返します。
    header("Location: " . $_SERVER['PHP_SELF']);
    exit;
    }

    このようなイメージです。
    繰り返しの部分をforeachでやりたかったのですが、初学者のため思うような動きをさせられなかったという流れです。
  4. POSTメソッドで渡されたパラメータを$_POSTから個々に読みださないと処理できませんね。

    $_POSTについては下記マニュアルに記載があります。
    https://www.php.net/manual/ja/reserved.variables.post.php

    User Contributed Notesの中にもありますが、var_dumpを使ってPOSTメソッドで渡されたパラメータの中身を見てみると処理方式のイメージを掴みやすいと思います。



  5. @AS-B

    Questioner

    かなり苦労しましたが最終的にexitを無くすことで達成できました。
    また、教えていただいたようにvar_dump($_POST)やecho、print_r()が助けになりました。
    アドバイスいただきありがとうございました。

Your answer might help someone💌