在缺少的字段中动态插入PDO

时间:2016-03-08 15:51:37

标签: php pdo

我使用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();
}

如何在不传递所有字段的情况下仅插入我需要的值并出错?

3 个答案:

答案 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]);
    }
}