Pregunta

Estoy construyendo un formulario donde los usuarios pueden actualizar los atributos de los libros.Hay un HTML generado de forma dinámica formulario donde los usuarios pueden introducir valores nuevos para cosas como "Título", "Autor" y "Descripción" que se ve algo como esto:

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 formulario es manejado por algunos de php que se parece a esto:

        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

He organizado como una instrucción switch, porque no hay código en el formulario que sólo pasa a los campos que se han cambiado a través de en el post (con la excepción de la 'bookidfield' de entrada, que tiene la clave única para cada elemento en él.) Con el interruptor, solo la ejecución de consultas.

El 'título' y 'autor' campos de trabajo de multa;que la actualización sin problemas a los nuevos valores.El campo "descripción", aunque, siempre actualiza el valor de la 'bookidfield.' Que se puede arreglar si puedo entrar y cambiar manualmente el ':bookid' parámetro el id del libro que yo quiero.

Si Me var_dump(_$POST) parece venir a través de con la tecla derecha de los valores, así:

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

Pero en mi tabla de SQL, que va a cambiar el título de libro de 184 a "Bruto Mocos y Tal" y el autor de "Franny Bragas," pero va a cambiar la descripción de "184." Es necesario tener algo que ver con mi uso de bindValue(), derecho?O tiene que ver con mi bucle?Es cómo la forma se denomina?He estado mirando demasiado tiempo para ver lo que es.

Gracias Stackoverflow, ustedes son grandes.

¿Fue útil?

Solución

Su problema es que, cuando el $col es diferente para el Título, el Autor o la Descripción, en otras palabras, cuando el interruptor se ejecuta el caso por defecto se va a ejecutar la consulta anterior con $nowfield = 184.Usted no debe ejecutar la consulta.

Cuando el interruptor de ejecutar el caso por defecto, debe "saltar" a la próxima valor, omitiendo la ejecución de la consulta.

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

Otros consejos

El HTML es roto por el Descripción <textarea>.Usted tiene...

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

Donde debe estar

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

Como lo mencioné en mi comentario, la forma en que está generando HTML está obligado a llevar a problemas.Te sugiero que te tomes este enfoque...

// 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top