За последние 24 часа нас посетили 22342 программиста и 1025 роботов. Сейчас ищут 618 программистов ...

Ошибка обновления БД из PHP

Тема в разделе "PHP и базы данных", создана пользователем German, 10 май 2019.

  1. German

    German Новичок

    С нами с:
    4 окт 2018
    Сообщения:
    9
    Симпатии:
    0
    Постарался в заголовке максимально точно объяснить суть, но не уверен что он правильно отоброжает суть.

    Ситуация в следующем, есть форма входа пользователя, которая работает через сессии.
    Все работает отлично, но мне нужно было что бы пользователь мог обновлять только свои данные и не имел доступ к чужим, у меня есть страница product.php и она отражает содержимое товара через GET.
    То есть если profile.php?id=1 то отражает содержимое первого товара и позволяет его изменять, и так же с id=2 второй товар и так далее.
    Для того что бы нельзя было изменить url вручную и редактировать товар который принадлежит другому пользователю (Все товары в одной таблице бд) я сделал поле shopid которое связано с id пользователя, и на странице с редактирования товара реализовал такой код:
    Код (Text):
    1. <?php
    2.  
    3. session_start();
    4. include "connect.php";
    5. $id = $_SESSION['id'];
    6. $productid = $_GET['id'];
    7. $product = mysqli_query($connection, "SELECT * FROM `product` WHERE `id` = '$productid'");
    8. $product_array = mysqli_fetch_array($product);
    9. $shopid = $product_array['shopid'];
    10. $category = mysqli_query($connection, "SELECT * FROM `product_category` WHERE `shopid` = '$shopid'");
    11.  
    12.     if($_SESSION['id']){
    13.          
    14.             if($product_array['shopid'] == $id){
    15.              
    16.                 echo '
    17.                 <div class="center">
    18.                     <div class="top">
    19.                         <a href="#">Сообщения</a><a href="#">Товары</a><a href="#">Общая информация</a><a href="#">настройки</a>
    20.                     </div>
    21.                     <div class="box">
    22.                         <form action="redact-product.php" method="post">
    23.                             <b>Название товара</b>
    24.                             <input class="name" type="text" name="name" value="' . $product_array['name'] . '"></input><br><br>
    25.                             <b>Описание товара</b>
    26.                             <textarea class="info" type="text" name="info" value="' . $product_array['info'] . '"></textarea><br><br>
    27.                             <b>Цена</b>
    28.                             <input class="price" type="text" name="price" value="' . $product_array['price'] . '"></input>
    29.                             <b>Старая цена</b>
    30.                             <input class="sale" type="text" name="sale" value="' . $product_array['sale'] . '"></input><br><br>
    31.                             <center>
    32.                                 <div class="photo">
    33.                                     <b>Основное фото</b><br>
    34.                                     <img class="redact" src="' . $product_array['avatar'] . '"></img><br>
    35.                                     <input class="photo" type="text" name="avatar" value="' . $product_array['avatar'] . '"></input>
    36.                                 </div>
    37.                                 <div class="photo">
    38.                                     <b>Второе фото</b><br>
    39.                                     <img class="redact" src="' . $product_array['photo1'] . '"></img><br>
    40.                                     <input class="photo" type="text" name="photo1" value="' . $product_array['photo1'] . '"></input>
    41.                                 </div>
    42.                                 <div class="photo">
    43.                                     <b>третье фото</b><br>
    44.                                     <img class="redact" src="' . $product_array['photo2'] . '"></img><br>
    45.                                     <input class="photo" type="text" name="photo2" value="' . $product_array['photo2'] . '"></input>
    46.                                 </div>
    47.                             <center><br>
    48.                          
    49.                             <b>Выберите категорию</b>
    50.                             <select name="catecory">
    51.                                 <option value=" ">Без категории</option>';
    52.                                 while($category_array = mysqli_fetch_array($category)){
    53.                                     echo '<option value="' . $category_array['id'] . '">' . $category_array['name'] . '</option>';
    54.                                 }
    55.                              
    56.                 echo '  
    57.                             </select><br><br><br>
    58.                             <input class="id" type="text" name="id" value="' . $product_array['id'] . '"></input>
    59.                             <input class="id" type="text" name="id" value="' . $product_array['shopid'] . '"></input>
    60.                             <input class="submit" type="submit" value="Обновить">
    61.                         </form>
    62.                     </div>
    63.                 </div>';
    64.              
    65.             }else{
    66.                 echo 'У вас нет доступа';
    67.             }
    68.          
    69.         }else{
    70.             echo 'Доступ закрыт';
    71.         }?>
    Все работает прекрасно, если id пользователя не совпадает с полем shopid у товара то он видит соответствующее сообщение, а если совпадает он видит форму с редактированием.

    Но беда в том что когда форма заполнена и мы ее отправляем на страницу обработчик, выходит сообщение о том что доступ запрещен, и хотя страница другая и там нет таких условий (Обработчик просто обновляет все поля у товара с id который был получен методом POST)
    То есть сообщение берется не со страницы обработчика, а с той страницы где у меня форма ввода, я полагаю что каким то образом накосячил и передаю это условие в сессии, а оно мне не нужно, ведь проверку доступа мы прошли уже на предыдущем этапе и чужой товар не смогли бы отправить обработчику на UPGRADE.

    Пожалуйста, посмотрите код, подскажите что тут не так работает.
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    У меня даже слов нет, что бы повежливее объяснить на сколько вы не правы.
    @German, я конечно понимаю, что порог вхождения в РНР очень низкий, но ответьте мне на вопрос, почему человек вчера первый раз написавший <?php echo "Привет, мир!"; ?> сегодня уже берётся за изготовление интернет магазина?
    Даже не принимая во внимание SQL-инъекции, ваш код мягко говоря "не в транду". Для написания интернет магазина знаний необходимо вагон и маленькую тележку, и речь не о базовых знаниях (а сейчас именно их вам не хватает).
    Что вы хотите прочитать на форуме задавая подобный вопрос, что бы кто-то перепечатал из книги 200-300 страниц печатного текста, для того что бы у вас хоть что-то устаканилось в голове?
    P.S. я не злой
     
  3. German

    German Новичок

    С нами с:
    4 окт 2018
    Сообщения:
    9
    Симпатии:
    0
    Да, да. Злодей)
    Я уже разобрался в чем дело, дело в том что я в форме указал путь redact.php и бразузер просто добавил это к текущему адресу, я заменил на абсолютный путь и все заработало.
    И кстати, я не пишу интернет магазин для выкладывания его в сеть, я учусь. Практическое обучение мне нравится больше. Я придумал что хочу сделать и делаю. Про SQL-инъекции я знаю, но пока не добрался до них, да и не нашел хорошего материала, если можете посоветовать что почитать, буду рад.
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Этого мало. Во первых всё уже давно придумано. Во вторых даже если хочется придумывать самому, то делать это надо правильно, а ты делаешь не так как надо, а как получится и радуешься, а в итоге правильного варианта ты можешь никогда и не узнать.
    Теория без практики - это хорошие знания. Практика без теории - это никому не нужный говнокод. Выбирай золотую середину - практика после основательного изучения теории.
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    прежде чем использовать переменные - нужно их проверить
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    На каком таком пред. этапе? При отображении формы по GET что ли? :D ЩА буду злорадствовать :) Авторизацию нужно делать и по POST. Более того, не мешало бы связать GET и POST каким-нибудь CSRF-токеном ;) Книжки называть не буду, вы все равно читать их не умеете.