PDO BindValueは他の入力に機能します。なぜこれはなぜですか?
質問
ユーザーが本の属性を更新できるフォームを構築しています。ユーザーが「tigrant」、「著者」、および「説明」のようなものに新しい値を入力できる動的に生成された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
.
POSTで変更されたフィールドを渡すコードがある形式のコードがあるため、( 'BookidField'入力を除く)のコードが整理されているため、その中の各項目の固有のキーがあるためです。 。)スイッチを使用すると、必要なクエリだけが実行されます。
「タイトル」と「著者」のフィールドは大丈夫です。彼らは新しい値に問題なしに更新されます。 「説明」フィールドは、常に「BookIdField」の値を更新します。私が行くと手動で ':boodid'パラメータを手動で変更した場合、私が欲しい本の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など」に変更し、著者は「Franny Panties」という著者ですが、「184」に変更します。私のBindValue()を使って何をするべきかを持っています。それとも私のループと関係がありますか?フォームの名前はどのように名前されていますか?私はそれが何であれでもそれを見るには長すぎて見ていました。
ありがとうスタックオーバーフロー、あなたはみんな素晴らしいです。
解決
問題は、$ COLがタイトル、作成者または説明と異なる場合、つまりスイッチがデフォルトのケースを実行したときに、$ NOWFIELD= 184で前のクエリを実行している場合は、クエリを実行しないでください。
スイッチがデフォルトの場合を実行すると、次の値に「ジャンプ」し、クエリの実行をスキップする必要があります。
default:
echo "Invalid input";
next($_POST);
continue 2;
break;
. 他のヒント
HTMLは説明 <textarea>
で壊れています。あなたは持っています...
<textarea ... name=Description id=Description />".$item['Description']."</textarea>
<!-- ^ there's your problem -->
.
<textarea ... name=Description id=Description>".$item['Description']."</textarea>
.
私のコメントに述べたように、HTMLを生成している方法は問題につながるためにバインドされています。私はあなたがこのアプローチを取ることを提案する...
// leave the PHP context
?>
<form id="changerform" action="updatesubmit.php" method="post">
<span id="titlebox">
Title:
<input class="attributefield" type="text" id="Title" value="<?= htmlspecialchars($item['Title']) ?>">
Change This?
</span>
<!-- you get the idea -->
</form>
.