【问题标题】:PHP array won't store a variable [closed]PHP数组不会存储变量[关闭]
【发布时间】:2014-07-02 13:35:15
【问题描述】:

我在一个网站上工作,在编码时,我遇到了一个奇怪的错误。

我将 MySQL 查询结果存储在一个数组中,然后使用存储的数据调用 JavaScript 函数。该数组最初包含 9 个项目:8 个为 tinyint(4) 类型(在数据库中 - 我不知道它是否有用),一个为 int(11)。后来,我意识到我也必须给它们传递一个字符串,所以我包含了一个 Varchar(40) 类型的项。

这就是问题所在。至此,代码运行没有任何错误——我可以传递变量,在 JS 代码中使用它们并在网站上显示它们。只要我包含该字符串,网站就会崩溃(不显示任何内容)。

代码如下:

<?php

// Create connection
$con=mysqli_connect("mysql7.000webhost.com","a2248489_admin","SQL123DevAdmin","a2248489_players");
$con2=mysqli_connect("mysql7.000webhost.com","a2248489_admin","SQL123DevAdmin","a2248489_players");

// Check connection
$troopArray = array(array()); 
$result = mysqli_query($con,"SELECT  ID, Name FROM Player");

$counter = 0;

while($row = mysqli_fetch_array($result)) {
$troops = mysqli_query($con,"SELECT * FROM Troops WHERE ID = '" . $row['ID'] . "' ");
while($sor = mysqli_fetch_array($troops)) {
    $troopArray[$counter][0] = $sor['archerLvl'];

    $troopArray[$counter][1] = $sor['giantLvl'];

    $troopArray[$counter][2] = $sor['wizardLvl'];

    $troopArray[$counter][3] = $sor['balloonLvl'];

    $troopArray[$counter][4] = $sor['dragonLvl'];

    $troopArray[$counter][5] = $sor['minionLvl'];

    $troopArray[$counter][6] = $sor['hogLvl'];

    $troopArray[$counter][7] = $sor['golemLvl'];

    $troopArray[$counter][8] = $sor['witchLvl'];

    $troopArray[$counter][9] = $row['ID'];

    $troopArray[$counter][10] = $row['Name'];
    $counter++;

  }
}

//------------------Writing the name into a new DIV------------------------
echo '<script type="text/javascript">';
echo 'var nameButton = document.createElement("input");';
echo 'nameButton.setAttribute("type","button");';
echo 'nameButton.setAttribute("value","' . $row['Name'] . '");';
echo 'nameButton.setAttribute("name","' . $row['ID'] . '");';
echo 'nameButton.style.backgroundImage="url(\"images/login_button/button_name.png\")";';
echo 'nameButton.style.marginLeft = "5px";';
echo 'nameButton.style.marginTop = "0px";';
echo 'nameButton.style.height="60px";';
echo 'nameButton.style.width="200px";';
echo 'nameButton.style.border ="none";';
echo 'nameButton.style.backgroundColor ="transparent";';
echo 'nameButton.style.fontWeight="900";';
echo 'nameButton.style.paddingLeft="50px";';
echo 'nameButton.style.textAlign="left";';
echo 'nameButton.onclick = function() 
                                    {

                                        TableDraw(' . $troopArray[0][0] . ',' . $troopArray[0][1] . ',' . $troopArray[0][2] . ',' . $troopArray[0][3] . ',' . $troopArray[0][4] . ',' . $troopArray[0][5] . ',' . $troopArray[0][6] . ',' . $troopArray[0][7] . ',' . $troopArray[0][8] . ',' . $troopArray[0][9] . ',' . $troopArray[0][10] . ');

                                    };';
echo 'document.body.appendChild(nameButton);';
echo '</script>';
echo '<br>';

 ?>

$troopArray[$counter][10] = $row['Name']; 之前一切正常,我什至稍后将它设置为按钮的文本时使用它。如果我将“名称”更改为“ID”,代码就会运行。

据我所知,我可以在 PHP 数组中存储任何类型的变量,因为它不是真正的数组。但是为什么我似乎不能在整数中存储一个字符串呢?

【问题讨论】:

  • 您的专栏是不是叫name 而不是Name
  • 您的错误日志中有什么内容?
  • @Fred-ii- 不,我稍后在这一行中以相同的格式使用它:echo 'nameButton.setAttribute("value","' . $row['Name'] . '");';,它正在工作(按钮的文本是正确的)。
  • 也许你的数组是固定长度为 10?不记得 PHP 数组是否是固定长度的
  • (旁注)如果这是您的完整代码或接近,那么您缺少一个右大括号},除此之外,我不知道问题可能是什么。尝试将错误报告添加到文件顶部 error_reporting(E_ALL); ini_set('display_errors', 1); 看看它是否会产生更多信息。

标签: javascript php mysql arrays


【解决方案1】:

我在您的代码中没有看到任何错误,但有一点对我来说很奇怪:

$troopArray = array(array());

你应该把这行简单地改成:

$troopArray = array();

并检查问题是否仍然存在

另外一件事情是您的$counter 始终为 0。它不会引起问题,但也许您还想在循环结束之前增加它?

编辑

如果问题仍然存在,您应该向我们展示整个循环代码(现在它在第一次循环后完成,也许稍后您在 $row 变量中更改某些内容

【讨论】:

  • 是啊,那两个array()我也很奇怪。
  • 没有。如您所见,$troopArray 是一个数组数组,因为代码使用$troopArray[$counter] 引用了一个数组。我有点困惑,因为$counter 永远不会增加
  • @Julian 我知道,但我还没有看到这样的结构。即使数组有 3 个维度,据我所知,您总是使用 $array = array(); 初始化数组
  • 没有。 PHP 在设置数组元素时初始化数组。因此,由于 PHP 的故障安全性,他根本不需要初始化数组。这也可以完美地工作:$troopArray; $troopArray[0]['a'] = "b";.
  • @benedekadam:如您所见,它相关的!我认为,这样的事情是编码中最可能出现的问题。
【解决方案2】:

我看不到问题,但可以重新编码以使用 JOIN 并将循环保存在循环中吗?假设它们都在同一个数据库中

$troopArray = array();
$counter = 0;
$sql = "SELECT  a.ID, a.Name, b.archerLvl, b.giantLvl, b.wizardLvl, b.balloonLvl, b.dragonLvl, b.minionLvl, b.hogLvl, b.golemLvl, b.witchLvl
        FROM Player a
        INNER JOIN Troops b
        ON a.ID = b.ID";
$result = mysqli_query($con,$sql);

while($row = mysqli_fetch_array($result)) 
{
    $troopArray[$counter] = array();
    $troopArray[$counter][0] = $row['archerLvl'];
    $troopArray[$counter][1] = $row['giantLvl'];
    $troopArray[$counter][2] = $row['wizardLvl'];
    $troopArray[$counter][3] = $row['balloonLvl'];
    $troopArray[$counter][4] = $row['dragonLvl'];
    $troopArray[$counter][5] = $row['minionLvl'];
    $troopArray[$counter][6] = $row['hogLvl'];
    $troopArray[$counter][7] = $row['golemLvl'];
    $troopArray[$counter][8] = $row['witchLvl'];
    $troopArray[$counter][9] = $row['ID'];
    $troopArray[$counter][10] = $row['Name'];
    $counter++;
}

如果您这样做,您可以尝试对每个 $row 执行 print_r,并在填充后对 $troopArray 执行 print_r 并检查它们是否正确。

顺便说一句,名字恰好是一个数字吗?

编辑 - 问题似乎是您将此数组中的值分配到 javascript 数组的位置。您已将其分配到没有引号的 javascript 数组中。这可能导致 javascript 试图找到一个名为 Name 的值的变量来分配给数组。

【讨论】:

  • +1 好收获。 OP 应该从一开始就发布完整的代码,并且可以轻松地避免所有这些浪费的时间。
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多