Autor Zpráva
Jakub.007
Profil *
Prosím, poradíte mi někdo kde mám chybu?

Nejsem si úplně jistý jak správně zapsat uvozovky nebo apostrofy, když tu potřebuji tři úrovně, zoušel jsem několik variant, ale pořád nic.

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in /3w/domenadruhyrad.cz/p/domenatretirad/slozka/soubor.php on line 35

číslo řádku jsem upravil, aby souhlasilo s kódem tady

MySQL_Query("INSERT INTO log (
  
prijmeni,
login,
ip,
 
REMOTE_ADDR,
REMOTE_HOST,
REMOTE_NAME,
HTTP_FROM,
HTTP_CLIENT_IP,
HTTP_COMING_FROM,
HTTP_X_COMING_FROM,

HTTP_VIA,
HTTP_PROXY,
HTTP_XPROXY,
HTTP_PROXY_CONNECTION,

HTTP_X_FORWARDED_FOR,
X_HTTP_FORWARDED_FOR,
HTTP_FORWARDED,
X_FORWARDED_FOR,
ORIGINAL_REMOTE_ADDR,

HTTP_ACCEPT_LANGUAGE,
HTTP_USER_AGENT
) 
VALUES
(
\'$abeceda\',
\'$cas\',
\'$ip\',

\'$_SERVER[\'REMOTE_ADDR\']\', 
\'$_SERVER[\'REMOTE_HOST\']\',
\'$_SERVER[\'REMOTE_NAME\']\',
\'$_SERVER[\'HTTP_FROM\']\',
\'$_SERVER[\'HTTP_CLIENT_IP\']\',
\'$_SERVER[\'HTTP_COMING_FROM\']\',
\'$_SERVER[\'HTTP_X_COMING_FROM\']\',

\'$_SERVER[\'HTTP_VIA\']\',
\'$_SERVER[\'HTTP_PROXY\']\',
\'$_SERVER[\'HTTP_XPROXY\']\',
\'$_SERVER[\'HTTP_PROXY_CONNECTION\']\',

\'$_SERVER[\'HTTP_X_FORWARDED_FOR\']\',
\'$_SERVER[\'X_HTTP_FORWARDED_FOR\']\',
\'$_SERVER[\'HTTP_FORWARDED\']\',
\'$_SERVER[\'X_FORWARDED_FOR\']\',
\'$_SERVER[\'ORIGINAL_REMOTE_ADDR\']\',

\'$_SERVER[\'HTTP_ACCEPT_LANGUAGE\']\',
\'$_SERVER[\'HTTP_USER_AGENT\'])");
Alphard
Profil
mysql_query("'$abeceda', '{$_SERVER['REMOTE_ADDR']}', '{$_SERVER['REMOTE_ADDR']}'");
tiso
Profil
Alphard: ???
Jakub.007:
1.
mysql_query("INSERT INTO ... VALUES ('$abeceda', '$_SERVER[REMOTE_ADDR]', '$_SERVER[REMOTE_ADDR]', ...");

2. ideš na to zle, niektoré z týchto premenných nemusia vôbec existovať.
Alphard
Profil
tiso:
Alphard: ???
Co se ti nezdá? Dal jsem do dotazu jen ukázku proměnných, se kterými je problém, omáčku jako insert into není třeba kopírovat.
A použití {} je možné. Viz manuál:
// Works, but note that this works differently outside a string
echo "A banana is $fruits[banana].";

// Works
echo "A banana is {$fruits['banana']}.";
Jakub_007
Profil *
Připadám si opravdu hloupě, jelikož se mi zdá, že jsem sám vytvořil chybu někde, kde předtím nebyla...
Díky za tak rychlé reakce a za odpovědi.
Mám ještě jednu otázku, když nějaká z těch hodnost je prázdná nebo neexistuje, proč se neprovede ten dotaz, respektive, proč se záznam nevloží do tabulky?

tiso: tvoje odpověď přesně sedí k tomuhle kódu, kdežto Alphard použil obecnější řešení, které pomůže, když by závorky byly nevyhnutelné. (což není konkrétně tenhle případ) ale odpovídá to na druhou část mého původního dotazu.

tiso: //EDIT až teraz som pochopil ako myslíš bod 2, jenom ma varuješ pred problémom, na ktorý som práve narazil ..
Jakub_007
Profil *
no, jako obvykle, podařilo se mi udělat banální chybičku, v tom množství sloupců v databázi jsem přehlédl, že mi jeden chybí...
tedy problém je vyřešen (vlastně oba problémy), díky za váš čas
tiso
Profil
[#4] Alphard: nezdá sa mi použitie {}, v tomto prípade je zbytočné.
[#5] Jakub_007:
- v tomto konkrétnom prípade tú tretiu úroveň nepotrebuješ
- keby si potreboval, tak okrem {} syntaxe prichádza do úvahy escapovanie, alebo spájanie reťazcov. Treba rozpísať?
k svojmu predchádzajúcemu príspevku dopĺňam bod:
3. treba myslieť na bezpečnosť, serverové hlavičky sú ďalším užívateľským vstupom a možno ich podvrhnúť, takže treba ošetriť ich uloženie do DB, i výpis.
AM_
Profil
tiso:
nezdá sa mi použitie {}, v tomto prípade je zbytočné.
to je spíš otázka vkusu, já zastávám názor, že kdekoliv je v řetězci použita inline proměnná ve složitějším tvaru než $nazev_promenne, nacpu tam {}, nic se tím nezkazí a nemusím si pamatovat, kdy přesně už je to potřeba a kdy ne. Navíc mi to přijde i přehlednější to psát takto.
Jakub_007
Profil *
Nakonec jsem kód přepsal do této podoby, funguje, taže já jsem spokojený ;-)
Omlouvám se že mi to trvalo tak dlouho, byl jsem vyrušen rodinými povinnostmi.

[#8] to AM_: souhlasím s tebou

[#7] to tiso: to je dosť dobrá pripomienka, myslíš, že to čo som urobil splní svoju funkciu? (myslím že bude stačiť ošetriť ich len pri ukladaní do databázy)


//pomocná funkce e()  
function e($promena)
  {
  if(isset($_SERVER[$promena]))
    {
    //ochrana vstupu
    return stripslashes(
      str_replace('"',"#uvozovky#",
        str_replace("/","#lomítko#",
          str_replace(";","#středník#",
            strip_tags($_SERVER[$promena])))));
    }
  else
    {
    return "prázdné";
    }
  }  

MySQL_Query("INSERT INTO log (
  
prijmeni,
login,
ip,
 
REMOTE_ADDR,
REMOTE_HOST,
REMOTE_NAME,
HTTP_FROM,
HTTP_CLIENT_IP,
HTTP_COMING_FROM,
HTTP_X_COMING_FROM,

HTTP_VIA,
HTTP_PROXY,
HTTP_XPROXY,
HTTP_PROXY_CONNECTION,

HTTP_X_FORWARDED_FOR,
X_HTTP_FORWARDED_FOR,
HTTP_FORWARDED,
X_FORWARDED_FOR,
ORIGINAL_REMOTE_ADDR,

HTTP_ACCEPT_LANGUAGE,
HTTP_USER_AGENT
) 
VALUES
(
'$abeceda',
'$cas',
'$ip',

'".e('REMOTE_ADDR')."', 
'".e('REMOTE_HOST')."',
'".e('REMOTE_NAME')."',
'".e('HTTP_FROM')."',
'".e('HTTP_CLIENT_IP')."',
'".e('HTTP_COMING_FROM')."',
'".e('HTTP_X_COMING_FROM')."',

'".e('HTTP_VIA')."',
'".e('HTTP_PROXY')."',
'".e('HTTP_XPROXY')."',
'".e('HTTP_PROXY_CONNECTION')."',

'".e('HTTP_X_FORWARDED_FOR')."',
'".e('X_HTTP_FORWARDED_FOR')."',
'".e('HTTP_FORWARDED')."',
'".e('X_FORWARDED_FOR')."',
'".e('ORIGINAL_REMOTE_ADDR')."',

'".e('HTTP_ACCEPT_LANGUAGE')."',
'".e('HTTP_USER_AGENT')."'
)
");
Alphard
Profil
[#9] Jakub_007
Tak koukám na tu vaši zabezpečovací funkci a říkám si, proč nepoužijete mysql_real_escape_string().

tiso:
nezdá sa mi použitie {}, v tomto prípade je zbytočné
Souhlasím s AM. Napsat závorku a apostrof pro mě není takový problém, abych počítal, kolik znaků mohu ušetřit. Subjektivně se mi nelíbí tvá verze.
Jakub_007
Profil *
Ještě jedna maličkost mi tu zbyla, možná to naprvní pohled úplně nesouvisí, ale pořád se to týká globálního pole $_SERVER.

$data = implode(",", $_SERVER);


Sice funguje, leč zobrazuje poznámku (úmyslně zapnuto) a mě by zajímalo, zda to lze napsat ještě "správněji", tak aby proti tomu PHP nic nenamítalo a nebo jestli to nelze. Je to podle příkladu z Manuálu, ale přesto to zobrazí tuhle poznámku.

Notice: Array to string conversion in /3w/unas.cz/p/domena/slozka/soubor.php on line 155
Jakub_007
Profil *
[#10] Alphard: Protože jsem jí neznal, její použití se jeví jako velmi výhodné v tomto případě, děkuji Vám za radu.
tiso
Profil
[#8] AM_, [#10] Alphard: ja vám to neberiem... Ako som písal, riešenia pre tretí level sú v podstate 3 ({}, escapovanie, spájanie reťazcov), ja som situáciu zjednodušil na 2 levely, pretože tretí nebol nutný. To je celé.

[#11] Jakub_007: nemáš premennú $data náhodou použitú vyššie v kóde ako premennú typu pole?
Okrem toho nemáš náhodou problém s tým, že použitím implode stratíš informáciu o tom, o aké premenné sa v pôvodnom poli jedná?
Jakub_007
Profil *
[#13] tiso Ne, proměná $data není použita na jiném místě v kódu.
Pravda, to mě nenapadlo, asi neexistuje žádná funkce, který by mi jednoduše vytvořila jednorozměrové pole? Hledal jsem, ale nenašel.
Jakub_007
Profil *
Takhle jsem to vyřešil, obecné řešení jsem opsal a upravil pro sebe.

$data = "";
  reset($_SERVER);
  while( list($index, $hodnota) = each($_SERVER) )
    {
    if(isset($index) and isset($hodnota))
      {
       $data = $data.$index." = ".$hodnota." || ";
      } 
    }
tiso
Profil
Jakub_007: http://php.net/manual/en/function.serialize.php
Jakub_007
Profil *
Musím říct, že dnes (ehm, včera...) jsem se toho dost naučil, díky vám. Tak díky za pomoc

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: