使用PHP数组输出MySQL查询-foreach循环错误“非法偏移”和“无效参数”

时间:2018-08-29 13:53:16

标签: php mysql arrays foreach

为了使它更容易理解,我简化了该示例,而不是使用我正在使用的实际代码,但是我知道问题出在哪里,我不确定如何使用foreach输出我的MySQL查询结果。

我有一个与此类似的数组

$thetablestructure = array(
 array('tableheader' => 'header 1', 'tablevalue' => 'value1'),
 array('tableheader' => 'header 2', 'tablevalue' => 'value2'),
);

我希望HTML输出是这样的:

<table>
 <tr>
  <th>header 1</th>
  <th>header 2</tth>
 </tr>
 <tr>
  <td>value 1</td>
  <td>value 2</td>
 </tr>
</table>

这是我尝试使用的代码,其中包含错误的字符串偏移和非法值:

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
 die("Connection failed: " . $conn->connect_error);
} 
$keywords = $_REQUEST['keywords'];

$sql = "SELECT * FROM `stock` WHERE `model` LIKE '%$keywords%'";
$result = $conn->query($sql);

$thetablestructure = array(
        array('tableheader' => 'Header 1', 'tablevalue' => 'value1'),
        array('tableheader' => 'Header 2', 'tablevalue' => 'value2'),
        );

echo "<table><tr>";

foreach ($thetablestructure as $thetablestructure) {
 echo "<th>".$thetablestructure[tableheader]."</td>";
}

echo "</tr>";
// output data of each row
while($row = $result->fetch_assoc()) {
 echo('<tr>');
 foreach ($thetablestructure as $thetablestructure) {
  echo "<td>".$row["$thetablestructure[tablevalue]."]."</td>";
 }

echo('</tr>');

}
echo "</table>";
$conn->close();

最初,这是我使用的代码,然后尝试对其进行简化和压缩:

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
 die("Connection failed: " . $conn->connect_error);
} 

// Retrieve keyword for MySQL query and search database
$keywords = $_REQUEST['keywords'];

$sql = "SELECT * FROM `stock` WHERE `model` LIKE '%$keywords%'";

$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "
<table>
 <tr>
  <th>Heading 1</th>
  <th>Heading 2</th>
 </tr>";

// output data of each row
while($row = $result->fetch_assoc()) {
 echo('<tr>');
 echo "<td>".$row["$thetablestructure[tableheader]"]."</td>";
 echo "<td>".$row["value2"]."</td>";
 echo('</tr>');
}

echo "</table>";

} else {
 echo "<p>0 results for ".$keywords."
}
$conn->close();

希望如此,有人可以帮助我。

2 个答案:

答案 0 :(得分:0)

您必须在呼叫$thetablestructure[tableheader]的地方进行更改:

foreach ($thetablestructure as $thetablestructure) {
    echo "<th>".$thetablestructure[tableheader]."</td>";
}

echo "</tr>";
// output data of each row
while($row = $result->fetch_assoc()) {
    echo('<tr>');
    foreach ($thetablestructure as $thetablestructure) {
        echo "<td>".$row["$thetablestructure[tablevalue]."]."</td>";
     }
//...
}

为此,请使用$thetablestructureItem['tableheader']

foreach ($thetablestructure as $thetablestructureItem) {
    echo "<th>".$thetablestructureItem['tableheader']."</th>"; //You've opened th tag and close a td one
}

echo "</tr>";
// output data of each row
while($row = $result->fetch_assoc()) {
    echo('<tr>');
    foreach ($thetablestructure as $thetablestructureItem) {
        echo "<td>".$row[$thetablestructureItem['tablevalue']]."</td>";
     }
//...
}

您首先没有正确命名foreach循环中的值。您为该集合和该集合的每个项目使用了相同的名称。即使它以前曾经工作过,也确实会在对使用相同名称的项目及其集合/数组的代码进行工作/调试时带来混乱。

您调用了索引,放弃了将引号引起来的引号。

$someArray = array('foo' => 42);
//access the value at index foo :
echo $someArray['foo'];

顺便说一句,您的查询容易受到SQL Injections的攻击。<​​/ p>

$keywords = $_REQUEST['keywords'];

$sql = "SELECT * FROM `stock` WHERE `model` LIKE '%$keywords%'";
$result = $conn->query($sql);

如果请求keyword

"lol'; DROP TABLE `users`;--"

查询将变为:

 $sql = "SELECT * FROM `stock` WHERE `model` LIKE '%lol'; DROP TABLE `users`;--";

我建议您看看PHP-PDO,尤其是bindParam()

答案 1 :(得分:0)

您犯了以下错误,键表头是字符串,因此必须使用“'”,另一件事,您在foreach中使用了与数组'$ thetablestructure'相同的名称

foreach ($thetablestructure as $v) {
 echo "<th>{$v['tableheader']}</td>";
}

接下来,将字符串用作变量以及其他错误,我建议您在尝试使用变量之前先隔离$ v这样的变量。

 while($row = $result->fetch_assoc()) {
    echo('<tr>');
    foreach ($thetablestructure as $t) {
      $v =$t['tablevalue'];
      echo "<td>".$row[$v]."</td>";
    }

    echo('</tr>');
  }

只是观察一下,如果您在代码中专门调用“ value1”和“ value2”,有时维护起来更好,同时又易于理解,而不是使用$ thetablestructure这样的结构来动态构建所需的内容