为了使它更容易理解,我简化了该示例,而不是使用我正在使用的实际代码,但是我知道问题出在哪里,我不确定如何使用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();
希望如此,有人可以帮助我。
答案 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这样的结构来动态构建所需的内容