【问题标题】:Displaying one string from a list of multiple strings从多个字符串列表中显示一个字符串
【发布时间】:2025-12-08 02:05:02
【问题描述】:

我正在尝试从该数组中获取数据,但是当我执行 var_dump($ArrayedLevels['Attack']); 时它返回 NULL,我知道它能够从 SQL 数据库中获取数据,我认为它有一些东西与我的阵列有关。任何帮助将不胜感激。

include("highscoresconfig.php");

$GrabXP = $database2->prepare("SELECT * FROM `skills` WHERE `playerName` = ?");
$GrabXP->execute(array($playerName));
$MainResult = $GrabXP->fetchAll();

$ArrayedLevels = $array = [
    "Attack" => $MainResult['Attacklvl'],
    "Defence" => $MainResult['Defencelvl'],
    "Strength" => $MainResult['Strengthlvl'],
    "Hitpoints" => $MainResult['Hitpointslvl'],
    "Ranged" => $MainResult['Rangelvl'],
    "Prayer" => $MainResult['Prayerlvl'],
    "Magic" => $MainResult['Magiclvl'],
    "Cooking" => $MainResult['Cookinglvl'],
    "Woodcutting" => $MainResult['Woodcuttinglvl'],
    "Fletching" => $MainResult['Fletchinglvl'],
    "Fishing" => $MainResult['Fishinglvl'],
    "Firemaking" => $MainResult['Firemakinglvl'],
    "Crafting" => $MainResult['Craftinglvl'],
    "Smithing" => $MainResult['Smithinglvl'],
    "Mining" => $MainResult['Mininglvl'],
    "Herblore" => $MainResult['Herblorelvl'],
    "Agility" => $MainResult['Agilitylvl'],
    "Thieving" => $MainResult['Thievinglvl'],
    "Slayer" => $MainResult['Slayerlvl'],
    "Farming" => $MainResult['Farminglvl'],
    "Runecrafting" => $MainResult['Runecraftlvl'],
    "Hunter" => $MainResult['Hunterlvl'],
    "Construction" => $MainResult['Constructionlvl'],
    "Summoning" => $MainResult['Summoninglvl'],
    "Dungeoneering" => $MainResult['Dungeoneeringlvl'],
];
var_dump($ArrayedLevels["Attack"]);

【问题讨论】:

  • 如果您将代码块缩进四个空格(或在编辑器中选择并单击{} 按钮,或Ctrl+K),它将被正确格式化。
  • 啊,好的,谢谢克里斯。

标签: php arrays pdo


【解决方案1】:

问题可能是因为 fetchAll() 返回查询的所有行。

if($GrabXP->execute(array($playerName))){
    //Success
    $MainResult = $GrabXP->fetchAll();
    /*
    This will give you all the rows. Use a foreach loop to iterate through all the rows.
    If you want only the first row, add this-
    */
    $MainResult = $MainResult[0];
    //The rest of your code.
    $ArrayedLevels = $array = Array(
    "Attack" => $MainResult['Attacklvl'],
        ...
    );
    var_dump($ArrayedLevels["Attack"]);
}
else{
    //Failure
}

【讨论】:

  • 仍然返回 NULL,我能否从数组中已获取的 PDO 中获取数据?
  • @Patrick 检查编辑。执行此操作,并在每个 else{} 部分中回显某些内容,以便您知道错误发生在哪里。
  • array_key_exists 部分失败。
  • @Patrick 我想我知道为什么它失败了。错误出现在您的 fetchAll() 中。它返回所有行。所以选择第一个或使用 foreach 循环。检查编辑。
  • 我不想使用数组运行 foreach 循环,我选择使用数组执行此操作,因为 foreach 循环降低了速度,我将它从大约 11 秒缩短到 7 -8 秒页面加载时间:/ 思想数组将是一个更好的选择。但添加 $MainResult = $MainResult[0];工作!但唯一的问题是格式是字符串(2)“99”,我觉得解析每一个来摆脱它需要很多额外的时间。
【解决方案2】:

创建新数组时括号在 PHP 中不起作用,请使用 array() 创建一个。

实际上:从 PHP 5.4 开始,它们确实可以工作,请参见此处:http://nl3.php.net/manual/en/language.types.array.php

【讨论】:

    【解决方案3】:

    试试var_dump($MainResult);

    如果一切顺利,请尝试像这样创建您的数组:

    $ArrayedLevels = array(
        "Attack" => $MainResult['Attacklvl'],
        "Defence" => $MainResult['Defencelvl'],
        "Strength" => $MainResult['Strengthlvl'],
        "Hitpoints" => $MainResult['Hitpointslvl'],
        "Ranged" => $MainResult['Rangelvl'],
        "Prayer" => $MainResult['Prayerlvl'],
        "Magic" => $MainResult['Magiclvl'],
        "Cooking" => $MainResult['Cookinglvl'],
        "Woodcutting" => $MainResult['Woodcuttinglvl'],
        "Fletching" => $MainResult['Fletchinglvl'],
        "Fishing" => $MainResult['Fishinglvl'],
        "Firemaking" => $MainResult['Firemakinglvl'],
        "Crafting" => $MainResult['Craftinglvl'],
        "Smithing" => $MainResult['Smithinglvl'],
        "Mining" => $MainResult['Mininglvl'],
        "Herblore" => $MainResult['Herblorelvl'],
        "Agility" => $MainResult['Agilitylvl'],
        "Thieving" => $MainResult['Thievinglvl'],
        "Slayer" => $MainResult['Slayerlvl'],
        "Farming" => $MainResult['Farminglvl'],
        "Runecrafting" => $MainResult['Runecraftlvl'],
        "Hunter" => $MainResult['Hunterlvl'],
        "Construction" => $MainResult['Constructionlvl'],
        "Summoning" => $MainResult['Summoninglvl'],
        "Dungeoneering" => $MainResult['Dungeoneeringlvl'],
    );
    

    【讨论】:

    • var_dump($MainResult);工作,我尝试将其更改为 $ArrayedLevels = array(, 但它仍然返回 NULL。
    • 转储的结果如何?是这样的 $MainResult['Attacklvl'] 还是 $MainResult[0]['Attacklvl'] ?
    • 这是第一个转储行的示例(仅显示攻击) array(1) { [0]=> array(102) { ["playerName"]=> string( 7)“帕特里克”[0]=>字符串(7)“帕特里克”[“Attacklvl”]=>字符串(2)“99”
    • 这是因为你的 $MainResult 是一个多级数组,你需要有这样的东西 "Attack" => $MainResult[1]['Attacklvl']
    • 我无法从您粘贴的转储结果中真正看到调平。您能否在 gist.github.com 上的第一个索引处至少粘贴一个缩进数组
    【解决方案4】:

    首先尝试打印变量$MainResult的结构:

    var_dump($MainResult);
    

    FetchAll 返回一个包含所有类似结果的数组

    resutl = [
     [0] => ['first row'],
     [1] => ['sec. row']
    ]
    

    你会看到变量$MainResult 看起来像:

    MailResult => [
      [0] => ['Attacklvl' => 'foo'],
      [1] => ['Defencelvl' => 'bar'] 
    ]
    

    【讨论】: