-1

我有一个带有主键“id”和由 price_date、fund_id、currency_id 和 class_id 组成的唯一约束的数据库

$query = "INSERT INTO `price_data` (`price_date`, `fund_id`, `currency_id`, `class_id`, `nav`, `nav_change`) VALUES";


$format = " ('%s', '%s', '%s', '%s', %f, %f),";

// Go over each array item and append it to the SQL query
foreach($prices as $price) {
    $query .= sprintf(
        $format,
        $mysqli->escape_string($price['PriceDate']),
        $mysqli->escape_string($price['Fund']),
        $mysqli->escape_string($price['Currency']),
        $mysqli->escape_string($price['Class']),
        $mysqli->escape_string($price['NAV']),
        $mysqli->escape_string($price['NavChange'])
    );
}
// The last VALUES tuple has a trailing comma which will cause
// problems, so let us remove it
$query = rtrim($query, ',');

// MySQLi::query returns boolean for INSERT
$result = $mysqli->query($query);

我想将查询更改为类似

INSERT INTO `price_data`(price_date , fund_id , currency_id , nav , nav_change) VALUES () ON DUPLICATE KEY UPDATE nav='',nav_change='';

我尝试将其附加到原始查询中并没有将 nav 和 nav_chnge 的值添加到查询中。

$query .= ' ON DUPLICATE KEY UPDATE nav=$format$mysqli->real_escape_string($data[\'NAV\']),nav_change=$format,$mysqli->real_escape_string($data[\'NavChange\'])';

如果我回显生成的查询,它看起来像以下

INSERT INTO `price_data` (`price_date`, `fund_id` , `currency_id`, `class_id`, `nav`, `nav_change`) VALUES ('2013-04-29', 'AAAA', '0', 'A', 11.793300, 0.054000), ON DUPLICATE KEY UPDATE nav=$format$mysqli->real_escape_string($data["NAV"]),nav_change=$format,$mysqli->real_escape_string($data["NavChange"])

谢谢你的帮助。

4

1 回答 1

0

可能有一种更简洁的方法可以做到这一点,但是在循环内附加到这样的查询对我有用。

$format = " ('%s', '%s', '%s', '%s', '%s', %f, %f)";
$format_update_nav = "  '%f' ,  ";
$format_update_nav_change = "  '%f'  ; ";       


$query = "INSERT INTO `aprice_data` (`price_date`, `fund_id`, `manager_id` , `currency_id`, `class_id`, `nav`, `nav_change`) VALUES ";

                    $query .= sprintf(
                        $format,
                        $mysqli->real_escape_string($data['Date']),
                        $mysqli->real_escape_string($data['Fund']),
                        $mysqli->real_escape_string($data['Manager']),      
                        $mysqli->real_escape_string($data['Currency']),
                        $mysqli->real_escape_string($data['Class']),
                        $mysqli->real_escape_string($data['NAV']),
                        $mysqli->real_escape_string($data['NavChange'])
                    );

                    $query .= ' ON DUPLICATE KEY UPDATE nav = ';
                    $query .= sprintf(
                        $format_update_nav,
                        $mysqli->real_escape_string($data['NAV'])                       
                    );

                    $query .= 'nav_change = ';
                    $query .= sprintf(
                        $format_update_nav_change,
                        $mysqli->real_escape_string($data['NavChange'])                 
                    );


    $result = $mysqli->query($query);

这返回了一个看起来像这样的查询

INSERT INTO `price_data` (`price_date`, `fund_id`, `manager_id` , `currency_id`, `class_id`, `nav`, `nav_change`) VALUES ('2013-05-03', 'WXYA', '17', '0', 'A', 456456.000000, 456456.000000) ON DUPLICATE KEY UPDATE nav = '456456.000000' , nav_change = '456456.000000' ; 
INSERT INTO `price_data` (`price_date`, `fund_id`, `manager_id` , `currency_id`, `class_id`, `nav`, `nav_change`) VALUES ('2013-05-03', 'BXYA', '17', '0', 'A', 0.130000, 0.000000) ON DUPLICATE KEY UPDATE nav = '0.130000' , nav_change = '0.000000' ; . . . 
于 2013-05-07T14:44:37.050 回答