这对我来说至少是一个稍微复杂的话题,我正在创建一个网站,该网站需要能够更新已输入其中并保存到数据库中的信息。我已经设法让它与单个属性一起有效工作,但我希望修改它以便能够更改任何选定的属性。将从名为 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/