Как сохранить результат нескольких запросов в переменной и получить к нему доступ с помощью php. (Процедурный стиль)

#php #mysql

#php #mysql — сервер #mysql

Вопрос:

Я запускаю запрос MySQL несколько раз, чтобы ВЫБРАТЬ и ОБНОВИТЬ несколько строк одновременно, но я сталкиваюсь с некоторой проблемой, связанной с сохранением нескольких результатов в переменной для доступа к ее значениям.

Вот мой код для запроса:

 if(isset($_POST['transfer'])){
    $code = $_SESSION['item_codes']; // $_SESSION['item_codes'] contains selected items to update.
        
    // foreach($code as $prd){echo $prd;} exit();

    if($code == ""){
        echo "<script type='text/javascript'>alert('Please select at least one item.');</script>";
    }

    // to get the id of product which satisfy the following condition
    for ($i=0; $i < sizeof($code); $i  ) { 
        $search_id = "SELECT products.id as p_id,products.code,
products.metal,products.category_id, 
                products.branch_id, products.weight, products.labour, products.price, 
                category.id as cat_id, category.category_name, branches.id as branch_id, 
                branches.name as branch_name FROM products JOIN category ON products.category_id = category.id 
                        JOIN branches ON products.branch_id = branches.id 
                        WHERE products.code = '$code[$i]' AND products.branch_id = '$branch'";
        $search_id_res = mysqli_query($conn, $search_id);                

    } // for end

    while($fetch = mysqli_fetch_array($search_id_res, MYSQLI_ASSOC)){
        foreach($fetch as $item){
            echo $item."</br>";
        };
        echo $prd_id = $fetch['p_id'];
        echo $update = "UPDATE products SET branch_id = '$transfer_to_branch' WHERE id='$prd_id";
    }
}
  

Цели:

  1. ОБНОВИТЕ branch_id обеих строк одновременно, чтобы изменить их местоположение.

Проблемы:

  1. в $fetch я получаю только одну строку в результате.
  2. цикл while не печатает запрос НА ОБНОВЛЕНИЕ 2 раза.

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

Результат выполнения двух операторов echo в циклах while. Результат выполнения двух операторов echo в циклах while.

products таблица базы данных

таблица продуктов базы данных

Пожалуйста, помогите мне, заранее спасибо.

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

1. Вам действительно нужно выбирать все эти данные? Можно ли выполнить все обновление с помощью одного обновления SQL — UPDATE products SET branch_id = '$transfer_to_branch' WHERE products.code = '$code[$i]' AND products.branch_id = '$branch'" (преобразованного в подготовленную инструкцию)

Ответ №1:

Вам нужно вложить второй цикл внутрь первого.

Также лучше использовать подготовленные инструкции, а не заменять переменные в строках SQL.

 if(isset($_POST['transfer'])){
    $code = $_SESSION['item_codes']; // $_SESSION['item_codes'] contains selected items to update.
        
    // foreach($code as $prd){echo $prd;} exit();

    if($code == ""){
        echo "<script type='text/javascript'>alert('Please select at least one item.');</script>";
    }

    $select_stmt = mysqli_prepare($conn, "SELECT products.id as p_id,products.code, products.metal,products.category_id, 
                products.branch_id, products.weight, products.labour, products.price, 
                category.id as cat_id, category.category_name, branches.id as branch_id, 
                branches.name as branch_name FROM products JOIN category ON products.category_id = category.id 
                        JOIN branches ON products.branch_id = branches.id 
                        WHERE products.code = ? AND products.branch_id = ?");
    mysqli_stmt_bind_param($select_stmt, "ss", $cur_code, $branch);
    $update_stmt = mysqli_prepare($conn, "UPDATE products SET branch_id = '$transfer_to_branch' WHERE id='$prd_id");
    mysqli_stmt_bind_param($update_stmt, "ss", $transfer_to_branch, $prd_id);

    // to get the id of product which satisfy the following condition
    foreach ($code as $cur_code) { 
        mysqli_stmt_execute($select_stmt);                
        $search_id_res = mysqli_stmt_get_result($select_stmt);
        while($fetch = mysqli_fetch_array($search_id_res, MYSQLI_ASSOC)){
            foreach($fetch as $item){
                echo $item."</br>";
            };
            echo $prd_id = $fetch['p_id'];
            mysqli_stmt_execute($update_stmt);
        }
    } // for end
}
  

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

1. спасибо @Barmar за вашу помощь, я новичок в PHP, поэтому мне нужно понять, что делает stmt функция, и я обязательно попробую это.