【问题标题】:PHP: Incorrect value after assignmentPHP:分配后的值不正确
【发布时间】:2017-06-06 01:20:02
【问题描述】:

我真的不知道发生了什么。故事: 我将 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'] 我得到错误的值。实际上这应该是 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 编码的,所以我的第一个想法是:内存泄漏 - 清除案例!

感谢您的帮助。

【问题讨论】:

  • 但是你想做什么?
  • 我从我的数据库中读出一个数组并将其排序到另一个数组中以在我的代码中使用它:我有类别(pe 1176),每个类别可以通过一定的表现获得1-3分。 ..
  • 最小的例子?你需要一个数据库来重现这个问题吗?

标签: php pdo weak-typing


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,但是这只是减少示例的错误。你是对的,但这并不能解决问题。
猜你喜欢
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多