ユーザーが本の属性を更新できるフォームを作成しています。ユーザーが「タイトル」、「作成者」、「説明」などの新しい値を入力できる動的に生成された HTML フォームがあり、次のようになります。
echo "<form id=changerform name=changerform action=updatesubmit.php method=post>";
echo "<span id=titlebox>Title: <input class=attributefield style='border:none' type=text size=100 id=Title value='".$item['Title']."' />Change This?</span> <br>";
echo "<span id=authorbox>Author: <input class=attributefield style='border:none' type=text id=Author value='".$item['Author']."' />Change This?</span><br>";
echo "<span id=description>Description: <textarea class=attributefield style='border:none' rows=9 cols=100 name=Description id=Description >".$item['Description']."</textarea></span>";
echo "<input type='hidden' id='bookidfield' name='bookidfield' value = '".$toChange."' />";
このフォームは、次のような php によって処理されます。
while($nowfield = current($_POST)){
$col = key($_POST);
switch($col){
case 'Title':
$qstring = 'UPDATE Mainbooks SET Title = :slug WHERE ItemID LIKE :bookid;';
break;
case 'Author':
$qstring = 'UPDATE Mainbooks SET Author = :slug WHERE ItemID LIKE :bookid;';
break;
case 'Description':
$qstring = "UPDATE Mainbooks SET Description = :slug WHERE ItemID LIKE :bookid;";
break;
default:
echo "Invalid input";
break;
}//end switch
$upquery = $safelink->prepare($qstring);
$upquery->bindValue(':slug', $nowfield, PDO::PARAM_STR);
$upquery->bindValue(':bookid', $_POST['bookidfield'], PDO::PARAM_INT);
$upquery->execute();
next($_POST);
} //end while
ポストで変更されたフィールドのみを渡すコードがフォームにあるため、これを switch ステートメントとして編成しました (ただし、各項目の一意のキーを持つ「bookidfield」入力は例外です)。必要なクエリのみが実行されます。
「タイトル」および「作成者」フィールドは正常に機能します。問題なく新しい値に更新されます。ただし、「説明」フィールドは常に「ブック ID フィールド」の値に更新されます。':bookid' パラメータを必要な本の ID に手動で変更すると、修正できます。
var_dump(_$POST)
次のように、正しいキー値が得られたと思われる場合:
array(4) { ["Title"]=> string(22) "Gross Boogers and Such" ["Author"]=> string(14) "Franny Panties" ["Description"]=> string(55) "This is the value I want to change the description to!!" ["bookidfield"]=> string(3) "184" }
しかし、私の SQL テーブルでは、書籍 184 のタイトルが「Gross Boogers and such」に、著者が「Franny Panties」に変更されますが、説明は「184」に変更されます。これは私の bindValue() の使用と関係があるはずですよね? それとも私のループと関係がありますか?フォームの名前の付け方ですか?私はそれが何であるかを見るためにあまりにも長い間それを見てきました。
Stackoverflow に感謝します。