Показать сообщение отдельно
  #31 (permalink)  
Старый 27.05.2015, 19:01
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Функции, которые применяю изучаете?
Пусть имеется в корзине товары и пришел запрос выбранных товаров от пользователя, и содержание этих массивов будет таким:
//корзина
$_SESSION['cart'] = array(
       209 => array(
          'count' => 3,
          'price'  => 1500,
          array('size'=>array(42 => 2, 41 => 1), 'name' => 'Галоши')
       ),
       150 => array(
          'count' => 2,
          'price'  => 1000,
          array('size'=>array(40 => 1, 41 => 1), 'name' => 'Туфли')
       ),
       180 => array(
          'count' => 4,
          'price'  => 1000,
          array('size'=>array(40 => 2, 41 => 2), 'name' => 'Туфли')
       )
);
$basket = &$_SESSION['cart']; //используем ссылку на массив корзины
//полученный массив
$_POST['order'] = array(
    144 => array(41=>1),
    222 => array(40=>1, 42=>2),
    209 => array(41=>1)
);
//array_keys($_POST['order']) получает ключи POST массива
//array_map('intval' ... приводит полученные ключи к integer
//array_diff вычисляет расхождение массивов по их значениям, и удаляит из полученных ключей те, которые будут равных 0 после приведения к integer
//это действие как раз и отсекает "вредности", ибо могут вместо ключей прислать и строку с sql-запросом, а это уже попытка инъекции базы
//array_flip меняет местами ключи и значения массива, это нужно потому, что далее будет использована функция пересечения массивов по их ключам
//а до array_flip ключи были значениями
//array_intersect_key выберет из POST массива только те ключи и их значения, что вернутся после array_flip
//попробуйте в $_POST['order'] замечить один или все ключи на строки, посмотрите результат 
if($order = array_intersect_key($_POST['order'], array_flip(array_diff(array_map('intval', array_keys($_POST['order'])), array(0))))) {
    //$order (POST массив) не пустой, вот что получаем
    print_r($order);
    //работаем с корзиной
    //надо выяснить какие товары в массиве $order уже есть, а каких нет, чтобы для вновь добавляемых получить их параметры в базе
    //для этого опять вычислим расхождение массивов (запрошенного формой и корзины), но уже по их ключам, функцией array_diff_key
    //полученные ключи обеденим в строку значений раздленных запятой, как того требует IN()   
    $sql = 'SELECT id, name, price FROM table_name WHERE id IN('.implode(',', array_keys(array_diff_key($order, $basket))).')';
    //вот что получилось
    echo $sql;
    //как видно, запрос будет только для ID 144 и 222, так как ID 209 уже есть в корзине, и его нужно обновлять 
}

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

Если вам кто-то показывает код, то разбирайтесь в том, что же он делает, вот это и будет тогда "учеба". А просто копировать не задумываясь, не изучать функции в нем применяемые, да и вообще не изучать функций языка, так какая же это учеба.

PS. Если трудно разобраться в строке с кучей функций, ну так можно расписать каждую операцию поэтапно, для "разобраться".

Последний раз редактировалось laimas, 27.05.2015 в 19:05.
Ответить с цитированием