Autor Zpráva
SirDoxik
Profil
Dobrý den, pustil jsem se do takového menšího projektu ohledně Minecraft WebShopu. Ovládám HTML/CSS a tímto projektem jsem se chtěl alespoň trochu otrkat s php. Mám takovýto kód (Je poskládaný z více kódů co jsem našel) a háže mi to syntax error a popřípadě parse error. Dokázal by mi někdo pomoct ? Předem díky :)
Obchod.php
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<form method="POST" action="proces.php"> 
  Hráč <input name="player"> 
  Item <input name="item">
  Počet <input name="pocet">
    <input type="hidden" name="UzJsemToOdeslal" value="1"> 
    <input type="Submit" name="odesli"> 
</form> 
</body>
<html>
rcon.php(zde asi chyba nebude)
<?php
/*
RCON remote console class, modified for minecraft compability by Tehbeard.

!!!YOU MUST CONFIGURE RCON ON YOUR MINECRAFT SERVER FOR THIS TO WORK
AT TIME OF WRITING ONLY 1.9pr4+ HAVE BUILTIN RCON SUPPORT!!!

Example Code:
============
include_once("rcon.class.php"); //Include this file
$r = new rcon("127.0.0.1",25575,"foobar"); //create rcon object for server on the rcon port with a specific password
if($r->Auth()){ //Connect and attempt to authenticate
{
  $r->rconCommand("say Saving in 10 seconds!"); //send a command
  sleep(10);
  $r->rconCommand("save-all"); //send a command
  $r->rconCommand("say Save complete!");//send a command
  echo $r->rconCommand("list");//send a command, echo returned value
}
============



Based upon the following work:
[<<<
    Basic CS:S Rcon class by Freman.  (V1.00)
    ----------------------------------------------
    Ok, it's a completely working class now with with multi-packet responses

    Contact: printf("%s%s%s%s%s%s%s%s%s%d%s%s%s","rc","on",chr(46),"cl","ass",chr(64),"pri","ya",chr(46),2,"y",chr(46),"net")

    Behaviour I've noticed:
        rcon is not returning the packet id.
>>>]
*/

define("SERVERDATA_EXECCOMMAND",2);
define("SERVERDATA_AUTH",3);

class RCon {
    var $Password;
    var $Host;
    var $Port = 27015;
    var $_Sock = null;
    var $_Id = 0;

    function RCon ($Host,$Port,$Password) {
        $this->Password = $Password;
        $this->Host = $Host;
        $this->Port = $Port;
        $this->_Sock = @fsockopen($this->Host,$this->Port, $errno, $errstr, 30) or
                die("Unable to open socket: $errstr ($errno)\n");
        $this->_Set_Timeout($this->_Sock,2,500);
        }

    function Auth () {
        $PackID = $this->_Write(SERVERDATA_AUTH,$this->Password);

        // Real response (id: -1 = failure)
        $ret = $this->_PacketRead();
        //var_dump($ret);
        if ($ret[0]['ID'] == -1) {
            return false;
        }
        return true;
    }

    function _Set_Timeout(&$res,$s,$m=0) {
        if (version_compare(phpversion(),'4.3.0','<')) {
            return socket_set_timeout($res,$s,$m);
        }
        return stream_set_timeout($res,$s,$m);
    }

    function _Write($cmd, $s1='', $s2='') {
        // Get and increment the packet id
        $id = ++$this->_Id;

        // Put our packet together
        $data = pack("VV",$id,$cmd).$s1.chr(0).$s2.chr(0);

        // Prefix the packet size
        $data = pack("V",strlen($data)).$data;

        // Send packet
        fwrite($this->_Sock,$data,strlen($data));

        // In case we want it later we'll return the packet id
        return $id;
    }

    function _PacketRead() {
        //Declare the return array
        $retarray = array();
        //Fetch the packet size
        while ($size = @fread($this->_Sock,4)) {
            $size = unpack('V1Size',$size);
            //Work around valve breaking the protocol
            if ($size["Size"] > 4096) {
                //pad with 8 nulls
                $packet = "\x00\x00\x00\x00\x00\x00\x00\x00".fread($this->_Sock,4096);
            } else {
                //Read the packet back
                $packet = fread($this->_Sock,$size["Size"]);
            }
            array_push($retarray,unpack("V1ID/V1Response/a*S1/a*S2",$packet));
        }
        return $retarray;
    }

