Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP - Условия в цикле

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день.  
 

Код:
 
foreach ($gds as $key=>$value) {
 
    $result = mysqli_query($con,"SELECT COUNT(*) AS COLL FROM `STOCK` WHERE `NOMENCLATURE` = '".$value[0]."'");
    $order_coll = (int)$value[1];
 
    while($row = mysqli_fetch_array($result)) {
        $stock_coll = (int)$row['COLL'];
    }
        // Проверяем запрошенное кол-во с имеющимся на складе
    if($order_coll > $stock_coll){
        echo json_encode('Позиция № '.$value[0].' в колличестве '.$order_coll.'шт отсутствует на складе. Остаток на складе '.$stock_coll.'шт');
        exit;
    }  
        // Списываем позиции со склада    
    $result = mysqli_query($con,"SELECT * FROM `STOCK` WHERE `NOMENCLATURE` = '".$value[0]."' LIMIT ".$order_coll."");
    while($row = mysqli_fetch_array($result)) {
        mysqli_query($con,"UPDATE `STOCK` SET `ORDERREPAIR`='".$uid."' WHERE `ID`='".$row['ID']."'");
    }
}
 

Задача вроде проста, но я не могу смекнуть. Требуется проверить запрошенное кол-во с имеющимся на складе, и только если запрошенное не превышает остаток,
продолжить выполнять код, то есть списать позиции со склада. То что я написал работает, но в случае если хоть одна позиция соответствует "if" то он её списывает, а на остальные выкидывает ошибку. А мне нужно в случае хоть одного запроса не соответствующего "if" ничего не списывать.

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 10:07 18-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
раз вы упорствуете, создавая новые темы, то это последний раз когда я вам помогаю.

Цитата:
А мне нужно в случае хоть одного запроса не соответствующего "if" ничего не списывать.

ну так сделать один цикл с проверкой, ничего не изменяя, а второй - уже изменяя, если все нормально.
либо используем транзакции (формат базы должен быть InnoDB) http://php.net/manual/ru/mysqli.begin-transaction.php
 

Цитата:
$result = mysqli_query($con,"SELECT COUNT(*) AS COLL FROM `STOCK` WHERE `NOMENCLATURE` = '".$value[0]."'");

и выбирать информацию лучше одним запросом, а не гонять запросы в цикле. курить WHERE column IN у MySQL

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:16 18-12-2017 | Исправлено: Mavrikii, 10:23 18-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Я просто хотел уточнить, нормально ли будет использовать два в принципе одинаковых цикла. Я в курсе что php интерпретируется построчно, хотел уточнить может есть какое-то решение отличное от использование двух циклов. Вот и все

Код:
 
foreach ($gds as $key=>$value) {
    $result = mysqli_query($con,"SELECT COUNT(*) AS COLL FROM `STOCK` WHERE `NOMENCLATURE` = '".$value[0]."'");
    $order_coll = (int)$value[1];
 
    while($row = mysqli_fetch_array($result)) {
        $stock_coll = (int)$row['COLL'];
    }
 
    if($order_coll > $stock_coll){
        echo json_encode('Позиция № '.$value[0].' в колличестве '.$order_coll.'шт отсутствует на складе. Остаток на складе '.$stock_coll.'шт');
        exit;
    }
}
 
foreach ($gds as $key=>$value) {
    $result = mysqli_query($con,"SELECT * FROM `STOCK` WHERE `NOMENCLATURE` = '".$value[0]."' LIMIT ".(int)$value[1]."");
    while($row = mysqli_fetch_array($result)) {
        mysqli_query($con,"UPDATE `STOCK` SET `ORDERREPAIR`='".$uid."' WHERE `ID`='".$row['ID']."'");
    }
}  
 

 

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 10:24 18-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
отличное от использование двух циклов

в простом варианте - нет, но и снова генерить запросы к базе нет смысла
 

Цитата:
 
    while($row = mysqli_fetch_array($result)) {  
        $stock_coll = (int)$row['COLL'];  
    }  

бессмысленный цикл

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:57 18-12-2017 | Исправлено: Mavrikii, 11:09 18-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
А как правильно будет?

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 13:28 18-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А как правильно будет?

не проверял плюс неизвестно что в массивах, поэтому просто набросок

Код:
$results = mysqli_query($con, "SELECT COUNT(*) COLL, NOMENCLATURE FROM STOCK WHERE NOMENCLATURE IN (" . implode(',', array_map('intval', array_values($gds))) . ") GROUP BY NOMENCLATURE");
while($row = mysqli_fetch_array($results)) {  
    if($order_coll > (int)$row['COLL']){  
        echo json_encode('Позиция № '.$value[0].' в колличестве '.$order_coll.'шт отсутствует на складе. Остаток на складе '.$stock_coll.'шт');  
        exit;  
    }  
}  
 
foreach ($gds as $key=>$value) {  
    $result = mysqli_query($con, "UPDATE STOCK SET ORDERREPAIR='".$uid."'  WHERE `NOMENCLATURE` = '".$value[0]."' LIMIT ".(int)$value[1]);  
}  

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 13:55 18-12-2017 | Исправлено: Mavrikii, 13:55 18-12-2017
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP - Условия в цикле


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru