Domanda

Sto costruendo un modulo in cui gli utenti possono aggiornare gli attributi dei libri. C'è un modulo HTML generato dinamicamente in cui gli utenti possono inserire nuovi valori per cose come "Titolo", "Autore" e "Descrizione" che sembra un po 'come questo:

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

Questo modulo è gestito da alcuni PHP che sembra questo:

        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
.

L'ho organizzato come una dichiarazione di switch perché c'è il codice nel modulo che passa solo i campi che sono stati modificati attraverso il post (ad eccezione dell'input 'bookidfield', che ha la chiave unica per ogni elemento in esso .) Con l'interruttore, solo le query necessarie funzionano.

Il "titolo" e i campi "autore" funzionano bene; Aggiornano senza problemi ai nuovi valori. Il campo "Descrizione", tuttavia, si aggiorna sempre al valore del 'Bookidfield'. Posso aggiustarlo se vado e cambia manualmente il parametro ': bookID' all'ID del libro che voglio.

Se I var_dump(_$POST) sembra passare attraverso i valori chiave giusti, come:

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

Ma nella mia tabella SQL, cambierà il titolo di Libro 184 a "Gross Boogers e tali" e l'autore a "Banny Manties", ma cambierà la descrizione a "184". Deve avere qualcosa a che fare con il mio uso di BindValue (), giusto? O ha a che fare con il mio loop? È come viene nominata la forma? Lo stavo guardando troppo a lungo per vedere qualunque cosa sia.

Grazie Stackoverflow, voi ragazzi siete grandi.

È stato utile?

Soluzione

Il tuo problema è, quando il $ Col è diverso da Titolo, Autore o Descrizione, in altre parole, quando lo switch esegue il caso predefinito che stai eseguendo la query precedente con $ Nowfield= 184. Non è necessario eseguire la query.

Quando l'interruttore esegue il custodia predefinita, è necessario "saltare" al valore successivo, saltando l'esecuzione della query.

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

Altri suggerimenti

Il tuo HTML è rotto per Descrizione <textarea>.Hai ...

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

dove dovrebbe essere

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


.

Come menzionato nel mio commento, il modo in cui stai generando HTML è destinato a portare a problemi.Ti suggerisco di prendere questo approccio ...

// 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>
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top