Dnes už na internetu existuje spousta bazarů, více či méně kvalitních. Pokud jste také po takovém bazaru zatoužili, můžete se inspirovat právě tímto seriálem, v němž si ukážeme postup tvorby jednoduchého bazaru.

Seriál využívá informací a databáze z článku Registrace uživatelů v PHP, znalost tohoto článku je tedy nezbytná. Také se hned v úvodu můžete podívat na funkční ukázku bazaru.

Budeme potřebovat celkem 4 databázové tabulky: „redirect“, „category“, „advertise“ a „adv_support“. Tabulku „redirect“ již máme vytvořenou, vytvoříme tedy tabulku „category“, která slouží pro uchovávání kategorií bazaru:

CREATE TABLE category (
  id varchar(255) NOT NULL default “,
  title varchar(30) NOT NULL default “,
  PRIMARY KEY (id)
)

Jako další vytvoříme tabulku „advertise“ pro uchovávání vlastních inzerátů:

CREATE TABLE advertise (
  id int(20) NOT NULL auto_increment,
  col tinyint(4) NOT NULL default ‚0‘,
  cate varchar(255) NOT NULL default ‚0‘,
  uid int(20) NOT NULL default ‚0‘,
  advtext text NOT NULL,
  start int(20) NOT NULL default ‚0‘,
  end int(20) NOT NULL default ‚0‘,
  PRIMARY KEY (id)
)

Poslední tabulkou je adv_support, jejíž význam vysvětlím později:

CREATE TABLE adv_support (   deltime int(20) NOT NULL default ‚0‘ )

Dále budeme používat scripty opendb.php a config.php. Můžeme použít soubor opendb.php, který máme z Registrace uživatelů, ale config.php si budeme muset trochu upravit:

<?PHP
$now = gmdate(‚D, d M Y H:i:s‘) . ‚ GMT‘; // zamezení cachování aplikace
header(‚Expires: 0‘); // rfc2616
header(‚Last-Modified: ‚ . $now);
header(‚Cache-Control: no-store, no-cache, must-revalidate‘); // HTTP/1.1
header(‚Cache-Control: pre-check=0, post-check=0, max-age=0‘); // HTTP/1.1
header(‚Pragma: no-cache‘); // HTTP/1.0
set_magic_quotes_runtime(1); // nastavit automatické přidávání zpětných lomítek do údajů předáváných z formulářů
$cate_explode = (!empty($_GET[„cate“]) ? explode(„-„, $_GET[„cate“]) : (!empty($_POST[„cate“]) ? explode(„-„, $_POST[„cate“]) : „“));
$count_cate = ((!empty($_GET[„cate“]) || !empty($_POST[„cate“])) ? count($cate_explode) : 0);
?>

Nyní si připravíme vlastní skript advertise.php, který slouží k vypisování inzerátů. Začneme vkládáním konfiguračních souborů, hlavičkami stránky a ošetřením proměnných, které se předávají z formuláře:

<?PHP
include(„opendb.php“);
include(„config.php“);
?>
<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.0 Transitional//EN“>
<html>
<head>
  <title>Bazar – vyhledávání inzerátů</title>
</head>
<body>
<?PHP
// ošetření proměnných
$_GET[„col“] = $_GET[„col“]*1;
$_GET[„cate“] = htmlspecialchars(addslashes($_GET[„cate“]));
$_GET[„findw“] = htmlspecialchars(addslashes($_GET[„findw“]));
$_GET[„from“] = $_GET[„from“]*1;
$_GET[„cshow“] = $_GET[„cshow“]*1;
if ($_GET[„cshow“] < 1 || $_GET[„cshow“] > 100)
  $_GET[„cshow“] = 30;

Nyní vymažeme staré inzeráty. Tady se dostáváme k účelu tabulky „adv_support“. Při každé návštěvě bazaru zjistíme z tabulky časový údaj v sekundách od roku 1970. Pokud je tento údaj větší nebo roven aktuálnímu času ($akttime), smažeme staré inzeráty a aktualizujeme časový údaj v tabulce adv_support (zvětšíme ho o 86 400 sekund, což je délka jednoho dne). Takže další den „promažeme“ inzeráty znovu:

