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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2553閲覧

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

uep3vjz9wp

総合スコア20

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/09/05 13:08

編集2018/09/05 13:54

お世話になります。
やりたいこと下記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を読み込む。

php

1//edit.php 2<?php 3require_once ( __DIR__ .'/config_ken/db_kensaconfig.php'); 4try { 5 if (empty($_GET['id'])) throw new Exception('Error'); 6 $id = (int) $_GET['id']; 7 $dbh = new PDO("mysql:host=localhost;dbname=$databasename;charset=utf8", $user, $pass); 8 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 9 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 10 $sql = "SELECT * FROM $dbtablename WHERE id = ?"; 11 $stmt = $dbh->prepare($sql); 12 $stmt->bindValue(1, $id, PDO::PARAM_INT); 13 $stmt->execute(); 14 $result = $stmt->fetch(PDO::FETCH_ASSOC); 15 $dbh = null; 16} catch (Exception $e) { 17 echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>"; 18 die(); 19} 20 21 22?> 23 24 25<!DOCTYPE html> 26<html lang="ja"> 27<head> 28<meta charset="UTF-8"> 29<title>内容変更フォーム</title> 30</head> 31<body> 32<h2>内容変更</h2> 33 34<form method="post" action="update.php"> 35 36<font size="4"> 37<pre> <a href='list.php'>変更せず一覧に戻る</a></pre> 38<br> 39<input type="hidden" name="id" value="<?php echo htmlspecialchars($result['id'], ENT_QUOTES, 'UTF-8'); ?>"> 40<pre> <input type="submit" value="変更する"></pre> 41</form> 42<table width=100% border=1 cellspacing=1> 43 <tr> 44 <td> 45管轄: 46<select name="kankatsu"> 47<option value="A" <?php if($result['kankatsu'] === A) echo "selected" ?>>A</option> 48<option value="B" <?php if($result['kankatsu'] === B) echo "selected" ?>>B</option> 49<option value="C" <?php if($result['kankatsu'] === C) echo "selected" ?>>C</option> 50<option value="D" <?php if($result['kankatsu'] === D) echo "selected" ?>>D</option> 51</select> 52 </td> 53 <td> 54状況: 55<select name="subject"> 56<option value="指導中" <?php if($result['subject'] === 指導中) echo "selected" ?>>指導中</option> 57<option value="その他" <?php if($result['subject'] === その他) echo "selected" ?>>その他</option> 58<option value="完結" <?php if($result['subject'] === 完結) echo "selected" ?>>完結</option> 59</select> 60 </td> 61 </tr> 62 <tr> 63 <td> 64担当: 65<input type="text" name="tantou" value="<?php echo htmlspecialchars($result['tantou'] , ENT_QUOTES, 'UTF-8'); ?>"> 66 </td> 67 </tr> 68 69 70<!-- 以下が前の質問の箇所です --> 71 72<tr> 73<?php 74 $renban = 1; 75 while ($renban <= 50) { 76 ?> 77 <td><?php echo "連絡".$renban;?><br><br>平成年月日時分 78 </td> 79 <td colspan="2"> 80<textarea name="<?php echo "rensuru"."$renban"; ?>" cols="120" rows="8"> 81<?php echo htmlspecialchars($result["ren"."$renban"], ENT_QUOTES, 'UTF-8'); 82 $renban++; ?> 83 </textarea> 84 </td> 85</tr> 86 <?php } ?> 87 88</table> 89</font> 90</body> 91</html>

php

1//update.php  2<?php 3require_once ( __DIR__ .'/config_ken/db_kensaconfig.php'); 4require_once ( __DIR__ .'/config_ken/config_post.php'); 5 6try { 7 if (empty($_POST['id'])) throw new Exception('Error'); 8 $id = (int) $_POST['id']; 9 $dbh = new PDO("mysql:host=localhost;dbname=$databasename;charset=utf8", $user, $pass); 10 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 11 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 12 13//1箇所目 14 $sql = "UPDATE $dbtablename 15 SET kankatsu = ?, subject = ?, 16 naiyou = ?, tantou = ?, 17 ren1 = ?, ren2 = ?, ren3 = ?, 18 ~(略)~ 19 ren9 = ?, ren10 = ? 20 WHERE id = ?"; 21 22 $stmt = $dbh->prepare($sql); 23 $stmt->bindValue(1, $kankatsu, PDO::PARAM_STR); 24 $stmt->bindValue(2, $subject, PDO::PARAM_STR); 25 $stmt->bindValue(3, $naiyou, PDO::PARAM_STR); 26 $stmt->bindValue(4, $tantou, PDO::PARAM_STR); 27 28//2箇所目 29 $stmt->bindValue(5, $ren1, PDO::PARAM_STR); 30()31 $stmt->bindValue(14, $ren10, PDO::PARAM_STR); 32 $stmt->bindValue(15, $id, PDO::PARAM_STR); 33 $stmt->execute(); 34 $dbh = null; 35 echo "ID: " . htmlspecialchars($id,ENT_QUOTES,'UTF-8') ."更新が完了しました。<br>"; 36echo "<br>"; 37echo "<a href='list_kensa.php'>一覧に戻る</a>"; 38} catch (Exception $e) { 39 echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>"; 40 die(); 41} 42

php

1//require_once ( __DIR__ .'/config_ken/config_post.php');の内容 2 3<?php 4 $kankatsu = $_POST['kankatsu']; 5 $subject = $_POST['subject']; 6 $naiyou = $_POST['naiyou']; 7 $tantou2 = $_POST['tantou']; 8 9 $renban = 1; 10 while ($renban <= 50) { 11 ${"ren".$renban} = $_POST{"rensuru".$renban}; 12 $renban++; 13} 14

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/09/05 13:28

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

2018/09/05 13:56

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

回答1

0

ベストアンサー

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

例えば。

php

1$bind = []; 2$bind[] = $_POST['kankatsu']; 3$bind[] = $_POST['subject']; 4$bind[] = $_POST['naiyou']; 5$bind[] = $_POST['tantou']; 6 7for($i=0;$i<100;$i++){ 8 if(array_key_exists("ren".$i,$_POST)){ 9 $bind[] = $_POST["ren".$i]; 10 } 11} 12$bind[] = $id; 13 14foreach($bind as $bindkey=>$bindvalue){ 15 $stmt->bindValue(($bindkey+1),$bindvalue, PDO::PARAM_STR); //bindValueは1~なのでKey+1 16}

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

投稿2018/09/05 13:39

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uep3vjz9wp

2018/09/05 14:10

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

2018/09/05 14:13

実際の値を書くか変数を入れるかの違いです。 考え方としては下記と同じ。 echo "test"; $hoge = "test"; echo $hoge; 「一覧」とあるので検索処理もあるのでしょうか。 検索SQLのWhere句を作るところも同じような考え方でできます。
uep3vjz9wp

2018/09/05 14:26

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

2018/09/05 14:34 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問