質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

phpからsqlのupdate時に連番変数を繰り返し処理したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 634

uep3vjz9wp

score 18

お世話になります。
やりたいこと下記update.php の
1.1箇所目 sql ren1 = ?,  ~(略)~ren10 = ?
2.2箇所目 $stmt->bindValue(5, $ren1, PDO::PARAM_STR);
ren1 ~(略)~ren10

ren1 ~(略)~ren10のカラムを一つ一つ記述することなく行いたいです。
実際にはren100とか、もっと増えます。データ型はvarchar(300)です。

forとかで連番の変数を一気に格納したいと思っています。
for ($i = 1; $i <= 10; $i++) {
$array[$i] = ${"v".$i};
}
このような形、又は100個とか記述することなく処理できないでしょうか?

処理の順番
1.edit.php でデータベースから呼び出し編集する。
2.update.php へpost。
3.update.php でconfig_post.phpを読み込む。

//edit.php
<?php
require_once ( __DIR__ .'/config_ken/db_kensaconfig.php');
try {
    if (empty($_GET['id'])) throw new Exception('Error');
    $id = (int) $_GET['id'];
    $dbh = new PDO("mysql:host=localhost;dbname=$databasename;charset=utf8", $user, $pass);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT * FROM $dbtablename WHERE id = ?";
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(1, $id, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    $dbh = null;
} catch (Exception $e) {
    echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>";
    die();
}


?>


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>内容変更フォーム</title>
</head>
<body>
<h2>内容変更</h2>

<form method="post" action="update.php">

<font size="4">
<pre>      <a href='list.php'>変更せず一覧に戻る</a></pre>
<br>
<input type="hidden" name="id" value="<?php echo htmlspecialchars($result['id'], ENT_QUOTES, 'UTF-8'); ?>">
<pre>      <input type="submit" value="変更する"></pre>
</form>
<table width=100% border=1 cellspacing=1>
 <tr>
  <td>
管轄:
<select name="kankatsu">
<option value="A" <?php if($result['kankatsu'] === A) echo "selected" ?>>A</option>
<option value="B" <?php if($result['kankatsu'] === B) echo "selected" ?>>B</option>
<option value="C" <?php if($result['kankatsu'] === C) echo "selected" ?>>C</option>
<option value="D" <?php if($result['kankatsu'] === D) echo "selected" ?>>D</option>
</select>
  </td>
  <td>
状況:
<select name="subject">
<option value="指導中" <?php if($result['subject'] === 指導中) echo "selected" ?>>指導中</option>
<option value="その他" <?php if($result['subject'] === その他) echo "selected" ?>>その他</option>
<option value="完結" <?php if($result['subject'] === 完結) echo "selected" ?>>完結</option>
</select>
  </td>
 </tr>
 <tr>
  <td>
担当:
<input type="text" name="tantou" value="<?php echo htmlspecialchars($result['tantou'] , ENT_QUOTES, 'UTF-8'); ?>">
  </td>
 </tr>


<!-- 以下が前の質問の箇所です -->

<tr>
<?php
 $renban = 1;
 while ($renban <= 50) { 
 ?>
 <td><?php echo "連絡".$renban;?><br><br>平成年月日時分
 </td>
  <td colspan="2">
<textarea name="<?php echo "rensuru"."$renban"; ?>" cols="120" rows="8">
<?php echo htmlspecialchars($result["ren"."$renban"], ENT_QUOTES, 'UTF-8');
      $renban++; ?>
  </textarea>
 </td>
</tr>
 <?php } ?>

</table>
</font>
</body>
</html>
//update.php 
<?php
require_once ( __DIR__ .'/config_ken/db_kensaconfig.php');
require_once ( __DIR__ .'/config_ken/config_post.php');

try {
    if (empty($_POST['id'])) throw new Exception('Error');
    $id = (int) $_POST['id'];
    $dbh = new PDO("mysql:host=localhost;dbname=$databasename;charset=utf8", $user, $pass);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//1箇所目
    $sql = "UPDATE $dbtablename 
        SET kankatsu = ?, subject = ?, 
        naiyou = ?, tantou = ?, 
        ren1 = ?, ren2 = ?, ren3 = ?, 
           ~(略)~
        ren9 = ?, ren10 = ? 
        WHERE id = ?";

    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(1, $kankatsu, PDO::PARAM_STR);
    $stmt->bindValue(2, $subject, PDO::PARAM_STR);
    $stmt->bindValue(3, $naiyou, PDO::PARAM_STR);
    $stmt->bindValue(4, $tantou, PDO::PARAM_STR);

//2箇所目
    $stmt->bindValue(5, $ren1, PDO::PARAM_STR);
           ~(略)~
    $stmt->bindValue(14, $ren10, PDO::PARAM_STR);
    $stmt->bindValue(15, $id, PDO::PARAM_STR);
    $stmt->execute();
    $dbh = null;
    echo "ID: " . htmlspecialchars($id,ENT_QUOTES,'UTF-8') ."更新が完了しました。<br>";
echo "<br>";
echo "<a href='list_kensa.php'>一覧に戻る</a>";
} catch (Exception $e) {
    echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>";
    die();
}
//require_once ( __DIR__ .'/config_ken/config_post.php');の内容

<?php
    $kankatsu = $_POST['kankatsu'];
    $subject = $_POST['subject'];
    $naiyou = $_POST['naiyou'];
    $tantou2 = $_POST['tantou'];

 $renban = 1;
 while ($renban <= 50) {
    ${"ren".$renban} = $_POST{"rensuru".$renban}; 
    $renban++; 
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/09/05 22:28

    html も提示いただけますか?前の質問から少し変化はしているものと見受けられますので、現在のものを。

    キャンセル

  • uep3vjz9wp

    2018/09/05 22:56

    htmlのソースコード追加いたしました。

    キャンセル

回答 1

checkベストアンサー

+1

ちゃんとSQLでおかれている?の順に入れなければなりませんが、配列に入れた上でforeachで回すと良いです。
配列の変数で[]をつけて代入していくと0から連番になるのでその仕組みを使います。

例えば。

$bind = [];
$bind[] = $_POST['kankatsu'];
$bind[] = $_POST['subject'];
$bind[] = $_POST['naiyou'];
$bind[] = $_POST['tantou'];

for($i=0;$i<100;$i++){
  if(array_key_exists("ren".$i,$_POST)){
    $bind[] = $_POST["ren".$i];
  }
}
$bind[] = $id;

foreach($bind as $bindkey=>$bindvalue){
  $stmt->bindValue(($bindkey+1),$bindvalue, PDO::PARAM_STR); //bindValueは1~なのでKey+1
}

この考え方を応用するとUPDATE文のset部分ももっと短く汎用的に書けるようになります。がんばってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/05 23:10

    $stmt->bindValue(($bindkey+1)
    こういう記述ができるとは思いませんでした。ありがとうございました。
    updateのsetもこの応用で行けそうです。大変参考になりました。

    キャンセル

  • 2018/09/05 23:13

    実際の値を書くか変数を入れるかの違いです。
    考え方としては下記と同じ。
    echo "test";
    $hoge = "test";
    echo $hoge;

    「一覧」とあるので検索処理もあるのでしょうか。
    検索SQLのWhere句を作るところも同じような考え方でできます。

    キャンセル

  • 2018/09/05 23:26

    一覧では「ren1-ren100」の内容はさすがに表示数が多すぎるのでそれ以外の概要のみ表示にしています。今後whereでも実施する際には応用してみます。ありがとうございます。

    キャンセル

  • 2018/09/05 23:34 編集

    ループで作ればコード短くても何個でも作れますのでそこは要件にあわせてご調整ください。
    色々と進むきっかけになったようで良かったです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる