Internetový bazar v PHP 2.

2. října 2002

Internetový bazar rozšíříme o možnost vkládat inzeráty do databáze. Pro tuto akci už musí být uživatel řádně registrován a přihlášen, absolvování předešlého článku je tedy nutností.

Vložíme konfigurační soubory (config.php a opendb.php) a ověříme, jestli je uživatel přihlášen (vložením login.php). Načneme stránku a ošetříme proměnné, které se nastavují prostřednictvím formuláře:

<?PHP
require („config.php“);
require („opendb.php“);
include(„login.php“);
?>
<html>
<head>
<meta http-equiv=“Cache-Control“ content=“no-store, no-cache, must-revalidate“>
<meta http-equiv=“Pragma“ content=“no-cache“>
<meta http-equiv=“Expires“ content=“0″>
<meta http-equiv=“Content-Type“ content=“text/html; charset=iso-8859-2″>
<title>Bazar</title>
</head>
<body>
<?PHP
// ošetření proměnných
$_GET[„cate“] = htmlspecialchars($_GET[„cate“]);
$_POST[„text_ins“] = nl2br(htmlspecialchars($_POST[„text_ins“]));
$_POST[„col“] = $_POST[„col“]*1;
if ($_POST[„col“] < 1 || $_POST[„col“] > 3)
  $_POST[„col“] = 1;
$_POST[„valtime“] = $_POST[„valtime“]*1;
if ($_POST[„valtime“] < 1 || $_POST[„valtime“] > 30)
  $_POST[„valtime“] = 30;

Rozlišujeme celkem tři stavy skriptu. Pokud uživatel vstoupil na stránku poprvé (neodeslal ještě žádný formulář), vypíšeme 1. formulář. Pokud uživatel odeslal 1. formulář, vypíšeme 2. formulář. Pokud uživatel odeslal 2. formulář, ošetříme proměnné z 2. formuláře a vložíme inzerát do databáze:

do {
  // uživatel odeslal 2. formulář
  if ($_POST[„submit“] == „Vložit do bazaru“):
    // ošetření povinných údajů
    if (empty($_POST[„text_ins“])):
      echo „Není zadán text inzerátu.<br>\n“;
      include(„advinsert_form2.php“);
      break;
    endif;
    $query = @mysql_query(„INSERT INTO advertise VALUES(NULL, „.$_POST[„col“].“, ‚“.$_POST[„cate“].“‚, „.$uid.“, ‚“.$_POST[„text_ins“].“‚, „.time().“, „.(time() + (86400 * $_POST[„valtime“])).“)“);
    if (empty($query)):
      echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
    else:
      echo „Inzerát byl vložen do bazaru.<br>\n“;
    endif;

Pokud nebyl odeslán 2. formulář, zbývají nám ještě 2 možnosti: buď je návštěvník na stránce poprvé nebo mohl odeslat 1. formulář. V tom případě ověříme, zda je vybraná kategorie na nejnižší úrovni (nemá už pod sebou další podkategorie). A to tak, že nejdříve pošleme SQL dotaz na podkategorie té kategorie, kterou nám uživatel zadal v 1. formuláři. V SQL dotazu používáme regulární výraz, vysvětlování jeho použití v SQL dotazu je však přes rámec článku. Následně ověříme, jestli SQL dotaz vrátil nějaké výsledky. Pokud ano, existují ještě podkategorie. V tom případě vypíšeme ještě 1. formulář (advinsert_form1.php). Pokud již žádné výsledky vráceny nebyly, vypíšeme už 2. formulář (advinsert_form2.php):

  // uživatel odeslal 1 formulář
  elseif ($_GET[„submit“] == „Krok 2“):
    // uživatel mohl vložit inzerát do úrovně, která pod sebou má i další
    $query = @mysql_query(„SELECT id, title FROM category WHERE id REGEXP \“^“.(!empty($_GET[„cate“]) ? $_GET[„cate“].“-“ : „“).“[[:digit:]]$\““); 
    if (empty($query)):
      echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
      break;
    endif;
    // ověření správnosti kategorie, vypsání formulářů
    if (@mysql_num_rows($query)):
      echo „Kategorie inzerátu není na nejnižší úrovni. Prosím zvolte nejvhodnější podkategorii.<br>\n“;
      include („advinsert_form1.php“);
    else:
      include („advinsert_form2.php“);
    endif;

Poslední stav scriptu se provede, pokud uživatel neodeslal ani 1. ani 2. formulář, vypíšeme tedy 1. formulář a ukončíme stránku:

  // uživatel vstoupil na stránku poprvé, zobrazíme první registrační formulář
  else:
    include („advinsert_form1.php“);
  endif;
} while(false);
?>
</body>
</html>

Skript ‚advinsert.php‘ už máme za sebou, vrhneme se na ‚advinsert_form1.php‘. Načneme formulář a PHP kód:

<h3>Vyberte prosím kategorii inzerátu:</h3>
<form action=“advinsert.php“>
<input type=“hidden“ name=“cate“ value=“<?PHP echo $_GET[„cate“] ?>“>
<?PHP
do {

Vypíšeme hlavní kategorie, přičemž využijeme výhod regulárních výrazů při sestavování SQL dotazu:

  // výpis hlavních kategorií
  $query = @mysql_query(„SELECT id, title FROM category WHERE id REGEXP \“^[[:digit:]]$\““);
  if (empty($query)):
    echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
    break;
  endif;
  while ($zaznam = @mysql_fetch_array($query)):
    echo „<a href=\“advinsert.php?cate=“.$zaznam[„id“].“\“>“.$zaznam[„title“].“</a>   „;
  endwhile;

Načteme podkategorie, v SQL dotazu opět používáme regulární výrazy:

  // zjištění podkategorií
  $query = @mysql_query(„SELECT id, title FROM category WHERE id REGEXP \“^“.(!empty($_GET[„cate“]) ? $_GET[„cate“].“-“ : „“).“[[:digit:]]\““);
  if (empty($query)):
    echo „Omlouváme se, probíhá úprava serveru.<br>\n!“;
    break;
  endif;

Vypíšeme prošlé kategorie, které budou ve tvaru ‚kategorie_1 => kategorie_2 => aktualní kategorie‘. Protože veškeré předávání kategorií mezi scripty probíhá ve formátu ‚číslo_kategorie_1-číslo_kategorie_2-číslo_kategorie_3‘, používáme pole $cate_explode, které má ve svém každém prvku číslo jedné kategorie. Čísluji od ‚nejobecnější‘ kategorie až k „nejpodrobnější“. V proměnné $count_cate máme počet prvků právě tohoto pole. V tom případě můžeme snadno vytvoři smyčku for. Ta načte z databáze a následně vypíše kategorie ve formátu, který jsme si ukazovali:

  $cate_explode = explode(„-„, $_GET[„cate“]);
  // vypsání prošlých kategorií
  echo „\n<br><br><table><tr>\n“;
  if (!empty($count_cate)):
    for ($i = 0; $i < $count_cate; $i++):
      $query2 = @mysql_query(„SELECT title FROM category WHERE id LIKE ‚“.$cate_explode[0].“‚“);
      if (empty($query2)):
        echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
        break(2);
      endif;
      $zaznam = @mysql_fetch_array($query2);
      echo „<td>“.($cate_explode[0] != $_GET[„cate“] ? („<a href=\“advinsert.php?cate=“.$cate_explode[0].“\“>“) : „“).$zaznam[„title“].($cate_explode[0] != $_GET[„cate“] ? „</a>“ : „“).(($i < $count_cate-1) ? “ =>“ : (@mysql_num_rows($query) ? “ =>“ : „“)).“</td>“;
      $cate_explode[0] .= „-„.$cate_explode[$i+1];
    endfor;
  endif;

Dále generujeme proměnnou $cate_nbsp, abychom mohli vypsat kategorie pěkně pod sebe. Také generujeme ostatní proměnné, abychom mohli správně určit u které kategorie máme vypsat element <input> a kterou máme vypsat jako odkaz. Prvky pole $under_id obsahují postupně id jednotlivých kategorií, prvky pole $under_title jména jednotlivých podkategorií. Prvky pole $under_under mají logickou hodnotu podle toho, zda daná kategorie ještě obsahuje nějaké podkategorie:

  // generování proměnné $cate_nbsp, abychom pak mohli vypsat podkategorie pod sebe
  $cate_nbsp = „<tr>“;
  for ($i = 0; $i < $count_cate; $i++):
    $cate_nbsp .= „<td> </td>“;
  endfor;
  // zjištění, které kategorie mají podkategorie a generování proměnných na další práci
  while ($zaznam = @mysql_fetch_array($query)):
    if (eregi(„^“.(!empty($_GET[„cate“]) ? $_GET[„cate“].“-“ : „“).“[[:digit:]]$“, $zaznam[„id“])):
      $under_id[count($under_id)] = $zaznam[„id“];
      $under_title[count($under_title)] = $zaznam[„title“];
    elseif (eregi(„(^“.(!empty($_GET[„cate“]) ? $_GET[„cate“].“-“ : „“).“[[:digit:]])-[[:digit:]]$“, $zaznam[„id“], $shody)):
      $under_under[$shody[1]] = 1;
    endif;
  endwhile;

Vypíšeme kategorie pod sebe. Ty, které pod sebou mají další kategorie (nastaveno $under_under), vypíšeme jako odkaz, a ty, které pod sebou další kategorie nemají (!$under_under), vypíšeme s „radiobuttonem“ (přepínačem) na začátku. Dále uzavřeme formulář:

  // vypsání podkategorií pod sebe
  for ($i = 0; $i < count($under_id); $i++):
    echo (!empty($i) ? $cate_nbsp : „“).“<td>“.($under_under[$under_id[$i]] ? „<a href=\“advinsert.php?cate=“.$under_id[$i].“\“>“ : „<input type=\“radio\“ name=\“cate\“ value=\““.$under_id[$i].“\“>“).$under_title[$i].($under_under[$under_id[$i]] ? „</a>“ : „“).“</td></tr>\n“;
  endfor;
  echo (empty($i) ? „</tr>“ : „“).“</table><br>\n“;
} while(false);
?>
<input type=“submit“ name=“submit“ value=“Krok 2″>
</form>

