我试图基于Jeffery在laracast上的INSERT查询在PHP中编写可重用的UPDATE查询
这是Jeff的插入查询
public function insert($table, $parameters)
{
$sql = sprintf(
'INSERT INTO %s (%s) VALUES (%s)',
$table,
implode(', ', array_keys($parameters)),
':' . implode(', :', array_keys($parameters))
);
try {
$statement = $this->pdo->prepare($sql);
$statement->execute($parameters);
} catch (Exception $exception) {
die("Something Went Wrong");
}
}
这是我正在尝试编写的更新代码
public function update($table, $parameters, $Condition)
{
$sql = sprintf(
'UPDATE %s SET %s=%s WHERE ' . $Condition,
$table,
implode('=,', array_keys($parameters))
,
':' . implode(', :', array_keys($parameters))
);
try {
$statement = $this->pdo->prepare($sql);
$statement->execute($parameters);
} catch (Exception $exception) {
die("Something Went Wrong");
}
}
我想通过传递
中的数据使其像Insert Query一样可重用所有帮助都经过高度评价
答案 0 :(得分:0)
这是非常糟糕的主意。不要这样做。
相反,我建议为您的实体创建自定义data mappers,其中包含手工制作的SQL,并使用正确绑定的参数/值。
但作为一项实验,我想出了这个:
public function update($table, $parameters, $conditions)
{
$sql = sprintf(
'UPDATE %s SET %s WHERE %s',
$table,
implode(', ',array_map(
function ($key) {
return "{$key} = :s_{$key}";
},
array_keys($parameters)
)),
implode(' AND ',array_map(
function ($key) {
return "{$key} = :w_{$key}";
},
array_keys($conditions)
))
);
$parameters = array_combine(
array_map(function($key){ return ":s_{$key}"; }, array_keys($parameters)),
$parameters
) + array_combine(
array_map(function($key){ return ":w_{$key}"; }, array_keys($conditions)),
$conditions
);
try {
$statement = $this->pdo->prepare($sql);
$statement->execute($parameters);
} catch (Exception $exception) {
die("Something Went Wrong");
}
}
请记住,是您的用户"可能以某种方式影响$parameters
或$conditions
数组的键,然后此代码容易受到SQL注入攻击。
<强> P.S。强>
在原始示例中,您将$Condition
参数简单地连接到查询的末尾。这将造成SQL注入攻击的巨大风险。
答案 1 :(得分:0)
这是一种有效的[1]方法,可以从具有命名参数的字段名称数组生成UPDATE语句, 可以使用任意数据(例如,使用PDOStatements)执行。
[1]高效:它独家使用sprintf
进行插值,无需级联。
适应症:
我们都是成年人,可以在上述适应症适用时自行决定。
如果您有一个关联数组,那么只需先获取它的array_keys。
$tablename = 'character';
$fields = [
'name',
'class',
'hitpoints',
'battlecry'
];
$first = array_pop($fields);
$fmt = array_reduce($fields, function($carry, $item) {
return sprintf($carry, sprintf(', %1$s = :%1$s %%s', $item));
}, sprintf(' SET %1$s = :%1$s %%s', $first));
$sql = sprintf('UPDATE %s %s ', $tablename, sprintf($fmt, ';'));
echo $fmt; // UPDATE character SET battlecry = :battlecry , name = :name , class = :class , hitpoints = :hitpoints ;