// mazání starých inzerátů
do {
  $query = @mysql_query(„SELECT deltime FROM adv_support“);
  if (empty($query)):
    echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
    break;
  endif;
  $zaznam = @mysql_fetch_array($query);
  $akt_time = time();
  if ($akt_time >= $zaznam[„deltime“]):
    $query = @mysql_query(„DELETE FROM advertise WHERE end < „.$akt_time);
    if (empty($query)):
      echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
      echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
    else:
      $query = @mysql_query(„UPDATE adv_support SET deltime = „.($akt_time+8640));
      if (empty($query)):
        echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
      endif;
    endif;
  endif;
} while (false);

Dále vložíme formulář ze souboru advertise_form.php. Ten se používá na filtraci inzerátů:

// vložení formuláře
include(„advertise_form.php“);
echo „<br><br>“;

Generujeme SQL dotaz pro filtraci inzerátů:

do {
  // generování SQL dotazu
  $sql = „“;
  if (!empty($_GET[„col“]))
    $sql .= “ AND col = „.$_GET[„col“];
  if (!empty($_GET[„cate“]))
    $sql .= “ AND cate LIKE ‚“.$_GET[„cate“].“%'“;
  if (!empty($_GET[„fword“]))
    $sql .= “ AND advtext LIKE ‚%“.$_GET[„fword“].“%'“;

V další části vykonáme SQL dotaz a vypíšeme inzeráty:

// vykonání SQL dotazu a vypsání inzerátů
  $query = mysql_query(„SELECT advertise.id, advtext, redirect.id, user, email FROM advertise, redirect WHEREredirect.id = advertise.uid“.$sql.“ ORDER BY advertise.start DESC LIMIT „.$_GET[„from“].“,“.$_GET[„cshow“]);
  if (empty($query)):
    echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
    break;
  endif;
  while ($zaznam = @mysql_fetch_array($query))
    echo $zaznam[„advtext“].“<br><br><b>Inzeruje:</b> „.$zaznam[„user“].“<br>\n<b>E-mail:</b> „.$zaznam[„email“].“<br>\n<hrwidth=\“100%\“ size=\“1\“><br>\n\n“;

Vypíšeme informaci o tom, kolik inzerátů se našlo:

// vypsání počtů inzerátů
  if (eregi(„^ AND (.*)$“, $sql, $dotaz))
    $sql = “ WHERE „.$dotaz[1];
  $query = @mysql_query(„SELECT id FROM advertise“.$sql);
  if (empty($query)):
    echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
    break;
  endif;
  $count_adv = @mysql_num_rows($query);
  echo „Ve zvolené kategorií „;
  if (empty($count_adv)):
    echo „nenalezen žádný inzerát“;
  elseif ($count_adv == 1):
    echo „nalezen 1 inzerát“;
  elseif (($count_adv >= 2) && ($count_adv <= 4)):
    echo „nalezeny $count_adv inzeráty“;
  else:
    echo „nalezeno $count_adv inzerátů“;
  endif;
  echo „<br><br>\n“;

Nakonec budeme vypisovat skupiny inzerátů ve tvaru 1-20 21-40 … 521-541. Vypisování je ovlivněno tím, kolik uživatel zadal, že chce mít na stránce inzerátů ($_GET[„cshow“]), a je rozděleno na tři části (vypsání první skupiny, vypsání prostředních skupin a vypsání poslední skupiny). Začneme generováním pomocných proměnných a výpisem první skupiny:

// výpis stránkování
  if ($count_adv > $_GET[„cshow“]):
    echo (!empty($_GET[„from“]) ? „<a href=\“advertise.php?col=“.$_GET[„col“].“&cate=“.$_GET[„cate“].“&fword=“.$_GET[„fword“].“&cshow=“.$_GET[„cshow“].“&from=0&\“>“ : „“).“1″.(($_GET[„cshow“] >1) ? (“ – „.$_GET[„cshow“]) : „“).(!empty($_GET[„from“]) ? „</a>“ : „“).“  „;
    $mod_count = $count_adv % $_GET[„cshow“];
    if (empty($mod_count))
      $mod_count = $_GET[„cshow“];
    $floor_count = $count_adv – $mod_count;
    $start_count = $_GET[„from“] – (4 * $_GET[„cshow“]);
    if (($start_count + (8 * $_GET[„cshow“])) > $floor_count)
      $start_count = $floor_count – (8 * $_GET[„cshow“]);
    if ($start_count < $_GET[„cshow“])
      $start_count = $_GET[„cshow“];
    if ($start_count > $_GET[„cshow“])
      echo „<b>…..</b>  „;

Dále vypíšeme prostřední skupiny inzerátů:

for ($i = $start_count; $i < ((9 * $_GET[„cshow“]) + $start_count); $i += $_GET[„cshow“]):
  if ($i >= $floor_count)
    break;
  echo (($_GET[„from“] != $i) ? „<a href=\“advertise.php?col=“.$_GET[„col“].“&cate=“.$_GET[„cate“].“&fword=“.$_GET[„fword“].“&cshow=“.$_GET[„cshow“].“&from=$i\“>“ : „“).($i + 1).(($_GET[„cshow“] > 1) ?(“ – „.($i + $_GET[„cshow“])) : „“).(($_GET[„from“] != $i) ? „</a>“ : „“).“  „;
endfor;

A poslední skupina inzerátů:

if ($i < $floor_count):
    echo „<b>…..</b>  „;
  endif;
  if ($i < $count_adv)
    echo (($_GET[„from“] != $floor_count) ? „<a href=\“advertise.php?col=“.$_GET[„col“].“&cate=“.$_GET[„cate“].“&fword=“.$_GET[„fword“].“&cshow=“.$_GET[„cshow“].“&from=$floor_count\“>“ : „“).($floor_count + 1).(($mod_count >1) ? (“ – „.($count_adv)) : „“).(($_GET[„from“] != $floor_count) ? „</a>“: „“).“  „;
endif;

Nyní vše ukončíme:

} while(false);
?>
</body>
</html>

Soubor advertise.php máme za sebou, následujeadvertise_form.php. Nejdříve zjistíme, jestli aktuální kategorie má ještě nějaké podkategorie a vypíšeme začátek formuláře:

<?PHP
// 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;
?>
<table>
<tr>
  <td>
    <fieldset>
      <legend>Výpis inzerátů</legend>
      <form action=“advertise.php“ name=“cateform“>
        <?PHP echo (@mysql_num_rows($query) ? „<noscript>“ : „“)?><input type=“hidden“ name=“cate“ value=“<?PHP echo $_GET[„cate“] ?>“><?PHP echo(@mysql_num_rows($query) ? „</noscript>“ : „“)?>
        <table cellpadding=“3″>
        <tr>
          <td><input type=“radio“ name=“col“ value=“1″ <?PHP echo ($_GET[„col“] == 1) ? „checked=\“checked\““ : „“ ?>> <b>chci prodat</b></td><td> </td>
        </tr>
        <tr>
          <td><input type=“radio“ name=“col“ value=“2″ <?PHP echo ($_GET[„col“] == 2) ? „checked=\“checked\““ : „“ ?>> <b>chci koupit</b></td><td> </td>
        </tr>
        <tr>
          <td><input type=“radio“ name=“col“ value=“3″ <?PHP echo ($_GET[„col“] == 3) ? „checked=\“checked\““ : „“ ?>> <b>chci vyměnit</b></td><td> </td>
        </tr>
        <tr>
          <td><br>

Vypíšeme hlavní kategorie a připravíme tabulku na výpis prošlých kategorií a podkategorií. V SQL dotazu používáme regulární výraz, který se uvozuje slovem REGEXP a ohraničuje uvozovkami:

<?PHP
do {
  // výpis hlavních kategorií
  $query2 = @mysql_query(„SELECT id, title FROM category WHERE id REGEXP \“^[[:digit:]]$\““);
  if (empty($query2)):
    echo „Omlouváme se, probíhá úprava serveru.<br>\n“;
    break;
  endif;
  while ($zaznam = @mysql_fetch_array($query2)):
    echo „<a href=\“advertise.php?col=“.$_GET[„col“].“&cate=“.$zaznam[„id“].“&fword=“.$_GET[„fword“].“&cshow=“.$_GET[„cshow“].“\“>“.$zaznam[„title“].“</a>   „;
  endwhile;
?>
          </td>
        </tr>
        <tr>
          <td>
            <table>
            <tr>

Vypíšeme prošlé kategorie:

// vypsání prošlých kategorií
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=\“advertise.php?col=“.$_GET[„col“].“&cate=“.$cate_explode[0].“&fword=“.$_GET[„fword“].“&cshow=“.$_GET[„cshow“].“\“>“) : „“).$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;  

