Autor Zpráva
fuckin
Profil
Mam zajimavy problem.


echo $obsah[$i+1]; // tento zapis funguje
echo '$obsah[$i+1]'; // tento zapis taky funguje
echo "$obsah[$i+1]"; // ale tento zapis nefunguje, muze me to nekdo vysvetlit ?


no ale to neni ten hlavni problem, problem je tady, nefunfuje me toto

	$dotaz = mysql_query("INSERT INTO jidla (nazev,bilkoviny,sacharidy,tuky,energie) VALUES ('$obsah[$i]','$obsah[$i+1]','$obsah[$i+2]','$obsah[$i+3]','$obsah[$i+4]')") or die("mysql_error()"); //problem je u pricitani tech indexu u pole, bez toho to jde OK 


Zkousel sem mnoho moznosti, i bez uvozovek ale porad nic.

Mysql_error()
Parse error: syntax error, unexpected T_VARIABLE in */xxx.php on line 15
tcladin
Profil
fuckin
Ahoj.
všimni si barev skriptu v jednotl. řádcích. už to ti napovídá, špatnou skladbu.
asi nesmis pouzit promenou-pole v dvojitych uvozovkach. já to beru jako fakt. Ale možná to jde.

tenhle probl. znám :
("INSERT INTO jidla (nazev,bilkoviny,sacharidy,tuky,energie) VALUES ('$obsah[$i]','$obsah[$i+1]','$obsah[$i+2]','$obsah[$i+3]','$obsah[$i+4]')") or die("mysql_error()"); //problem je u pricitani tech indexu u pole, bez toho to jde OK


a řeším to takto(neznám jak pouzit pole v sql dotazu, zna nekdo?...):

for ($i = 1; $i <= n; $i++) {
'$obsah=$obsah[$i];
$obsah1=$obsah[$i+1];
$obsah2=$obsah[$i+2];
$obsah3=$obsah[$i+3];
$obsah4=$obsah[$i+4];

"INSERT INTO jidla (nazev,bilkoviny,sacharidy,tuky,energie) VALUES ('$obsah','$obsah1','$obsah2','$obsah3','$obsah4')") or die("mysql_error()"); //problem je u pricitani tech indexu u pole, bez toho to jde OK

} 

tcladin
Profil
fuckin
Ahoj.
všimni si barev skriptu v jednotl. řádcích. už to ti napovídá, špatnou skladbu.
asi nesmis pouzit promenou-pole v dvojitych uvozovkach. já to beru jako fakt. Ale možná to jde.

tenhle probl. znám :
("INSERT INTO jidla (nazev,bilkoviny,sacharidy,tuky,energie) VALUES ('$obsah[$i]','$obsah[$i+1]','$obsah[$i+2]','$obsah[$i+3]','$obsah[$i+4]')") or die("mysql_error()"); //problem je u pricitani tech indexu u pole, bez toho to jde OK


a řeším to takto(neznám jak pouzit pole v sql dotazu, zna nekdo?...):

for ($i = 1; $i <= n; $i++) {
'$obsah=$obsah[$i];
$obsah1=$obsah[$i+1];
$obsah2=$obsah[$i+2];
$obsah3=$obsah[$i+3];
$obsah4=$obsah[$i+4];

"INSERT INTO jidla (nazev,bilkoviny,sacharidy,tuky,energie) VALUES ('$obsah','$obsah1','$obsah2','$obsah3','$obsah4')") or die("mysql_error()"); //problem je u pricitani tech indexu u pole, bez toho to jde OK

} 

fuckin
Profil
asi? Tak takova odpoved me nestaci, chci vedet duvod proc jen v php toto nefunguje. Je jasne ze tim resenim to jde ale ja chci vedet proste proc :). Nejde me az tak o to jak to udelat ptze uz sem to vyresil predtim nez si napsal, ale o ten duvod proc ve fci to nelze.
tiso
Profil
Vy ste sa našli, chlapci...

fuckin - http://us3.php.net/manual/en/language.types.string.php#language.types.string.parsing.simple
TomášK
Profil
Znáš nějaký jazyk, kde to funguje? PHP parser na uvedeném místě patrně neumožňuje použít výraz, ale jen
proměnou nebo konstantu. Předpokládám, že motivace je časová náročnost ověřování, jestli se za '['
nachází skutečně nějaký výraz nebo jen pokračování řetězce.
Pokud tam chceš výraz, pak nejlépe poslouží {}
echo "{$array[$i+1]}"
echo "${array[$i+1]}"