První formulář je za námi, pojďme tedy na druhý, který je jednoduchý a neobsahuje již žádný složitější PHP kód:

<form action=“advinsert.php“ method=“post“>
<input type=“hidden“ name=“cate“ value=“<?PHP echo (!empty($_GET[„cate“]) ? $_GET[„cate“] : (!empty($_POST[„cate“]) ? $_POST[„cate“] : „“)) ?>“>
<table>
<tr><td colspan=“2″><input type=“radio“ name=“col“ value=“1″ <?PHP echo ($_POST[„col“] == 1) ? „checked=\“checked\““ : „“ ?>> <b>Prodám</b><br></td></tr>
<tr><td colspan=“2″><input type=“radio“ name=“col“ value=“2″ <?PHP echo ($_POST[„col“] == 2) ? „checked=\“checked\““ : „“ ?>> <b>Koupím</b><br></tr>
<tr><td colspan=“2″><input type=“radio“ name=“col“ value=“3″ <?PHP echo ($_POST[„col“] == 3) ? „checked=\“checked\““ : „“ ?>> <b>Vyměním</b><br><br></tr>
<tr><td> </td><td> </td></tr>
<tr><td valign=“top“><b>Text:</b></td><td><textarea cols=“30″ rows=“5″ name=“text_ins“ autocomplete=“off“><?PHP echo $_POST[„text_ins“] ?></textarea></td></tr>
<tr><td><b>Platnost:</b></td><td><input type=“text“ name=“valtime“ size=“2″ maxlength=“2″ value=“<?PHP echo ($_POST[„valtime“] != 30) ? $_POST[„valtime“] : „30“ ?>“> dnů (max. 30)</td></tr>
<tr><td colspan=“2″ align=“center“><input type=“submit“ name=“submit“ value=“Vložit do bazaru“></td></tr>
</table>
</form>

Všechny tři skripty pro vkládání inzerátu jsou připraveny ke stažení. V příštím, závěrečném článku, se rozloučíme mazáním inzerátů.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *