我使用PDO
将数据插入数据库。一切都很好,但我有点问题。让我举个例子,
//Perform a basic insert
$param contains the fields that must be inserted
$this->insert("user", array("id" => $param['id'], "name" => $param['name']));
现在这个插页工作得很完美,但是假设在param
数组中缺少字段$name
,我会收到通知:
未定义的索引
name
如何直接传递要插入的字段?在我的数组中,键代表列名,因此:id, name
,值是要插入数据库的内容。
这是我的插入方法:
public function insert($table, $data)
{
$fieldNames = implode("`, `", array_keys($data));
$fieldValues = ":" . implode(", :", array_keys($data));
$sth = $this->prepare("INSERT INTO $table (`$fieldNames`)
VALUES ($fieldValues)");
// Bind sui valori
foreach($data as $key => $value)
{
$sth->bindValue(":$key", $value);
}
return $sth->execute();
}
如何在不传递所有字段的情况下仅插入我需要的值并出错?
答案 0 :(得分:4)
我认为接受的答案是作弊。本身基本上没有意义,它也无法解决有问题的特定问题。
您的错误与您正在使用的功能无关。它只与您调用它的方式有关。
你需要的所有只是这样称呼它:
$this->insert("user", $param);
现有代码可以正确处理所有缺失的字段。
请注意,您的代码容易受到SQL注入攻击,请参阅The most fatal PDO code
答案 1 :(得分:1)
尝试使用此代码(字段 - 只是带有要保存的字段名称的数组)
// $param - array with parameters
// $fields - fields which we want to save, e.g. array('id', 'name')
$param = array_filter($param, function($k) use ($fields) {
return in_arrray($k, $fields);
}, ARRAY_FILTER_USE_KEY);
$this->insert("user", $param);
答案 2 :(得分:-4)
删除未定义的值的键。在函数开头使用此代码。
foreach ($data as $key => $value) {
if(!isset($data[$key])){
unset($data[$key]);
}
}