    function Read() {
        $Packets = $this->_PacketRead();

        foreach($Packets as $pack) {
            if (isset($ret[$pack['ID']])) {
                $ret[$pack['ID']]['S1'] .= $pack['S1'];
                $ret[$pack['ID']]['S2'] .= $pack['S1'];
            } else {
                $ret[$pack['ID']] = array(
                    'Response' => $pack['Response'],
                    'S1' => $pack['S1'],
                    'S2' =>    $pack['S2'],
                );
            }
        }
        return $ret;
    }

    function sendCommand($Command) {
        //$Command = '"'.trim(str_replace(' ','" "', $Command)).'"';
        //$Command="stop";
        $this->_Write(SERVERDATA_EXECCOMMAND,$Command,'');
    }

    function rconCommand($Command) {
        $this->sendcommand($Command);

        $ret = $this->Read();

        //ATM: Source servers don't return the request id, but if they fix this the code below should read as
        // return $ret[$this->_Id]['S1'];
        return $ret[$this->_Id]['S1'];
    }
}
?>
proces.php
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zpracování</title>
</head>
<body>
<?php
// AUTOREM JE m_pro_m, webmaster Minecraft serveru www.mineforlife.eu
// Tento script byl uvolnen pro hosting fakaheda.eu s jeho svolenim

// Dulezite je, aby jste prejmenovali soubor, jinak bude mozne, ze si kdokoliv aktivuje VIP bez zaplaceni
// Take je dulezite, aby jste meli ve stejnem umisteni jako tento soubor take rcon.php!!!

// V nasledujici casti nahradte text v uvozovkach, UVOZOVKY TAM NECHTE, STREDNIK NA KONCI TAKE!
$server = "localhost";
$port = "26565";
$heslo = "asdfkaf1as2d31f3as1d2f";

//////////////////////////////
//RCON CAST, NEUPRAVOVAT!!!!//
//////////////////////////////
$player = $_GET['player'];
$item = $_GET['item'];
$pocet = $_GET['pocet'];
    
include_once("rcon.php"); 
$r = new rcon($server,$port,$heslo);
if($r->Auth())
{
    // Spusti prikaz který dá hráči jeho item
  $r->rconCommand('give ' . $player.  . $pocet .);
      // Spusti prikaz který napíše hráči zprávu že si něco koupil
  $r->rconCommand('msg '.$player.' Koupil jsi'.$pocet.'x'.$item.);
}
}
else {
die('Chyba');
}
?>
</body>
</html>

chyba má být na řádku 31 takže zde $r->rconCommand('give ' . $player. . $pocet .);
Radek9
Profil
SirDoxik:
Operátor . (tečka) je určen ke spojování dvou řetězců. Na některých místech ti přebývají:

  $r->rconCommand('give ' . $player.  . $pocet .);
  $r->rconCommand('msg '.$player.' Koupil jsi'.$pocet.'x'.$item.);

Takže by to mělo vypadat takhle:

  $r->rconCommand('give ' . $player . ' ' . $pocet); // Tady má být, tuším, mezera
  $r->rconCommand('msg ' . $player . ' Koupil jsi' . $pocet . 'x' . $item);
Mike8748
Profil
SirDoxik:
jenom technická, ten příkaz má být

$r->rconCommand('give ' . $player. ' ' .$item. ' ' . $pocet);
tedy "give jmenohrace IDitemu pocet"

pokud by byl příkaz tak jak zde byl uveden tak doufej že si nikdo nekoupí např. 57 bloků hlíny, dostal by diamantový bloky :)
SirDoxik
Profil
Ahoj, moc díky za rady.. Jsem takový antitalent na PHP :') Teď mi to vyhodilo chybu Parse error: syntax error, unexpected '}' in C:\xampp\htdocs\webshop\proces.php on line 33
juriad
Profil
Přebývá tam tato závorka: }
Na 29. řádku je otevírací a na řádcích 34 a 35 jsou zavírací.
anonymníí
Profil *
SirDoxik:
To není o talentu, ale o lenosti. Proč se nepodíváš na ř. 33 a okolní a nespočítáš si závorky?

