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

Статус
В этой теме нельзя размещать новые ответы.

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 "Поздравляем! Подарок куплен."; // кидаем юзера на другую страницу и показываем сообщение, подарок успешно приобретен... 
}
 
?>

Сразу говорю, тухлыми помидорами не кидаться)) Делал для себя, но выкладываю, может кому то пригодится)И я только продолжаю учится!)

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

de618ca3ba11.jpg

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

На счёт первого забыл добавить.
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 иньекции знаю, сам одно время искал их на разных сайтах что бы как то научится с ними бороться, тут видимо не доглядел! И вообще, лично для меня это пока трудновато)
 
ю, сам одно время искал их на разных сайтах что бы как то научится с ними бороться, тут видимо не доглядел! И вообще, лично для меня это пока трудновато)

да просто добавь вверху где нибудь

PHP:
$id_podarka = addslashes($id_podarka);
 
На счёт первого забыл добавить.
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);}}
Да ничего я не забыл. Просто только обратил внимание на то,что переменную можешь не дождаться. По поводу проверок кроме "пустых строк " еще есть смысл проверять на соответствие а длины строки полям БД, а так же почистить от тегов, а то придет "<script>..." :)
И вообще, по-хорошему,проверки - это довольно большая часть PHP кода, и должны быть всегда если приходят данные от пользователя будь то Форма, что-то в УРЛ, файлы...
Конструкцию exit(mysql_error()) лучше не используй, поскольку в случае ошибки она покажет минмимум пол SQL запроса, что ой как выгодно угадай кому :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху