Pergunta

Eu estou construindo um formulário onde os usuários podem atualizar atributos de livros.Há um HTML gerado dinamicamente pelo formulário onde o usuário pode inserir novos valores para coisas como "Título", "Autor" e "Descrição" que olha alguma coisa como isto:

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."' />";

Este formulário é tratada por alguns php, que tem esta aparência:

        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

Eu já organizado como uma instrução switch, porque há um código no formulário que passa apenas os campos que foram alterados através de um post (com exceção do 'bookidfield de entrada, que tem a chave exclusiva para cada item.) Com a mudança, apenas o necessário executar consultas.

O 'título' e 'autor' campos de trabalho bem;eles atualização sem problema para os novos valores.O campo "descrição", embora, sempre atualiza o valor do " bookidfield.' Eu posso corrigi-lo se eu entrar e alterar manualmente a ':bookid' parâmetro para a identificação do livro que eu quero.

Se Eu var_dump(_$POST) ele parece vir com a tecla direita valores, como:

    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" }

Mas na minha tabela de SQL, ele vai mudar o título do livro de 184 para "Bruto Neurónios e Tal" e que o autor "Franny Calcinha," mas ele vai alterar a descrição para "184." Ele tem de ter algo para fazer com o meu uso de bindValue(), certo?Ou será que tem a ver com o meu ciclo?É como o formulário é o nome?Eu estive olhando para ele por muito tempo para ver o que quer que seja.

Graças Stackoverflow, vocês são ótimos.

Foi útil?

Solução

O problema é que, quando o $col é diferente para o Título, o Autor ou a Descrição, em outras palavras, quando o switch executa o padrão, caso você executar a consulta anterior, com us $nowfield = 184.Você não deve executar a consulta.

Quando o parâmetro execute o caso padrão, você deve "saltar" para o próximo valor, ignorando a execução da consulta.

default:
    echo "Invalid input";
    next($_POST);
    continue 2;
    break;

Outras dicas

O HTML é interrompida para o Descrição <textarea>.Você tem...

<textarea ... name=Description id=Description />".$item['Description']."</textarea>
<!--                                          ^ there's your problem -->

Onde deve ser

<textarea ... name=Description id=Description>".$item['Description']."</textarea>

Como mencionei em meu comentário, a maneira que você está gerando HTML é obrigado a levar a problemas.Eu sugiro que você dê essa abordagem...

// 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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top