我正在尝试基于在laracast上的Jeffery的INSERT查询在PHP中编写可重用的UPDATE查询
这是杰夫的插入查询
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");
}
}
我想通过仅将数据传递给它,使其与插入查询一样可重用。
高度重视所有帮助
最佳答案
这真是个坏主意。不要这样
相反,我建议为您的实体创建自定义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注入攻击。附言
在原始示例中,您已将
$Condition
参数简单地连接到查询的末尾。这将带来SQL注入攻击的巨大风险。