Já to našel během asi 10 vteřin, že bys to, byť v pár minutách, nezvládl také? Těch závorek tam máš pět a půl. Doslova.
SirDoxik
Profil
Závorku jsem smazal a vyhodilo mi to
Notice: Undefined index: player in C:\xampp\htdocs\webshop\proces.php on line 22

Notice: Undefined index: item in C:\xampp\htdocs\webshop\proces.php on line 23

Notice: Undefined index: pocet in C:\xampp\htdocs\webshop\proces.php on line 24
Unable to open socket: Nemohlo b�t vytvo�eno ��dn� p�ipojen�, proto�e c�lov� po��ta� je aktivn� odm�tl. (10061) tak jsem smazal GET na řádkách 22 23 24 a místo toho jsem tam dal POST a už mi to vypisuje chybu jen Nemohlo b�t vytvo�eno ��dn� p�ipojen�, proto�e c�lov� po��ta� je aktivn� odm�tl. (10061)


tak tohle už taky mam :) díky moc všem za rady :) s další chybou se ozvu :D
SirDoxik
Profil
Dobrý večer, ještě jednou se omlouvám že už tu zase "trapčím" ale narazil jsem na další problém. Tentokrát jsem "dělal" spíše upravoval login do webshopu a narazil jsem na problém. Ani nevím jak to popsat :/ živá ukázka webshop.doxik.eu kód:

Config.php
<?php
$host = 'localhost';
$user = 'kingdoxik';
$pass = 'kikina159';
$db = 'minemax'; 
$connect = mysql_connect($host, $user, $pass);
mysql_select_db($db); 

foreach($_POST as $Index => $Item) $_POST[$Index] = addslashes($Item);
foreach($_GET as $Index => $Item) $_GET[$Index] = addslashes($Item);
?>

register.php
<?php session_start();
include "config.php";
if (isset($_POST['username']) && isset($_POST['password']) && isset($_POST['nick']))
{
  $sql = mysql_query("SELECT id FROM users WHERE login = '$_POST[username]';");
  if(mysql_num_rows($sql) == 0)
    $error = "chyba: uživatel existuje";  
  else 
  {
    mysql_query("
      INSERT INTO users 
      (`login`, `password`, `nick`)
      VALUES
      ('$_POST[username]', '".sha1($_POST['password'])."', '$_POST[nick]')
      ;");
    echo "registrace úspěšná";  
  }
}
else
{
  ?>
  <form id="frm" name="frm" method="POST" action="register.php">
      <span>Login</span><input type="text" name="username">
      <span>Heslo</span><input type="password" name="password">
      <span>Herní nick</span><input type="text" name="nick">
      <input type="submit" value="odeslat">
  </form>
  <?php
}   
?> 
login.php
<?php session_start();
if (isset($_POST['username']) && isset($_POST['password']))
{ 
   include "config.php";
   $sql = mysql_query("SELECT id FROM users WHERE login = '$_POST[username]' AND password = '".sha1($_POST['password'])."';");
   if(mysql_num_rows($sql) == 1)
   {
      $row = mysql_fetch_array($sql);
      $_SESSION['id'] = $row['id'];
      echo "úspěšně přihlášen";
   }
   else echo "přihlášení selhalo";
}
else
{
   ?>
   <form id="frm" name="frm" method="POST" action="login.php">
      <span>Login</span><input type="text" name="username">
      <span>Heslo</span><input type="password" name="password" >
      <input type="submit" value="odeslat">
   </form>
   <?php
}
?>
Tomáš123
Profil
SirDoxik:
Ani nevím jak to popsat
Tak to máš zlé. Práve som čítal Jokerov článok o nesprávne položených otázkach... Schválne skús uhádnuť, kam spadáš ty... Alebo popíš, čo sa stalo alebo nestalo, poprípade akú chybu to vypísalo.

Alebo ešte lepšie riešenie, pozri sa na predošlú verziu skriptu, porovnaj zmeny a vlož sem tie riadky, ktoré si pozmenil (no predtým skontroluj či si neurobil banálnu chybu ako vynechaná bodkočiarky a pod.).
SirDoxik
Profil
Ahoj tak původní script je ZDE a já vlastně akorát potřebuju přidat ještě jednu položku a to Nick.
Fisir
Profil
Reaguji na SirDoxika:
Já v tom žádnou chybu nevidím, ty jo? Jakou?
Kubo2
Profil
anonymníí:
Já to našel během asi 10 vteřin
Ale tebe stačilo si prečítať chybovú hlášku, on ju sem zjavne bez ďalšieho skúmania bezhlavo skopíroval. :-)