Oba výše uvedené přístupy jak dostat pole do řetězce se mi zdají odstrašující - sám bych to řešil
asi takto:
function encapsulate($s) {
    return "'$s'";
}
"INSERT ... ". implode(array_map(encapsulate, $obsah), ', ') . "..."
fuckin
Profil
Vy ste sa našli, chlapci...
To si muzes odpustit.

Jinak dik,zitra vyzkousim.

TomasK
To prvni reseni vypada mnohem lepe, to druhe sem nepochopil.

Jinak toto funguje u pascalu,delphi apod.
tiso
Profil
TomášK
function encapsulate($s) {
return "'$s'";
}
"INSERT ... ". implode(array_map(encapsulate, $obsah), ', ') . "..."


To čo má byť?
Kajman_
Profil *
To čo má byť?
Přístup programátora.
tiso
Profil
Kajman_ - narážal som na chýbajúce apostrofy/úvodzovky na poslednom riadku, ale ono to funguje, generuje to iba notice....
TomášK
Profil
_Kajman to myslím vystihl přesně.
Mně se zdá nešikovné, když musím vypisovat každý index zvlášť. Když pak chci rozšířit ten dotaz o sloupeček, musím ho explicitně dopsat i do dotazu. Když to pole bude velké, zabere to spoustu místa. Navíc podobný problém budu řešit mnohokrát.

Pokud se vám zdá array_map a implode málo čitelné, pak bych to celé ještě zabalil to funkce např. array_to_sql_columns($array).
Jak to funguje? array_map zavolá funkci na každý prvek pole, zde encapsulate (možná už je na to nějaká jiná vestavěná, ale já ji neznám), která každý prvek pole uzavře do uvozovek. Implode pak vezme pole, a slepí je do řetězce oddělené čárkami.

fuckin
Mohl bys poslat ukázkový kód toho pascalu/delphi? Nevybavuju si, že bych tam na něco podobného narazil a writeln("$i") dle očekávání nefunguje.

tiso
Vytrhl jsem kus kódu z kontextu - zřejmě jsem to měl zdůraznit. Samozřejmě to chce ještě obalit do mysql_query a toho kódu, co má fuckin okolo.
fuckin
Profil
writeln("$i")
Co to ma byt? Toto s tim prece nema nic spolecneho ne? Bavime se o indexu u pole kde muzes delat co chces bez nejake zmeny syntaxe jak u php(slozene zavorky).
Vis vubec cos to napsal za kravinu? Videls nekdy dvojite uvozovky a $ jako oznaceni promenne v pascalu? To ses teda predvedl.

Jestlize treba mame toto pole
type pole = array [1..50] of integer;


Pak zapis funguje, ptze to bere jakeloli mat.operace.
aktivovanafce(nazev[i*i/2]
TomášK
Profil
fuckin
Aha, už rozumím. writeln("$i") jsem psal proto, že náš problém je spojený s vyhodnocením proměnné uvnitř řetězce (což ani pascal ani delphi neumí).
I v php můžeš napsat
echo $array[$i+fce()];
. Problém nastává jen pokud se to ocitne uvnitř řetězce:
echo "$array[$i+fce()]" // tohle neprojde
tiso
Profil
fuckin [#12] - pre zmenu si sa predviedol ty...
Nemôžeš porovnať:
aktivovanafce(nazev[i*i/2]
//funkcia(parameter_pole[vypocitany_prvok_pola])
a:
$dotaz = mysql_query("INSERT INTO jidla (...) VALUES ('$obsah[$i]','$obsah[$i+1]',...)");//funkcia(parameter_string_obsahujuci: pole[vypocitany_prvok_pola])

Porovnávaj porovnateľné.
tcladin
Profil
tiso
Vy ste sa našli, chlapci...
já sem na holky, žádný chlapce nehledám
díky za link, teď abych přepsal skript, hehe. No vono to nebude poprvé ani naposled. Hold těžké začátky samouka amatéra

TomášK
jde tedy říct, že {} přeloží php jako - nejprve zjisti aktuální hodnotu uvnitř závorek?
fuckin
Profil
TomášK
Jo diky, uz me to doslo. IMHO ono snad jen php umoznuje vyhodnotit promennou i v retezci,takze JEN tady je tento problem.
TomášK
Profil
tcladin
ano. Příklady najdeš v odkazu, který dával tiso - [#5]

fuckin
umí to i perl, ruby a určitě i další.
Toto téma je uzamčeno. Odpověď nelze zaslat.