PDO bindValue работает для других входов, почему не этот?
Я строю форму, где пользователи могут обновлять атрибуты книг. Существует динамически генерируемая 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, потому что в форме есть код, который пропускает только те поля, которые были изменены в post (за исключением ввода "bookidfield", в котором есть уникальный ключ для каждого элемента в нем.) переключатель, только необходимые запросы запускаются.
Поля title и author работают нормально; они обновляются без проблем до новых значений. Поле 'description', тем не менее, всегда обновляется до значения 'bookidfield.' Я могу это исправить, если захожу и вручную изменяю параметр ': bookid' на идентификатор нужной мне книги.
Если я 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(), верно? Или это связано с моей петлей? Это как форма называется? Я смотрел на это слишком долго, чтобы увидеть, что это такое.
Спасибо Stackru, вы, ребята, великолепны.
2 ответа
Ваша проблема в том, что когда $col отличается от Title, Author или Description, другими словами, когда коммутатор выполняет случай по умолчанию, вы выполняете предыдущий запрос с $nowfield = 184. Вы не должны выполнять запрос.
Когда switch выполняет заданный по умолчанию регистр, вы должны "перейти" к следующему значению, пропустив выполнение запроса.
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>