PDO bindValue适用于其他输入,为什么不这个?

时间:2014-07-31 21:24:36

标签: php mysql sql 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'字段工作正常;他们更新没有问题的新值。但是,“描述”字段始终更新为“bookidfield”的值。如果我进去并手动将':bookid'参数更改为我想要的书的ID,我可以修复它。

如果我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()有关,对吧?或者它与我的循环有关?这是表格的名称吗?我一直在看它太长时间看不出它是什么。

感谢Stackoverflow,你们很棒。

2 个答案:

答案 0 :(得分:1)

问题是,当$ col与Title,Author或Description不同时,换句话说,当交换机执行默认情况时,您正在使用$ nowfield = 184执行上一个查询。您不能执行查询。

当switch执行默认情况时,你必须“跳转”到下一个值,跳过查询执行。

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

答案 1 :(得分:0)

您的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>