0

好的,这听起来可能很奇怪,但我有一个表格,我们的业务想要跟踪发生了什么变化,当用户添加新的潜在客户等时。

所以我设置了一个执行以下操作的函数

function savedata($data){
    $collection = $this->db->retail_logs;
    $this->data = explode('|', $data['data']);
    print_r($this->data);

    try {
    $collection->update(
        array($this->data['0']=>$this->data['1'],$this->data[2]=>$this->data[3]),
        array("date"=> date("d.m.Y"), "time"=>date("H:i:s"),"whochanged"=>$_COOKIE['CRMUIDkey']), // new lead document to insert
        array("upsert" => true, "safe" => true)
        );
    } catch (Exception $e) {
        // Something went wrong .. 
    }
}

它基本上是一个日志文件。

但是您可能会看到 $data 发送数据,例如 tradingname|ABC|owner|ownerID

但是如果我想补充一点,我需要运行一个循环或一个 foreach 我想知道什么是确保所有数据都被保存而不仅仅是 data[0] 到 3 的最佳方法,所以说他们发送 16 个字段和其中的值我需要一个 foreach 或其他东西来拆分它。

4

2 回答 2

0

以 json 格式发送您的数据。然后使用json_decode将其转换为您想要的数组。

于 2012-07-25T02:09:07.720 回答
0

看来您想将 映射$data['data']到 key=>value 对(关联数组)。您需要非常小心您允许使用这种格式的哪些字段,特别是因为它看起来像用户提供的数据(或者他们可以在发布请求中修改的数据?)。例如,如果您在执行 upsert 之前没有检查允许的密钥,恶意用户可能会更新或添加到另一个用户的帐户。

要转换$data您想要执行的字符串,例如:

<?php
    // Keys that can be updated
    $allowed = array('tradingname','owner');

    // Sample data    
    $data = 'tradingname|ABC|owner|ownerID|badkey|foo';

    // Split into arrays based on '|' delimiter
    preg_match_all("/([^\|]+)\|([^\|]+)/", $data, $keypairs);

    // Combine matches into key => value array
    $keypairs = array_combine($keypairs[1], $keypairs[2]);

    // Sanity check to create $criteria    
    foreach ($keypairs as $key => $value) {
        if (in_array($key, $allowed)) {
            // Perhaps do some extra sanity checking that $value is expected format
            $criteria[$key] = $value;
        } else {
            // Log and/or bailout as appropriate
            echo "Ignoring: [$key] => [$value]\n";
        }
    }

    // Criteria should now be reasonable to use in $collection->update(..) upsert
    print_r($criteria);
?>
于 2012-07-28T22:44:32.680 回答