【问题标题】:update specific row based on user selection using PDO via php issue通过 php 问题使用 PDO 根据用户选择更新特定行
【发布时间】:2015-11-16 12:09:43
【问题描述】:

我正在尝试根据用户输入更新我的 sql 表。因此,用户从选择列表中选择他们想要更新的列。然后他们输入行中的数据,然后输入他们想要更新的数据。所以说选择列团队名称,然后将通过文本框输入他们想要更改的团队名称,然后通过另一个文本框输入新名称。无论如何,这就是我想要实现的目标。

我尝试从用户删除数据的位置复制并粘贴我的代码并对其进行修改。我尝试了一些不同的东西,我尝试的第一件事给了我这个错误:

更新团队 SET Rockets = :value1 WHERE teamname = rockets SQLSTATE [42S22]:未找到列:1054 'where 子句'中的未知列 'rockets'

我的 sql 语句如下所示:

$sql = "UPDATE teams SET $selectData = :value1  WHERE $columnSelect = $selectData";

然后,我尝试做这样的事情:

下面的整个代码,如上所述,我用$sql 变量尝试了几种不同的方法:

php

<?php

    if ($_SERVER["REQUEST_METHOD"] == "POST"){ 

        $servername = "localhost";
        $username = "";
        $password = "";
        $dbname = "";
        $columnSelect = $_POST['selectColumn2'];
        $selectData = $_POST['selectData'];
        $updateData = $_POST['updateData'];

        try {
            $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
            // set the PDO error mode to exception
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            // sql to delete a record
            $sql = "UPDATE teams SET :value1 = :value2  WHERE $columnSelect = :value1";

            // use exec() because no results are returned
            $stmt = $conn->prepare($sql);
            $stmt->execute(array(':value1'=>$selectData, ':value2'=>$updateData));
            if ($stmt->rowCount() > 0) {
                echo 'Updated '.$stmt->rowCount().' rows';
            } else {
                echo 'No rows updated';
                }
        }
        catch(PDOException $e)
            {
            echo $sql . "<br>" . $e->getMessage();
            }

        $conn = null;
    }
?>

html

        <form method='post' action='addData.php'>
            Select a column name, then enter which data to update.
            <br>
            <br>
            <label for='option2'>
                <select name='selectColumn2'>
                    <option value='teamname' id='team2'>teamname</option>
                    <option value='city' id='city2'>city</option>
                    <option value='bestplayer' id='best2'>bestplayer</option>
                    <option value='yearformed' id='year2'>year</option>
                    <option value='website' id='website2'>website</option>
                </select>
            </label>    
            <label for='option2'>
                select data to change: <input type='text' name='selectData'>
                enter new data: <input type='text' name='updateData'>
            </label>
            <br><br>
            <input type='submit' value='Submit New Entry'>
        </form>

基本上我要做的是取$columnSelect,在该列中找到$selectData,然后使用PDO方法将其替换为$updateData。我做错了什么?

【问题讨论】:

  • 列名和表名不能参数化(据我所知)。当涉及到这些元素时,您必须找到一种不同的方法来过滤用户输入。

标签: php


【解决方案1】:

这应该可以工作:UPDATE teams SET $columnSelect = :value1 WHERE $columnSelect = $selectData

【讨论】:

    【解决方案2】:

    像这样更改您的查询,

    $sql = "UPDATE teams SET `$selectData` = ':value1'  WHERE `$columnSelect` = '$selectData'";
    

    在插入或更新时为字符串值添加单引号。并为表名或列名添加了反引号。

    编辑

    $sql = "UPDATE teams SET `$columnSelect` = ':value1'  WHERE `$columnSelect` = '$selectData'";
    

    【讨论】:

    • 我可能做错了什么,更新团队 SET rockets = ':value1' WHERE teamname = 'rockets' SQLSTATE[42S22]: 未找到列:1054 中的未知列 'rockets' '字段列表'............我100%在列队名下有一行数据'火箭'......因为火箭不是一个列名,只是我想要更新的行,我应该省略反击......
    • 你的表中有rockets 的列名吗??
    • 不,我有一个名为 teamname 的列,有 4 行,第一行是 team/data 'rockets'..... 所以列名是 teamname,我要更新的数据是将“火箭”更新为游侠。在这种情况下,$columnSelect 用于列名,$selectData 用于火箭,变量 $updateData 用于护林员。我想在“teamname”列中将“rockets”更新为“rangers”
    • 根据您的查询,您应该有一个名为 rockets 的列。
    • 那我有点倒退了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2016-06-27
    • 2015-04-14
    • 2014-03-20
    • 1970-01-01
    • 2017-07-02
    • 2011-05-28
    相关资源
    最近更新 更多