Autor Zpráva
paTaNiNho
Profil
Dobrý den,
rád bych se podělil s mým problémem všem těm, kteří budou ochotni mi pomoci či mě aspoň navedou na správnou cestu. Jsem v programování spíše začátečník, ale pro svůj projekt potřebuji naprogramovat vlastní control panel pro mé budoucí zákazníky. Konkrétně se jedná o herní control panel, kde uživatel po přihlášení bude moci spravovat vlastní herní server (restartovat, vypínat, upravovat konfiguraci, apod.). Samotné přihlašování by problém být neměl, ale jde mi konkrétně o to, jak odliším jednotlivé uživatele po přihlášení od sebe, tedy, aby se jim po přihlášení objevila unikátní stránka s jeho vybranými službami. Počítám, že po přihlášení se z databáze zjistí jeho ID, pro které bude v další tabulce informace přesně o jeho službách, ale absolutně netuším, jak to svázat dohromady. Tedy, co by vše mělo v tabulce být, ale i v samotném PHP po přihlášení. . .
Poradí mi někdo prosím? Všem ochotným předem děkuji a prosím, mějte se mnou trpělivost.
Alphard
Profil
Návodů na přihlášení se všude válí hromady, zkuste se podívat např. na Nejčastější potíže s PHP (FAQ) » Registrace uživatelů.
V zásadě stačí do tabulky v databázi uložit unikátní identifikátor a heslo. Identita uživatele se pak udržuje pomocí session.
paTaNiNho
Profil
Děkuji. . .s přihlášením problém nemám, jen nechápu, jak každému uživateli volat ten rozdílný obsah. . .šlo by to prosím případně přiblížit?
Alphard
Profil
To s tím blízce souvisí. Přihlášený uživatel má nějaké unikátní id a na jeho základě lze zobrazit unikátní obsah, jak sám píšete. Já nevím, jaké informace přesně potřebujete, ale kdyby bylo možné uložit je do tabulky služeb, dal byste k nim sloupec user_id a podle něho by se poznalo, ke komu daná služba patří.
paTaNiNho
Profil
. . .děkuju, teoreticky to jako začátečník chápu, ale prakticky jsem malinko v rozpacích, možná chci moc, ale nebylo by možné přiblížit mi to pomocí kódu? Jsou to se mnou trable, já vím, ale dost by mě to snad napovědělo. . .
za případnou laskavost jsem Vám předem zavázán
paTaNiNho
Profil
Tak už jsem se posunul dále, nyní PHP podle id přihlášeného pozná, kterou službu mu přiřadit a vypíše ji pomocí:
$server = mysql_query("select * from servers where userid = '".$_SESSION['id']."'");
    while ($serverrow = MySQL_Fetch_Array ($server)):
    <tr>
      <td width="36%"><?php echo $serverrow ["hra"]; ?></td>
      <td width="25%"><?php echo $serverrow ["ip"]; ?></td>
          <td width="15%"><?php echo $serverrow ["port"]; $server_port = $serverrow ["port"]; ?></td>
          <td width="12%">
      <?php
                $stream = ssh2_exec($spojeni,'/bin/sh '.$serverrow ["game_dir"].'./start_n check');
            stream_set_blocking( $stream, true );
            $data = "";
            while( $buf = fread($stream,4096) ){
                $data .= $buf;
        echo $data;
        } 
            fclose($stream);
        ?>
            </td>
            <td width="12%" align="center">
                <form method="post">
                <table style="width:auto; background:#000;" border="0"><tr>
                <td><input type="submit" name="<?php echo "start".$serverrow ["id"]; ?>" value="START" /></td><td> //spuštění serveru
                <input type="submit" name="<?php echo "stop".$serverrow ["id"]; ?>" value="STOP" /></td></tr></table> //vypnutí serveru
                <?php echo "start".$serverrow ["id"];?>
                </form>
            </td>
      </tr>
           endwhile;
