Вывод MySQL-запроса с PHP-массивом - ошибка цикла foreach «неверное смещение» и «неверный аргумент» - PullRequest
0 голосов
/ 29 августа 2018

Чтобы попытаться сделать это проще для понимания, я сократил этот пример вместо фактического кода, который я использую, но я знаю, в чем проблема, я просто не уверен, как использовать 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 голосов
/ 29 августа 2018

Вы допустили следующую ошибку, ключевой заголовок таблицы - это строка, поэтому вы должны использовать «», другое дело, вы использовали то же имя массива «$ thetablestructure» внутри foreach

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 для динамического построения всего, что вы хотите .

0 голосов
/ 29 августа 2018

Вы должны изменить это, когда вы звоните $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-инъекций .

$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 ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...