#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;
?>