【发布时间】:2021-10-08 14:18:32
【问题描述】:
我正在一个网站上工作,我可以通过多种不同的形式接受用户数据以更新数据库中的表,而不是为每个表编写单独的函数,我认为使用字符串连接和 for 循环编写是个好主意为我准备的 SQL 语句。基本上它需要 4 个参数,一个表、id、需要更新的列(参数)和一个用户输入数组。我相信我非常接近我需要的东西,但它无法执行并给我一个错误
SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '(
name,comment) VALUES ('sadf','asdf') WHEREmusic_work_ID=14' 附近使用正确的语法
这是我打印出 $sql 时显示的内容,
sql = UPDATE music_work SET (
name,comment) VALUES (:name,:comment) WHEREmusic_work_ID=14
我不知道是否有更好的方法来创建这样的东西,或者我没有使用正确的语法,但现在我陷入了僵局。
function music_work_update($userInput, $userID_selection){
foreach ($userInput as $k => $v) {
if($userInput[$k] === '') {
unset($userInput[$k]);
}
}
update("music_work", $userID_selection, ["name", "comment"], $userInput);
}
function update($table, $userID_selection, $params, $input){
$conn = connect();
try {
$sql = "UPDATE ".$table." SET (";
for ($i = 0; $i < sizeof($params); $i++) {
$sql .= "`".$params[$i]."`,";
}
$sql = substr_replace($sql ,"", -1);
$sql .= ") VALUES ( ";
for ($i = 0; $i < sizeof($params); $i++) {
$sql .= ":".$params[$i].",";
}
$sql = substr_replace($sql ,"", -1);
$sql .= ") WHERE `music_work_ID`=$userID_selection";
echo ("sql = $sql <br>");
$command = $conn->prepare($sql);
for ($i = 0; $i < sizeof($params); $i++) {
$command->bindParam(':'.$params[$i], $input[$params[$i]], PDO::PARAM_STR);
}
if ($command->execute()) {
echo "<script type= 'text/javascript'>alert('New Record Inserted Successfully');</script>";
}
else{
echo "<script type= 'text/javascript'>alert('Data not successfully Inserted.');</script>";
}
echo "failed before execute";
$conn = null;
}
catch(PDOException $e)
{
echo ($e->getMessage());
}
}
【问题讨论】:
-
该查询对 SQL 注入开放。为什么要绑定除一个用户提供的变量之外的所有变量?