-4

我真的不知道发生了什么。故事:我将 PDO 用于数据库上的 SELECT 语句。

$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()我会得到正确的值,但问题是并非每个值都是双精度值,而且也是整数或字符串。我也尝试使用 (string) 进行类型转换,但结果相同。我没有解释。

更新:

这是一个非常大的项目,我只是尽量减少它,并使我的问题尽可能清晰。但现在我发现了一些新东西:我在循环期间对 normTable 中的第一个变量执行了“echo()”:

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 编码,所以我的第一个想法是:内存泄漏 - 明确的情况!

谢谢你的帮助。

4

1 回答 1

0

嗯,我没有50声望;不能评论只回答。

如果在循环中将 a 替换为 be,您应该会得到预期的结果(给定数据样本)。IE:

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

但我不确定这是否真的能解决你的问题。YMMV。

于 2017-01-21T00:09:11.287 回答