php - 如何在 PHP 中创建动态 MySQL 更新查询

标签 php mysql pdo

这对我来说至少是一个稍微复杂的话题,我正在创建一个网站,该网站需要能够更新已输入其中并保存到数据库中的信息。我已经设法让它与单个属性一起有效工作,但我希望修改它以便能够更改任何选定的属性。将从名为 update.php 的页面的以下代码中的下拉菜单中选择所选属性

<form action="updatejob.php" method="POST">
            <label for="jobs_id">Job ID:</label><input type="text" name="jobs_id" />
            <select name="updatecategory">
                <option value="title">Title</option>
                <option value="category">Category</option>
                <option value="salary">Salary</option>
                <option value="location">Location</option>
                <option value="description">Description</option>
            </select>
            <label for="newcontent">Updated Information: </label><input type="text" name="newcontent" />
            <input type="submit" value="Submit" name="submit"/>
    </form>

我尝试编写的查询位于名为 updatejob.php 的文件中:

if(isset($_POST['jobs_id'])){
         $updatetitle= $pdo->prepare('UPDATE jobs SET :updatecategory  =  :newcontent WHERE jobs_id = :jobs_id');
         unset($_POST['submit']);
         $updatetitle->execute($_POST);
        header("Location:admin.php");
}

正如我上面提到的,当我将它设置为一个不在选择框中的特定属性时,它工作正常。之前我设置了它,因此用户只能使用文本框编辑记录的标题。老实说,我什至不确定这是否可行,或者我是否特别接近正确的处理方式,因此感谢所有帮助!

最佳答案

很有趣。 According to the PDO docs ,您不允许绑定(bind)列名等标识符,因此您需要在动态查询上使用一些变体,这通常会使您面临注入(inject)攻击。想到的最可靠的解决方案是有一个查找表索引 <select>列名称的值,用于在准备好的语句中“填充空白”。

column_lookup
+----------+----------+
| selval   | colname  |
+==========+==========+
| title    | title    |
| category | category |
| location | location |
| etc.     | etc.     |

然后你会做类似的事情

$colsql = "SELECT colname FROM column_lookup WHERE selval = :selval"
$colstmt = $dbh->prepare($colsql);
$res = $colstmt->execute(array(':selval' => $_POST['updatecategory']));

$updsql = "UPDATE jobs
             SET " . $res->fetchColumn(0) . " =  :newcontent
             WHERE jobs_id = :jobs_id";
$updstmt = $dbh->prepare($updsql);
$updstmt->bindValue(':newcontent', $_POST['newcontent'], PDO::PARAM_STR);
$updstmt->bindValue(':jobs_id', $_POST['jobs_id'], PDO::PARAM_whatever);
$updstmt->execute;

这具有通过准备语句清理所有输入的效果,同时仍然动态生成 UPDATE查询。

我的习惯是将错误处理作为练习留给读者。特别是,我省略了验证 jobs_id 的数据类型的任何尝试。 .

关于php - 如何在 PHP 中创建动态 MySQL 更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34245880/

相关文章:

mysql - 无法使用 SQL 表显示帖子标题

php mysql查询结果数组和foreach循环

PHP:在单例类中使用 MySQL 连接

php - 存在隐藏输入类型时不返回 POST 数据

php - jQuery .empty() 导致 AJAX 填充的 div 闪烁

php - jQuery 在 AJAX 加载页面中不起作用

mysql - 预期的 attr 类型 ('uint' 或 'timestamp' 或 'bigint')在 sql_attr_multi

php - PDO 连接数据库时出错

php - 使用 PHP 和 MySQL 连接到现有数据库时出错

php ADODB 在连接到 MySQL 之前调用 mysql_options()