Vypíšeme podkategorie, aby uživatel mohl libovolně surfovat po kategoriích. Máme 2 možnosti podle toho, jestli uživatel má zapnutý nebo vypnutý JavaScript. Pokud ho má zapnutý, jako podkategorie vykreslíme rolovací výběr (SELECT), jinak podkategorie příjdou pod sebe:

// vypsání podkategorií
if (@mysql_num_rows($query)):
  echo „\n<script language=\“JavaScript1.2\“ type=\“text/javascript\“><!–\n“;
  echo „document.write(‚<td><select name=\“cate\“ size=\“1\“ onchange=\“document.all.cateform.submit()\“><option value=\““.$_GET[„cate“].“\“>Prosím,vyberte podkategorii</option>“;
  $i = 0;
  while ($zaznam = @mysql_fetch_array($query)):
    echo „<option value=\““.$zaznam[„id“].“\“>“.$zaznam[„title“].“</option>“;
    $zaznam2_id[$i] = $zaznam[„id“];
    $zaznam2_title[$i++] = $zaznam[„title“];
  endwhile;
  echo „‚);\ndocument.write(‚</select></td></tr>‘);\n–></script>\n<noscript>\n“;

JavaScript je vypnutý, generujeme proměnnou $cate_nbsp, která nám pomůže podkategorie zarovnat pod sebe při jejich výpisu:

// 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;
// vypsání podkategorií pod sebe
for ($i = 0; $i < count($zaznam2_id); $i++):
  echo (!empty($i) ? $cate_nbsp : „“).“<td><a href=\“advertise.php?col=“.$_GET[„col“].“&cate=“.$zaznam2_id[$i].“&fword=“.$_GET[„fword“].“&cshow=“.$_GET[„cshow“].“\“>“.$zaznam2_title[$i].“</a></td></tr>\n“;
endfor;
echo „</noscript>“;

Pokud aktuální kategorie už nemá žádné podkategorie, nebudeme nic vypisovat, pouze regulérně ukončíme tabulku:

else:
  echo „\n </tr>“;
endif;
echo „\n </table>“;
} while(false);
?>

A úplně na závěr dokončíme formulář a hlavní tabulku:

          </td>
        </tr>
        <tr>
          <td colspan=“2″><b>Hledat:</b> <input type=“text“ name=“fword“ size=“35″ value=“<?PHP echo $_GET[„fword“] ?>“ autocomplete=“off“></td>
        </tr>
        <tr>
          <td colspan=“2″><b>Inzerátů na stránce:</b> <input type=“text“name=“cshow“ size=“2″ maxlength=“3″ value=“<?PHP echo $_GET[„cshow“]?>“> (1-100)</td>
        </tr>
        <tr>
          <td colspan=“2″> </td>
        </tr>
        <tr>
          <td colspan=“2″ align=“center“> <input type=“submit“ value=“Vyhledat“></td>
        </tr>
        </table>
      </form>
    </fieldset>
  </td>
</tr>
</table>

Oba skripty, upravený config.php a SQL příkazy na tvorbu tabulek si můžete stáhnout.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

2 Příspěvků v diskuzi

  1. Autor mj. uvádí „Seriál využívá informací a databáze z článku Registrace uživatelů v PHP, znalost tohoto článku je tedy nezbytná.“. Ovšem přikliknutí na odkaz pro výpis zmíněného článku obdržíte informaci o tom, že stránka nebyla nalezena. Tím se vlastně článěk k vytvoření internetového bazaru stává bezpředmětným :-(

  2. Jen dve veci:
    – clanek je 8 let stary (!).
    – pokud chcete najit dany clanek o registraci uzivatelu v PHP, proste zadate jehonazev do vyhledavani a kupodivu, vyjede vam hned na prvnim miste.

Odpovědět