Магазин подарков для портала

Тема в разделе "PHP", создана пользователем stimblasta, 13 июл 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. stimblasta

    stimblasta Писатель

    Регистр.:
    10 июл 2010
    Сообщения:
    6
    Симпатии:
    1
    Всем привет! Я не так хорошо знаю PHP , но стараюсь и изучаю по тихоньку. После создание своей ( простой ) CMS мне захотелось для пользователей сделать Магазин с подарками за баллы.

    Т.е пользователь набирает определённое кол- во баллов( администратор к примеру добавляет их) и выбирает подарок по стоимости.

    Скрипт написал примитивный, но может кому понадобится.
    Делал на своей система авторизации.

    ____
    Таблица magazin

    Поле Тип Null По умолчанию Комментарии
    id_podarka int(5) Нет
    podarok varchar(255) Нет
    cena int(5) Нет
    title varchar(255) Нет

    _____

    Таблица podarki

    id int(4) Нет
    user_id int(7) Нет
    id_podarka int(7) Нет
    podarok varchar(255) Нет
    comment text Нет
    otkogo varchar(255) Нет

    Думаю тут всё понятно, теперь приступим к самому коду.

    Сам магазинчик.. форма с выбором подарка, добавление комментарий и какому пользователю отправить)

    PHP:
      <form action="magazin_o.php" method="post">
    <? 

    $result20 = mysql_query("SELECT * FROM magazin ORDER BY cena DESC");      
    $myrow20 = mysql_fetch_array($result20);
    $id_podarka = addslashes($id_podarka);  
    do 
    {
    printf ("<p><input name='id_podarka' type='radio' value='%s'><label>%s <img src='images/podarki/%s'> | Цена: %s баллов</label></p>",$myrow20["id_podarka"],$myrow20["title"],$myrow20["podarok"],$myrow20['cena']);

    }

    while ($myrow20 = mysql_fetch_array($result20));
    ?>
     <p>
               <label>Выберите получателя <br>
               
               <select name="id">
               
               <?
               
           $result30 = mysql_query("SELECT login,id FROM users",$db);

    if (!$result30)
    {
    echo "<p>Запрос на выборку данных из базы не прошел.</p>";
    exit(mysql_error());
    }

    if (mysql_num_rows($result30) > 0)

    {
    $myrow = mysql_fetch_array($result30); 

    do 
    {
    printf ("<option value='%s'>%s</option>",$myrow["id"],$myrow["login"]);



    }
    while ($myrow = mysql_fetch_array($result30));



    }

    else
    {
    echo "<p>Информация по запросу не может быть извлечена в таблице нет записей.</p>";
    exit();
    }

    ?>
           
           
           
               </select>
               
               </label>
             </p>
    <p>
               <label>Введите комментарий к подарку:<br>
               <textarea name="comment" id="comment" cols="40" rows="6"></textarea>
               </label>

          <p> <input name="submit" type="submit" value="Купить!"></p>
     
    </form>
     

    и обработчик!
    PHP:
    <?php


    $comment 
    stripslashes($comment);
    $comment htmlspecialchars($comment);
     
    $result20 mysql_query("SELECT * FROM magazin WHERE id_podarka='$id_podarka' ",$db); // из магазина дастаем  подарок с id 13    
    $myrow20 mysql_fetch_array($result20); // пихаем его в массив
    $podarok $myrow20['podarok'];


    $result mysql_query("SELECT * FROM users WHERE id='$ids' ",$db); // достаем данные авторизованного юзера      
    $myrow mysql_fetch_array($result); // пихаем их в массив 
     
     
    if($myrow['dengi'] < $myrow20['cena']) // если у пользователя меньше денег, чем цена подарка 
    {
    echo 
    "Извините, но у вас недостаточно баллов на счету для покупки этого подарка. "
    }
    else
    {
    $dengi $myrow['dengi'];
    $dengi $dengi $myrow20['cena']; 
     
    mysql_query("UPDATE users SET dengi='$dengi' WHERE id='$ids' ",$db);
    //Далее в какой то другой базе ставим метку, что пользователь купил подарок, 
    mysql_query("INSERT INTO podarki (user_id,id_podarka,podarok,comment,otkogo) VALUES ('$id','$id_podarka','$podarok','$comment','$login')",$db);
     
    echo 
    "Поздравляем! Подарок куплен."// кидаем юзера на другую страницу и показываем сообщение, подарок успешно приобретен... 
    }
     
    ?>
    Сразу говорю, тухлыми помидорами не кидаться)) Делал для себя, но выкладываю, может кому то пригодится)И я только продолжаю учится!)

    Вот как выглядит у меня.

    [​IMG]
    [​IMG]
     
  2. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Во первых что сразу бросается в глаза:
    1) Переменные вроде $id_podarka могут появиться только если на хостинге включен magic_quotes_gpc=on. Это такое дурацкое наследие при котором как по мановению волшебной палочки возникают переменные из суперглобалmных массивов $_SESSIONS, $_GET, $_POST, $_COOKIE; Определяй значения таких переменный сам, иначе рискуешь получить NULL вместо нужного значения :
    $id_podarka=$_POST['id_podarka'];
    2) введенные пользователем данные никак не провеяются перед вставкой в SQL запросы. Это чревато взломом сайта через т.н. SQL инъекции. (ищи в инете что это такое и как их не допустить)
     
  3. stimblasta

    stimblasta Писатель

    Регистр.:
    10 июл 2010
    Сообщения:
    6
    Симпатии:
    1
    На счёт первого забыл добавить.
    PHP:
    if (isset($_POST['id_podarka']))      {$id_podarka $_POST['id_podarka']; if ($id_podarka == '') {unset($id_podarka);}}
    if (isset(
    $_POST['comment']))      {$comment $_POST['comment']; if ($comment == '') {unset($comment);}}
    if (isset(
    $_POST['id']))      {$id $_POST['id']; if ($id == '') {unset($id);}}
    На счёт сессий, было расчитано что у пользователей уже готова авторизация! Если у кого не будет, то могу предоставить свою!
    А за замечания спасибо))
    Я пока лишь ученик)

    На счёт SQL иньекции знаю, сам одно время искал их на разных сайтах что бы как то научится с ними бороться, тут видимо не доглядел! И вообще, лично для меня это пока трудновато)
     
  4. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    да просто добавь вверху где нибудь

    PHP:
    $id_podarka addslashes($id_podarka);
     
  5. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Да ничего я не забыл. Просто только обратил внимание на то,что переменную можешь не дождаться. По поводу проверок кроме "пустых строк " еще есть смысл проверять на соответствие а длины строки полям БД, а так же почистить от тегов, а то придет "<script>..." :)
    И вообще, по-хорошему,проверки - это довольно большая часть PHP кода, и должны быть всегда если приходят данные от пользователя будь то Форма, что-то в УРЛ, файлы...
    Конструкцию exit(mysql_error()) лучше не используй, поскольку в случае ошибки она покажет минмимум пол SQL запроса, что ой как выгодно угадай кому :)
     
Статус темы:
Закрыта.