PDObindValue работает для других входов, почему не для этого?

StackOverflow https://stackoverflow.com//questions/25069178

Вопрос

Я создаю форму, в которой пользователи могут обновлять атрибуты книг.Существует динамически создаваемая 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

Я организовал его как оператор переключения, потому что в форме есть код, который передает только те поля, которые были изменены в сообщении (за исключением ввода «bookidfield», который имеет уникальный ключ для каждого элемента в нем). коммутатор, выполняются только необходимые запросы.

Поля «название» и «автор» работают нормально;они без проблем обновляются до новых значений.Поле «Описание», однако, всегда обновляется значением «Bookidfield». Я могу исправить это, если зайду и вручную изменить параметр «: книга» на идентификатор книги, которую я хочу.

Если я 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» на «Грубые бугеры и тому подобное» и автора «Франни Танти», но это изменит описание на «184.». Это должно иметь какое -то отношение к моему использованию BindValue (), верно?Или это связано с моим циклом?Это как форма называется?Я слишком долго смотрел на это, чтобы понять, что это такое.

Спасибо Stackoverflow, вы молодцы.

Это было полезно?

Решение

Ваша проблема в том, что $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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top