PDO Select с несколькими WHERE и Value между числом mysql столбца - PullRequest
0 голосов
/ 07 мая 2020

Я создаю эту таблицу «план»

======================
| id | name | status |
| 1  | Alpha|   1    |
| 2  | Beta |   1    |
| 3  | Char |   1    |
======================

И эту таблицу как подплан «plan_sub»

===================================
| id | name | min | max | main_id |
| 1  | v1   |  1  | 10  |    2    |
| 2  | v2   | 11  | 20  |    2    |
| 3  | v3   | 21  | 100 |    2    |
===================================

Я создал форму, которая содержит номер типа ввода. После отправки формы будут отправлены данные «plan_id» и «amount».

Я хочу получить выбор базы данных на основе представленных данных формы. Например, форма отправит мне plan_id = 2 и amount = 11, затем я создал этот PDO.

$stmt = $conn->prepare("SELECT * FROM plans p INNER JOIN plans_sub ps ON ps.main_id = p.id WHERE ps.main_id = :pid AND (min >= :amount OR min IS NULL) AND (max <= :amountOne OR max IS NULL)");
$stmt->bindValue(':pid',$_POST['plan_id']);
$stmt->bindValue(':amount',$_POST['amount']);
$stmt->bindValue(':amountOne',$_POST['amount']);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$planId = $stmt->fetch();

Когда я пытаюсь получить результат, распечатав его.

print_r($planId);

Это дало мне нет данных. Он должен дать мне данные

Plan: Beta
plan sub: v2

, потому что отправленные данные - это идентификатор плана 2 (main_id в планах_sub) и сумма 11.

=========== ==============================

РЕДАКТИРОВАТЬ

Я пытаюсь использовать foreach вот так

$stmt = $conn->prepare("SELECT * FROM plans p INNER JOIN plans_sub ps ON ps.main_id = p.id WHERE main_id = :pid");
$stmt->bindValue(':pid',$_POST['plan_id']);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$plans = $stmt->fetchAll();
foreach ($plans as $key => $value) {
 if($_POST['amount']>=$value['min'] && $_POST['amount']<=$value['max']){
     $planid = $value;
 }
}

и print_r ($ planid), чтобы увидеть результат. Да, это дает мне Beta v2 с количеством отправленных форм = 11 и plan_id = 2.

Но у меня есть следующие вопросы. Как если в отправленной форме сумма = 0 и plan_id = 2 ?? Если отправленная форма похожа на эту, я хочу показать результат как Beta v1 с изменением суммы на 1 в качестве минимального минимума в «планах_подсуб».

Может ли кто-нибудь помочь мне получить данные?

Ответы [ 3 ]

0 голосов
/ 07 мая 2020

Возможно, вы после этого ...

SELECT * FROM plans_sub ORDER BY ABS(0-min) LIMIT 1;
+----+------+-----+-----+---------+
| id | name | min | max | main_id |
+----+------+-----+-----+---------+
|  1 | v1   |   1 |  10 |       2 |
+----+------+-----+-----+---------+
0 голосов
/ 07 мая 2020

Я нашел способ. Сначала мы ищем сумму, если она меньше, а затем ищем, если сумма больше. Последний настоящий поиск по нашему логу c. Вот код.

            foreach ($plans as $key => $value) {
                if($_POST['amount']<$value['min']){
                    $planid = $value;
                    break;
                }elseif($_POST['amount']>$value['max']){
                    $planid = $value;
                    continue;
                }elseif($_POST['amount']>=$value['min'] && $_POST['amount']<=$value['max']){
                    $planid = $value;
                    break;
                }
            }

Надежда может помочь другим

0 голосов
/ 07 мая 2020

Вы запрашиваете

SELECT * 
FROM plans p 
INNER JOIN plans_sub ps ON ps.main_id = p.id 
WHERE ps.main_id = :pid 
AND (min >= :amount OR min IS NULL  ) 
AND (max <= :amountOne OR max IS NULL)

не возвращает никакого значения, потому что у вас нет допустимого значения для: amountOne, если вы хотите использовать бета-план, вы должны передать id = 2, amount = 11 na amountOne = 18

может быть вам нужен код для управления пустым параметром, например:

SELECT * 
FROM plans p 
INNER JOIN plans_sub ps ON ps.main_id = p.id 
WHERE ps.main_id = :pid 
AND (min >= :amount OR min IS NULL  OR IFNULL( :amount,'') =='') 
AND (max <= :amountOne OR max IS NULL OR IFNULL( :amountOne,'') =='');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...