2017-01-20 7 views
-4

Я действительно не знаю, что происходит. История: Я использую PDO для оператора SELECT в базе данных.PHP: неправильное значение после присвоения

$sql = "SELECT a,b,c,performance,points,compare 
     FROM normvalues 
     WHERE x=:x AND y=1 AND z=:z"; 
$stmt = $GLOBALS['PDO']->prepare($sql); 
$stmt->bindParam(":x",$x); 
$stmt->bindParam(":z",$z); 
$stmt->execute(); 
$res=$stmt->fetchAll(PDO::FETCH_ASSOC); 

Так что все в порядке, и оно работает. Когда я var_dump переменная $res я получаю что-то вроде:

array(6) { 
    ["a"]=> string(2) "44" 
    ["b"]=> string(4) "1176" 
    ["c"]=> string(4) "1166" 
    ["performance"]=> string(4) "50.1" 
    ["points"]=> string(1) "1" 
    ["compare"]=> string(2) "-1" 
    } 
    [1]=> 
    array(6) { 
    ["a"]=> string(2) "57" 
    ["b"]=> string(4) "1176" 
    ["c"]=> string(4) "1166" 
    ["performance"]=> string(4) "47.7" 
    ["points"]=> string(1) "2" 
    ["compare"]=> string(2) "-1" 
    } 
    [2]=> 
    array(6) { 
    ["a"]=> string(2) "70" 
    ["b"]=> string(4) "1176" 
    ["c"]=> string(4) "1166" 
    ["performance"]=> string(4) "44.7" 
    ["points"]=> string(1) "3" 
    ["compare"]=> string(2) "-1" 
    } 
    ... 

Это тоже хорошо. Но я должен сортировать результат по-другому. Так что я делаю:

foreach($res as $e){ 
     $this->normTable[$e['a']][$e['points']]=$e['performance']; 
     $this->normTable[$e['a']]['compare']=$e['compare']; 
    } 

И теперь я полностью потерян. Назначая $e['performance'], я получаю неправильные значения. На самом деле это должно быть значение .

[1176]=> 
    array(4) { 
    [1]=> string(2) "50" 
    ["compare"]=> string(2) "-1" 
    [2]=> string(2) "48" 
    [3]=> string(2) "45" 
    } 

Я уже проверил значения в базе данных, и они верны. Делая doubleval(), я получаю правильные значения, но проблема в том, что не каждое значение является двойным, но также целым или строковым. Я также попытался придать тип (строка), но это тот же результат. У меня нет объяснений.

Update:

Это очень большой проект, и я просто попытался свести его к минимуму, насколько это возможно и сделать мою проблему как можно четче. Но теперь я понял, что-то новое: я делаю «эхо()» моей первой переменной в normTable во время цикла:

foreach($res as $e){ 
$this->normTable[$e['a']][$e['points']]=$e['performance']; 
echo "a:".$e['a']." pt: ".$e['points']." perf: ".$e['performance']."-".$this->normTable[1176][1]."\n"; 
$this->normTable[$e['a']]['compare']=$e['compare']; 
} 

и значение меняется от '50 .1' до „50“. Все еще не могу понять причину. Существует ли ограничение размера массивов на PHP?

ОБНОВЛЕНИЕ 2 и большое ИЗОБРАЖЕНИЕ!

Как я уже сказал, это большой проект. Таким образом, таблица, которую я читал, имеет несколько значений для некоторых атрибутов два или более. На самом деле такого случая не должно быть. Вот почему ответ прост: он стал 50, потому что 50 было назначено. Мне очень жаль, что ты оставил свое время. Но я полностью исключил этот случай, и, поскольку я также кодирую в C, моя первая мысль была: утечка памяти - ясный случай!

Благодарим за помощь.

+3

Но что вы пытаетесь сделать? – user2182349

+0

Я прочитал массив из моей базы данных и отсортировал его в другом массиве, чтобы использовать его в своем коде: у меня есть категории (p.e. 1176), и каждая категория может получить 1-3 балла по определенной производительности ... – user3240316

+2

минимальный пример? вам нужна база данных для воспроизведения проблемы? –

ответ

0

Мех, у меня нет репутации 50; не может комментировать только ответ.

Если вы замените a, находясь в своем цикле, вы должны получить ожидаемый результат (с учетом вашего образца данных). I.e .:

foreach($res as $e){ 
    $this->normTable[$e['b']][$e['points']]=$e['performance']; 
    $this->normTable[$e['b']]['compare']=$e['compare']; 
} 

Но я не уверен, что это действительно решает вашу проблему. YMMV.

+0

Спасибо, но это просто ошибка, уменьшив пример. Вы правы, но это не решение проблемы. – user3240316