Zde jsem si dovolil ořezanou ukázku, narazil jsem nyní na problém, když bude uživatel mít více služeb, jak tlačítko submit rozliší tentokrát ID služby, aby se spustila správná služba. Dal jsem do name tlačítka proměnnou, která tlačítka při více službách na jednoho uživatele odlišně rozdělí podle ID např. (start1, start2, start4). Dále v kódu pak mám if(isset($_POST["start".$serverrow ["id"].""])){, ale nevím co dál, tedy jak rozhodne co to je je za ID služby, aby si mohl vzít její nastavení cesty k spouštěcímu scriptu přímo na serveru.
Asi to zase tak těžké nebude, ale jako amatérovi mi to asi zatím nedochází, tak kdyby někdo tušil a snad se v mém textu aspoň trochu vyznáte vyznáte, ochotným patří mé dík. . .
juriad
Profil
princip je správně
rozlišení služeb můžeš vyřešit pomocí <input type="hidden" name="id" value="<?php echo $serverrow ["id"]; ?>"> a vlastní button bude obsahovat jen akci start/stop

používej jednotný styl:
while {...} oproti while: ... endwhile;
paTaNiNho
Profil
děkuji za upřesnění. . .ale moc mi to nenapovědělo, šlo by to ještě upřesnit?
. . .jak já potom v té podmínce pro kliknutí na button z databáze vytáhnu tu cestu, kterou potřebuji a je psána u každé služby, která je rozlišena ID
omlouvám se, ale s začátečníkama je to asi těžké
juriad
Profil
přidej do form (řádek 20) action="zpracujStartStop.php"

a v souboru zpracujStartStop.php budeš mít:

<?php
session_start();
if(!empty($_POST['id']) && (isset($_POST['start']) || isset($_POST['stop']))) {
  $id = intval($_POST['id']); // mozna jeste dalsi osetreni
  if(isset($_POST['start']) {
    // asi neco jako:
    $server = mysql_query("SELECT * FROM servers WHERE userid = '".$_SESSION['id']."' AND id = '".mysql_real_escape_string($id)."'"); // nezapomen na bezpecnost, never uzivateli, ze v $id bude jen cislo
    $serverrow = MySQL_Fetch_Array ($server);
    if($serverrow !== false) { // zkontroluje, jestli dotaz vratil alespon jeden radek
      // jeste napred by mohla byt kontrola, jestli je server zrovna vypnuty
      $stream = ssh2_exec($spojeni,'/bin/sh '.$serverrow ["game_dir"].'./start_n start');
      ...
    } else {
      // chyba, takovy server neexistuje, vypsat tady chybu nema smysl vzhledem k nasledujicimu presmerovani
      // uloz si ji do SESSION a vypis na nasledujici strance
    }
    ...
  } else if(isset($_POST['stop']) {
    ...
  } else {
    // ted nikdy nenastane, ale treba muzes chtit skript rozsirit o dalsi akce
  }
} else {
  // neplatny pozadavek, nejlepsi je asi ho uplne ignorovat
}
header("Location: index.php"); // akce zpracovana, presmeruj na vypis
// kazde zpracovani POSTu musi koncit přesmerovanim, jinak by refresh odeslal data znovu

je možné zpracovat akci přímo na stránce výpisu, ale je podle mě je vopruz přidávat všude podmínky
paTaNiNho
Profil
děkuji za vyčerpávající odpověď, určitě to podle návodu nějak zpracuji. . .

chtěl bych se zeptat, zdali s tím nemáte někdo zkušenost, ale ještě v samotném statusu serveru (vypisuje voláním scriptu na serveru, zdali je online či offline) - zde:
<td width="12%">
            <?php
            $stream = ssh2_exec($spojeni,'/bin/sh '.$serverrow ["game_dir"].'./start_n check');
            stream_set_blocking( $stream, true );
            $data = "";
            while( $buf = fread($stream,4096) ){
            $data .= $buf;
            echo $data;
            } 
            fclose($stream);
            ?>
</td>
Jsem za $data .= $buf; přidal podmínku, která zjistí, co exec vypsal a uživateli to ukáže malinko hezčeji (prozatím bez .css):
if ($data == "online")
                {
                echo '<strong><font color="#00CC00">Online</font></strong>';
                        }
                else
                {
                echo '<strong><font color="#FF0000">Offline</font></strong>';
                } 
}
. . .ale nějak mi to nefunguje, protože exec asi zapíše výstup do $data jinak než jen "online", i když ve scriptu na serveru mám jen echo "online" či echo "offline", ukazuje to stále Offline, i když je server zapnutý.
Nemáte s tím zkušenosti?
juriad
Profil
domněnka:
echo automaticky odřádkuje, mohl by přebývat new line

zkus pomocí strlen zjistit skutečnou délku řetězce (jestli neobsahuje nějaký bordel), nebo použij regulární výrazy či dotaz na podřetězec (strpos)

if(strpos($data, "online") !== false) {
// online
} else {
// offline
}


pro výpis použij raději:
echo '<span class="online">Online</span>';
a css styl:
.online {
font-weight: bold;
color: #00cc00;
}
podobně pro offline
paTaNiNho
Profil
nezbývá mi nic jiného než poděkovat a oznámit, že jsi FRAJER. . .všechny Tebou poznamenané scripty fungují na jedničku a mě nezbývá nic jiného než se učit a učit, děkuji a kdybych se zase někde zasekl s dovolením se ozvu

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: