【问题标题】:PDO::FETCH_ASSOC only returning first digit of integerPDO::FETCH_ASSOC 只返回整数的第一位
【发布时间】:2019-12-30 19:06:14
【问题描述】:

我正在使用 fetch(PDO::FETCH_ASSOC) 从 SQL 查询中返回多行。此函数仅返回整数列的第一个数字。例如,我期待“59”,我得到“5”返回。我写的查询返回四列,其中三列是整数,一列是字符串(varchar)。字符串列正在工作,但整数列在第一个数字之后被截断。

此代码嵌套在更高级别的查询中,我成功地提取了查询中使用的变量。

为了确定问题,我回显输出并将其与我在 MySQL 中运行 SQL 语句时得到的结果进行比较。

正确数据:

数据不正确:

$picksQry = $dbcnx->prepare("SELECT gi.gameNo AS gameNo
    , p.pickCD as pickCD
    , t.teamName as teamName
    , p.isLock as isLock

    FROM NCF_gamesInLeague gi JOIN NCF_games g ON gi.gameID = g.gameID
    JOIN ALL_usersInLeague ui ON gi.leagueID = ui.leagueID
    LEFT JOIN NCF_picks p ON gi.gilID = p.gilID AND p.uilID = :uilIDZ
    LEFT JOIN ALL_teams t ON p.pickCD = t.teamCD

    WHERE g.weekID = :week
    AND g.season = :year
    AND ui.userID = :usersID
    AND ui.leagueID = :leagueID

    ORDER BY gameNo ASC");

$picksQry->execute(array(
    ':uilIDZ' => $uilIDZ
, ':week' => $week
, ':year' => $year
, ':usersID' => $userIDZ[$leagueCnt][$userCnt]
, ':leagueID' => $leagueID[$leagueCnt]
));

$picksRow = $picksQry->fetch(PDO::FETCH_ASSOC);

$picksCnt = 1;

while ($picksRow == true) {
    $gameNo[$leagueCnt][$userCnt][$picksCnt] = $picksRow['gameNo'];
    $pickCD[$leagueCnt][$userCnt][$picksCnt] = $picksRow['pickCD'];
    $teamName[$leagueCnt][$userCnt][$picksCnt] = $picksRow['teamName'];
    $isLock[$leagueCnt][$userCnt][$picksCnt] = $picksRow['isLock'];
    $picksRow = $picksQry->fetch(PDO::FETCH_ASSOC);

    $picksCnt++;

}

这个查询的第一行应该是“1”“59”“Miami FL”“0”,但我得到的是“5”而不是“59”;并且随着循环的进行,任何大于 10 的数字只会返回它的第一个数字。

编辑:我按照下面的建议添加了 print_r($picksRow) 并获得了我期望的数组,但是回显的数据仍然不正确。 我更新了代码以包含 print_r 以查看数组。数组是正确的,但回显的数据仍然不正确: 数组:( [gameNo] => 1 [pickCD] => 59 [teamName] => Miami FL [isLock] => 0 )
数据:游戏编号 =1 | pickCD = 5 | teamName = 迈阿密佛罗里达 | isLock = 0

while 循环现在是:

while ($picksRow = $picksQry->fetch(PDO::FETCH_ASSOC)) {

                print_r($picksRow);

                $gameNo[$leagueCnt][$userCnt][$picksCnt] = $picksRow['gameNo'];
                $pickCD[$leagueCnt][$userCnt][$picksCnt] = $picksRow['pickCD'];
                $teamName[$leagueCnt][$userCnt][$picksCnt] = $picksRow['teamName'];
                $isLock[$leagueCnt][$userCnt][$picksCnt] = $picksRow['isLock'];

                echo '&nbsp &nbsp &nbsp &nbsp &nbsp GameNo ='.$gameNo[$leagueCnt][$userCnt][$picksCnt]
                    .' | pickCD = '.$pickCD[$leagueCnt][$userCnt][$picksCnt]
                    .' | teamName = '.$teamName[$leagueCnt][$userCnt][$picksCnt]
                    .' | isLock = '.$isLock[$leagueCnt][$userCnt][$picksCnt].'<br>';

                $picksCnt++;    

            }

【问题讨论】:

  • 这没有意义。告诉我们你如何echo 结果,尝试print_r($picksRow) 并检查查询返回的值是什么
  • 您的while 声明不正确。我认为您当前的实现会产生无限循环。应该是while ($picksRow = $picksQry-&gt;fetch(PDO::FETCH_ASSOC)) {。删除$picksRow = $picksQry-&gt;fetch(PDO::FETCH_ASSOC);。
  • @waterloomatt while 陈述正确,奇怪但正确。
  • “您的 while 语句不正确。我认为您当前的实现会产生无限循环” @waterloomatt 不,它不会无限循环.. 但我同意这样做@ 987654334@ 并从循环结构中删除 $picksRow = $picksQry-&gt;fetch(PDO::FETCH_ASSOC); 会更有意义..

标签: php mysql pdo


【解决方案1】:

我相信找到了问题。它似乎与我如何命名变量有关。我有一个较早的变量,名为“$pickCD[$leagueCnt][$gi]”,后来还有一个变量“$pickCD[$leagueCnt][$userCnt][$picksCnt]”。我将后面的变量重命名为 $pickCDX 并且它工作正常。 Bambo、waterloomatt 和 Raymond,感谢您在发现此错误时为我指明了正确的方向。

我不确定这对我的输出有何影响,因为 $pickCD[1][1] 与 $pickCD[1][1][1] 不同吗?也许有更多智慧的人可以解释一下.无论如何,请注意如何命名变量,尤其是在嵌套循环语句中。

【讨论】:

  • 如果$pickCD[1][1] 是字符串数据类型,那么$pickCD[1][1][1] 将是该字符串中的第二个字符。所以如果$pickCD[1][1] === "123";然后$pickCD[1][1][1] = "2"(因为第一个是$pickCD[1][1][0])。
  • PHP中的所有SQL数据都导入为string类型。
  • 欣赏解释,马丁。这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2013-03-06
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2017-04-17
相关资源
最近更新 更多