SirDoxik:
Ani nevím jak to popsat :/
Tak sa o to aspoň pokús. Vypíše ti nejakú chybu? Ak skript nefunguje správne, čo konkrétne nefunguje? Ako by mal pracovať ten skript, keby fungoval správne? resp. čo od neho očakávaš? (stručne, konkrétne a jasne, obecné reči o tom, že to má zaregistrovať užívateľa, si nechaj.)
SirDoxik
Profil
Ahoj, tohle vše již mám vyřešené a teď přišel na řadu ItemShop. Jak by jste udělali databázi souborů ? Nechci používat mysql. Představoval jsem si všechny blocky, data, ceny atd dát do jednoho souboru a ten pak includovat do souboru obchod.php. Šlo by to nějak ?
lionel messi
Profil
SirDoxik:
Jak by jste udělali databázi souborů ?
Prostredníctvom MySQL. Príde mi to jednoduchšie než ukladanie do súborov.

Představoval jsem si všechny blocky, data, ceny atd dát do jednoho souboru a ten pak includovat do souboru obchod.php. Šlo by to nějak ?
Určite, ale to, že to nejakým spôsobom ide, neznamená vždy, že je to dobrý nápad. Ani v MySQL nie je vhodné miešať všetky dáta v jednej tabuľke bez ladu a skladu.
SirDoxik
Profil
Dobrý den. V databáci mám vše uložené , ale nevím jak vypsat vsechny blocky v php aby kazdy byl v obalovem divu s tlacitkem objednat. Neporadil by mi tu někdo? Předem díky :)
lionel messi
Profil
SirDoxik:
Aká je presne štruktúra databázy?
SirDoxik
Profil
Písi z mobilu ale je to tabulka a názvem items a v ní je název blocku, cena, id a obrázek ve tvaru items/neco.png
Fisir
Profil
Reaguji na SirDoxika:
$query = $mysqli->query('SELECT * FROM items');
while($item = $query->fetch_assoc()){
    echo('<div class="item">');
    echo('<img src="'.urlencode($item['obrazek']).'">');
    echo(htmlspecialchars($item['nazev']).' za '.intval($item['cena']).' Kreditů');
    echo('<form action="koupit.php" method="post" onSubmit="return confirm(\'Opravdu si chcete koupit '.addslashes($item['nazev']).' za '.intval($item['cena']).' Kreditů?\')"><input type="hidden" name="block" value="'.intval($item['id']).'"><input type="submit" value="Koupit"></form>');
    echo('</div>');
}
Tak nějak?
SirDoxik
Profil
Moc děkuju :) akorát mi to vyhodilo chybu Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\webshop\obchod.php on line 25 :/
Fisir
Profil
Reaguji na SirDoxika:
OMG. Napsal jsem ti tu kostru a ty to bez rozmyslu zkopíruješ a čekáš, že to bude fungovat. Nečetl jsem tohle vlákno celé, reagoval jsem jen na tvou poslední otázku, takže jsem nevěděl, jak máš získávání dat řešené. Ale přepsat je to naprosto triviální.
$query = mysql_query('SELECT * FROM items');
while($item = mysql_fetch_assoc($query)){
SirDoxik
Profil
Aha tak srry.. pro mě to zas tak triviální neni ale pokusim se :)
Kubo2
Profil
SirDoxik:
pro mě to zas tak triviální neni ale pokusim se :)
Keď už to nie je triviálne pre teba, tak si o tom môžeš aspoň niečo prečítať (a zistiť, že je to naozaj triviálne).

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: