Я пытаюсь выполнить запрос от нескольких переменных массива и отобразить результаты в таблице.
Пользователь выбирает 1 или более записей, в том числе BOL и CONTAINER. Эти выборки помещаются в свои собственные массивы, и они всегда равны количеству.
<?php
$bolArray = explode(',', $_POST['BOL']);
$containerArray = explode(',', $_POST['CONTAINER']);
$count = count($bolArray); // to get the total amount in the arrays
Я использую цикл FOR, чтобы отделить каждое значение от 2 массивов:
for($i = 0; $i < $count; $i++)
{
$bol = $bolArray[$i];
$container = $containerArray[$i];
}
Вот та часть, где я застрял и, возможно, где я все испортил.
Мне нужно взять каждую переменную из цикла FOR и выполнить запрос, используя обе переменные.
Сначала я начну таблицу:
echo "<table><thead><tr><th>BOL</th><th>Container</th></thead><tbody>";
Вот где я попробовал цикл FOREACH:
foreach($containerArray as $container) // I am not sure if I am using this FOREACH correctly
{
А теперь запрос. Обратите внимание на переменные из первого цикла FOR:
$preQuery = "SELECT * FROM mainTable WHERE CONTAINER = '".$container."' AND BOL = '".$bol."'";
$preRes = mysql_query($preQuery) or die(mysql_error());
$preNum = mysql_num_rows($preRes);
Я использую цикл WHILE с mysql_fetch_assoc:
while($preRow = mysql_fetch_assoc($preRes))
{
echo '<tr>'
echo '<td>'.$preRow[BOL_NUMBER].'</td>';
echo '<td>'.$preRow[CONTAINER_NUMBER].'</td>';
echo '<td>'.$preRow[ANOTHER_COLUMN].'</td>';
echo '</tr>'
}
}
echo '</tbody></table>';
?>
Запрос на самом деле работает. Проблема в том, что он возвращает только 1 запись, и это всегда последняя запись. Пользователь может выбрать 4 записи, но в таблице возвращается только последняя запись.
Я попытался использовать тот же запрос и вставить его в первый цикл FOR. Я повторил запрос, и он отобразил то же количество раз, что и число значений массива, но вернет данные только для последней записи.
Я не понимаю, что я делаю не так. Я просто хочу отобразить данные для каждого значения из массива.
Вот как выглядит код, когда я бросаю запрос в первом цикле FOR:
echo "<table class='table table-bordered'><thead><tr><th>BOL</th><th>Container</th></tr></thead><tbody>";
for($i = 0; $i < $count; $i++)
{
$bol = $bolArray[$i];
$container = $containerArray[$i];
$preQuery = "SELECT BOL_NUMBER, CONTAINER_NUMBER FROM 'intermodal_main_view' WHERE BOL_NUMBER = '". $bol ."' AND CONTAINER_NUMBER = '".$container."'";
$preRes = mysql_query($preQuery) or die();
$preNum = mysql_num_rows($preRes);
while($preRow = mysql_fetch_assoc($preRes))
{
echo '<tr>';
echo '<td>'.$preRow[BOL_NUMBER].'</td>';
echo '<td>'.$preRow[CONTAINER_NUMBER].'</td>';
echo '</tr>';
}
}
echo "</tbody></table>";
Я думаю, вы можете использовать "IN", если ваши поля POST разделены запятой.
$preQuery = "SELECT * FROM mainTable WHERE CONTAINER IN ($_POST['CONTAINER']) AND BOL IN ($_POST['BOL']);
$preRes = mysql_query($preQuery) or die(mysql_error());
$preNum = mysql_num_rows($preRes);
Затем перейдите к вашему циклу while.
Это пропустит необходимость создания массива и его циклирования.
Кроме того, вам нужно переключиться на PDO для вашего запроса. Для обучения потребуется целый час.
mysql_*
, они больше не поддерживаются и официально устарели . Вместо этого узнайте о готовых утверждениях и используйте PDO или MySQLi . Вы также хотите предотвратить инъекцию SQL!for
-loop. Прямо сейчас в этом цикле вы перезаписываете первое значение вторым, второе - третьим и так далее. Придерживается только последнее значение.