php максимальное значение массива в цикле while

#php #mysql

#php #mysql

Вопрос:

Мне нужно получить максимальное значение массива, которое находится внутри цикла while, и привязать это значение к переменной, но когда я пытаюсь, я получаю несколько результатов, а не только один.

Вот пример первой таблицы, где я получаю текущие значения, которые мне нужно сравнить со второй таблицей;

 tbl name: table1
----------------------------
| id |  type   |  category | 
|----|---------|-----------|
| 1  |  apple  |  red      |  
|----|---------|-----------|
| 3  |  orange |  yellow   | 
|----|---------|-----------|
| 4  |  orange |  red      |  
----------------------------
  

Вот пример второй таблицы, где я сравниваю текущие значения первой таблицы, чтобы узнать сумму;

 tbl name: table2
-------------------------------------
| id |  type   |  category | amount |
|----|---------|-----------|--------|
| 1  |  apple  |  red      |  50.00 |
|----|---------|-----------|--------|
| 2  |  apple  |  green    |  75.00 |
|----|---------|-----------|--------|
| 3  |  orange |  yellow   |  20.00 |
|----|---------|-----------|--------|
| 4  |  orange |  red      |  20.00 |
-------------------------------------
  

Вот мой код;

 $select_table1  = "select * from table1";
$connect_table1 = mysqli_query($con, $select_table1);
while ($row_table1 = mysqli_fetch_array($connect_table1)) {
    $type     = $row_table1['type'];
    $category = $row_table1['category'];

    $select_table2  = "select * from table2 where type in('$type') and category in('$category')";
    $connect_table2 = mysqli_query($con, $select_table2);
    while ($row_table2 = mysqli_fetch_array($connect_table2)) {
        $amount = array(
            $row_table2['amount']
        );
        $max    = max($amount);
        echo "$max<br/>";
    }
}
  

Это дает мне;

 50.00
20.00
20.00
  

Мне просто нужно наибольшее количество само по себе, которое составляет 50,00
Что я делаю не так?

Комментарии:

1. Также обратите внимание, что использования запроса внутри запроса обычно можно избежать, используя соединение.

2. ПРЕДУПРЕЖДЕНИЕ : при использовании mysqli вы должны использовать параметризованные запросы и bind_param добавлять любые данные в свой запрос. НЕ используйте интерполяцию строк или конкатенацию для достижения этой цели, потому что вы создали серьезную ошибку SQL-инъекции . НИКОГДА не помещайте $_POST , $_GET или данные любого рода непосредственно в запрос, это может быть очень вредно, если кто-то попытается использовать вашу ошибку.

3. Вам нужно вывести вашу функцию max ($ amount) из цикла и собрать значения $row_table2[‘amount’] в отдельный массив, например $amounts[] = $row_table2[‘amount’]. После того, как вы собрали свои значения в этом массиве, вы можете вызвать и повторить свою функцию max(). Кроме того, из этого вы уже могли бы извлечь наибольшее значение прямо из базы данных, используя комбинацию сортировки по пределу или предложение Select Max.

4. @tadman здесь вообще нет пользовательского ввода, нет post или get, я просто сравниваю значения из 2 таблиц. Если бы было, я бы использовал подготовленные инструкции.

5. Вы вводите данные из базы данных без какого-либо экранирования вообще. Если вы предполагаете , что это безопасно, тогда у вас возникают огромные проблемы. Откуда category берется? Это может быть пользовательский ввод. Используйте подготовленные инструкции для всех значений , а не только для тех, которые вы считаете небезопасными. Храните ваши данные и запрос полностью разделенными.

Ответ №1:

Используйте JOIN в сочетании с агрегатной функцией MAX() , чтобы получить свой результат. Вместо этого будет выполнен один запрос, и дополнительная логика PHP не требуется.

 $query = 'SELECT MAX(t2.amount) as maxAmount
          FROM table2 t2
          JOIN table1 t1
            ON t1.type = t2.type
              AND t1.category = t2.category';
$query = $con->query($query);
$result = $query->fetch_assoc();
echo $result['maxAmount'];
  

. Смотрите SQLFiddle

Ответ №2:

Большое спасибо за идеи здесь, я решил это, используя следующее. Это может быть более запутанным, чем ответ от @Qirel, но были дополнительные сложности, о которых я не упоминал, поскольку я не хотел создавать беспорядок. Например, эти таблицы взяты из 2 отдельных баз данных, которые используют определенные соединения, и мне приходилось полагаться на переменные, поскольку данные в первой таблице создаются пользователем и извлекаются на основе значения файла cookie.

Благодаря @rpm192, это было почти на месте.

 <?php
$select_table1 = "select * from table1";
$connect_table1 = mysqli_query($con, $select_table1);
     while ($row_table1 = mysqli_fetch_array($connect_table1)) {
     $type = $row_table1['type'];
     $category = $row_table1['category'];

     $select_table2  = "select * from table2 where type in('$type') and category in('$category')";
     $connect_table2 = mysqli_query($con, $select_table2);
     while ($row_table2 = mysqli_fetch_array($connect_table2)) {
          $amount = $row_table2['amount'];
          $myArray[] = $amount;
     }
}
$maxAmount = max($myArray);
echo $maxAmount;
?>