PDO在数组中重复值


PDO duplicate values in array

我需要从db获取一些货币id,这是我的代码

$arr = [];
$currency_codes = array("USD", "RUB");
$currency_codes_in = implode(',', array_fill(0, count($currency_codes), '?'));
$query = "SELECT `curr_id` FROM `dictionary_currency` WHERE `curr_code` IN (". $currency_codes_in .")";
$stmt = $db->prepare($query); 
foreach ($currency_codes as $k => $id) {
    $stmt->bindValue(($k+1), $id);
}
$stmt->execute();
$currencies = $stmt->fetchAll();
foreach($currencies as $currency)
{
    foreach($currency as $key => $value)
    {
        $arr[] = $value;
    }
}
print_r($arr);
exit();

这是$currencies阵列

Array
(
    [0] => Array
        (
            [curr_id] => 643
            [0] => 643
            [curr_code] => RUB
            [1] => RUB
        )
    [1] => Array
        (
            [curr_id] => 840
            [0] => 840
            [curr_code] => USD
            [1] => USD
        )
)

这是$arr

Array
(
    [0] => 643
    [1] => 643
    [2] => 840
    [3] => 840
)

我不明白为什么我在数组中得到重复的值,以及如何防止它?

PDO是一个数据库包装器,可以为您做很多事情。例如,

  • 在execute()中正确绑定输入值
  • 让您返回的数据已经是所需格式

所以事实上,你需要的代码比现在少两倍:

$currency_codes = array("USD", "RUB");
$currency_codes_in = implode(',', array_fill(0, count($currency_codes), '?'));
$query = "SELECT `curr_id` FROM `dictionary_currency` WHERE `curr_code` IN ($currency_codes_in)";
$stmt = $db->prepare($query); 
$stmt->execute($currency_codes);
$arr = $stmt->fetchAll(PDO::FETCH_COLUMN);

或者我宁愿建议把它做成

$query = "SELECT curr_code, curr_id FROM dictionary_currency WHERE `curr_code` IN ($currency_codes_in)";
$stmt = $db->prepare($query); 
$stmt->execute($currency_codes);
$arr = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);

循环有问题:

foreach($currencies as $currency) {
     foreach($currency as $key => $value) {
           $arr[] = $value;
     }
}

只需使用一个简单的

foreach($currencies as $currency) {
    $arr[] = $currency[0];
}

编辑#1:

使用您的$currencies和旧查询,我得到了以下内容:

Array
(
    [0] => Array
    (
        [curr_id] => 643
        [0] => 643
        [curr_code] => RUB
        [1] => RUB
    )
    [1] => Array
    (
        [curr_id] => 840
        [0] => 840
        [curr_code] => USD
        [1] => USD
    )
)
Array
(
    [0] => 643
    [1] => 643
    [2] => RUB
    [3] => RUB
    [4] => 840
    [5] => 840
    [6] => USD
    [7] => USD
)

我知道这个问题越来越老了。但这里有一个解决方案可以防止PDO中的重复值。只是使用这个:

$stmt->fetchAll(PDO::FETCH_ASSOC);

取而代之的是:

$stmt->fetchAll();

使用以下查询$query="SELECT DISTINCT curr_id FROM dictionary_currency WHERE curr_code IN(".$currency_codes_IN.")";