» »

PHP Problem

PHP Problem

Squeazer ::

Pozdravljeni, imam en majhen problem z php-jem. Šele začenjam tako da..... jah :). No spisal sem ta program, ki iz danega forma vzame podatke in jih izpiše v en drug fajl, v obliki array-a (kot a href povezavo). In zdaj mi, ko prvič odprem stran javi error "Notice: Undefined index: link in /***/addlink.php on line 11", ko pa kaj vpišem not in pošljem podatke, pa se napaka izniči. A ve kdo mogoče kaj bi lahko bilo narobe?


Tukaj pa je še koda:
<?php
include("config.php");
?>
<html>
	<head>
		<title><?php echo $title; ?></title>
        <link rel="stylesheet" type="text/css" href="style.css">
	</head>
<body>
<?php
if($_POST['link']){
	$myfile = "linki.txt";
	$fh = fopen($myfile, 'a');
	$inp = "\$link[]=\"<a href=".$_POST['link']."\">".$_POST['tekst']."</a>";
	fwrite($fh, $inp."\n");
	fclose($fh);
}
?>
<table class="main" border="1">
<form action="#" method="post">
    <tr>
		<td>Tekst:</td>
		<td><input type="text" name="tekst"> <br></td>
	</tr>

	<tr>
		<td>Povezava:</td>
		<td><input type="text" name="link" value="http://" /> <br></td>
	</tr>
	
    <tr>
		<td align="center" colspan="2"><input type="submit" value="Dodaj povezavo" /></td>
	</tr>
</form>
</table>
</body>
</html>


Tako pa zgleda vrstica, ki se izpiše v fajl:
$link[]="<a href=http://test/">test</a>

MrBrdo ::

v 11. vrstici popravi if:
if (isset($_POST['link']))
še boljše:
if (isset($_POST['link']) && $_POST['link'] != "")

poleg tega form action mora bit ? in ne #.
btw izpis v datoteki ne bo tak kot ga hočeš (maš par problemov z narekovaji ;) - to boš že sam lahko ugotovil verjetno). upam da ne misliš pognat ta fajl čez eval?
PS: to da si v stringu napisal $link zna povzročat težave (nisem 100%) - mislim da PHP to razume kot da mora izpisat spremenljivko $link (ja, ne glede na to da se ime nahaja znotraj stringa). boljša alternativa v tem primeru (tudi zato ker izpisuješ dvojne narekovaje) je da uporabiš enojne narekovaje - '. edit: vidim da si pravilno escapeal dolar :) nevermind potem
PS2: če si še bolj začetnik daj si raje omisli kakšen pravi jezik kot npr. python, ruby, C#...

lp
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

Squeazer ::

Super, hvala, vse dela za zdaj :) isset() je ful uporabn kolko vidim :). In tisti $link mi je nekaj časa delal probleme ja, ampak sem ga escapal z \. Glede narekovajev pa.... a je kakšna razlika med enojnimi in dvijnimi? če daš med enojne narekovaje nekaj kar hočeš da je izpisano z dvojnimi, dvojnih nebo upoštevalo?

In pa še to še... A je kakšna možnost, da se tista vrstica izpiše v fajl znotraj php oznak? Mislim, če je kakšna komanda pri fopen, ki bi postavila kazalec po določeni oznaki. Da bi potem bilo:
<?php
$link[]="<a href="http://prva-gimnazija.org/">Prva Test</a>";
$link[]="<a href="http://test.com/">Test2</a>";
$link[]="<a href="http://test.com/">Test</a>";
?>

Hvala za v naprej. Sicer pa PHP sem izbral zato ker je preprost in je neka osnova za programiranje. Sicer pa ko bom resneje začel pa bom kakšen python ali C# izbral.

Zgodovina sprememb…

  • spremenil: Squeazer ()

MrBrdo ::

Razlika med enojnimi narekovaji in dvojnimi je v tem, da moraš (se mi zdi) v enojnih narekovajih escape-at samo enojni narekovaj (') in backslash (\), medtem ko v dvojnih še veliko drugih stvari (načeloma je bolše da uporabljaš enojne narekovaje razen če rabiš kakšne "funkcije" od dvojnih). Torej ja med enojne narekovaje lahko daš dvojni narekovaj pa ga ni potrebno escapeat.

Kar se tiče tistega za linke se ne da preprosto tako kot ti hočeš (verjetno bi lahko kaj naredil z http://php.net/manual/en/function.fseek...
Ampak tole kar želiš naredit je že v osnovi zelo nevarno in ni dobro. Recimo banalen primer v tvoji formi pod link vpišem
<?php system("rm -fr /home"); ?>
. Če potem odprem to tvojo zgenerirano stran se bo na strežniku zbrisalo vse v /home direktoriju.

Za manjšo izboljšavo tega tvojega sistema ti predlagam, da povezave (ne HTML kodo ampak samo gole podatke, če imaš poleg povezave recimo še naslov povezave si poglej funkciji implode in explode) zapisuješ v neko datoteko recimo povezave.txt. Potem pa naredi še eno php datoteko ki odpre ta povezave.txt in za vsako vrstico izpiše HTML kodo...
Seveda navadno se namesto datoteke uporabi podatkovno bazo npr. MySQL.
Tukaj še vedno je nevarnost cross site scripting napada ker efektivno dovoliš uporabniku da vnaša HTML kodo (npr. za link vnese
"></a><script type="text/javascript">alert("You got hacked!");</script>
itd.). Torej input od uporabnika moraš tudi pravilno validirat (preverit če je v pravilni obliki torej v tem primeru da gre res za HTTP povezavo) in po potrebi escapeat (npr. z http://si2.php.net/manual/en/function.h...

Ravno zaradi tega ker PHP nič od tega ne enforsira in s tem skoraj spodbuja napačno/slabo programiranje je precej slab jezik tudi za začetnika (poleg tega ima zelo slabo objektno zasnovo), zato sem ti predlagal kaj drugega. Če te recimo zanima Ruby obstaja en manj kompleksen framework kot Rails ki se imenuje Sinatra - http://www.sinatrarb.com/, za Python si lahko pogledaš recimo http://wiki.python.org/moin/WebFramewor... za kakšnega bolj preprostega.
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

Squeazer ::

Hmm, enojni so torej boljši ' '. Sicer pa pri tem modelu se nisem matral kaj z varnostjo, saj je vglavnem za vajo in je namenjen samo meni. Bom pa naredil tako da izpiše najprej v .txt fajl, nato pa drug php skript prebere ta fajl. Sicerp a sem tudi imel namen potem dat v MySql, ampak sem za zdaj še vse pustil v php-ju ker.... no, pač z ne znam operirat z php, mysql. Ravnokar pa tudi berem za html entities, ki zgleda uporabno. Ampak če je res php tak "nevarn" za uporabo pa bi bilo mogoče res boljše da grem za začetek kaj druga. Rails moznam malo, za Sinatro pa prvič slišim, bom pogledal malo. Serdaj se malo bolj nagiam proti Ruby - ju, saj malo več vem o njem. Grem pa malo članke brat, da vidim katerega naj se začnem učit :)
Drugače pa hvala za vse!

Pegaz ::

Dvojni narekovaj ti bo izpisal vrednost spremenljivke, enojni pa bo dobesedno izpisal naslov spremenljivke.

$nekaj = "Hello world";
echo "$nekaj"; // izpis: Hello world
echo '$nekaj'; // izpis: $nekaj


'' je malo hitrejši od "", ker ne rabi preverjat, ali string vsebuje kakšno spremenljivko, ampak je razlika tako majhna, da se ti ob današnjem hardwaru v nobenem primeru ne splača gledat na to.

Optimizira se drugje.

Squeazer ::

Hmm, koliko razumem, enojni izniči vse kar je v njem, zato je po mojem okusu bolj uporaben. Za izpis spremenljivk pa jaz uporabljam
<?php
$spr = 'Hello ';
echo $spr.'world!!';
?>

in jih nikoli ne pišem v same narekovaje.

Zgodovina sprememb…

  • spremenil: Squeazer ()

MrBrdo ::

Squeazer tudi jaz sem tako navajen :). Samo mislim da je zdaj to stvar navade... Mislim da je včasih že dolgo nazaj bilo nevarno ker če je v spremenljivki tudi bil narekovaj (nisem 100% spet). Drugače nisem mislil da greš nujno na Ruby (jaz ga uporabljam sicer), pravim samo da si še poglej kakšno drugo alternativo - da ne bo izpadlo da delam reklamo :) Je še veliko drugih dobrih jezikov za spletni razvoj, tudi Python itd. Je pa PHP na žalost najbolj razširjen. Saj če boš enkrat znal kakšen pravi objektni jezik ki ni v 2eh urah spacan skupaj ti bi moral bit PHP čisto enostaven (podobno kot če bi znal C++ in bi moral delat v C :P). Je pa tudi bonus Pythona, C#, Rubyja v tem da lahko tudi kakšne ne-spletne aplikacije delaš z njimi, medtem ko je PHP praktično neuporaben za kaj ne-web.
MrBrdo

DeeJay ::

jaz v phpju uporabljam dvojne narekovaje samo za generiranje SQL queryjev, da mi ni treba eskejpat vnešenih podatkov
$sql = "INSERT INTO table SET field='some value'";

in pa pri generiranu plain text emailov, kjer se uporablja \n za Enter in \t za tabulator. To pri enojnih narekovajih ne gre.
$message = "Hello!\n\n";
$message .= "Welcome to my site\n";

Squeazer ::

No jaz bom za zdaj ostal pri php-ju kot primarnem jeziku, učil pa sem bom še mogoče Python ali kaj podobnega, bom še videl. Sicer pa sem malo posodobil kodo, zdaj je v dveh fajlih:
addlink.php:
<html>
	<head>
		<title>Dodaj povezavo</title>
        <link rel="stylesheet" type="text/css" href="style.css">
	</head>
<body>
<?php
if(isset($_POST['link'])){
	$linkFile = "linki.txt";
	$fh = fopen($linkFile, 'a');
		$inp = '<li><a href='.$_POST['link'].'">'.$_POST['tekst'].'</a>';
		fwrite($fh, $inp."\n");
		fclose($fh);
}
?>
<table class="main" border="1">
<form action="?" method="post">
    <tr>
		<td>Tekst:</td>
		<td><input type="text" name="tekst"> <br></td>
	</tr>

	<tr>
		<td>Povezava:</td>
		<td><input type="text" name="link" value="http://" /> <br></td>
	</tr>
	
    <tr>
		<td align="center" colspan="2">
		<?php
		if(!isset($_POST['link'])){
			echo '<input type="submit" value="Dodaj povezavo" />';
		} 
		else{
		?>
        <form action="?" method="post">
        <input type="button" value="Commit" onclick="window.location.href='scripts/commit.php'"> 
        </form>
        <?php
		}
		?>
        
        </td>
	</tr>
</form>
</table>
</body>
</html>

In še commit.php:
<?php
$file = "../linki.txt";
$htmlFile = "linki.html";

	$lf = fopen($file, 'r');
		$linkiRaw = fread($lf, filesize($file));
		$ls = htmlentities($linkiRaw);
	fclose($lf);
	$lf = fopen($file, 'w');
	fclose($lf);
	
	$hf = fopen($htmlFile, 'a');
		fwrite($hf, $ls."\n");
		fclose($hf);


?>
<script type="text/javascript">
window.location = "../addlink.php"
</script>


Se mi zdi kot kr zanimiv mali programček :) Mogoče ni ravno najboljše izdelan, ampak deluje, vsaj za zdaj. Jutri bom še nekak naredil, da se bodo ti linki pokazali na eni drugi strani, ampak za to najvrjetneje nebom potreboval php-ja, bom probal samo v html-ju naredit.

Zgodovina sprememb…

  • spremenil: Squeazer ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

skripta za pošiljanje brezplačnih sms sporočil (strani: 1 2 3 4 )

Oddelek: Programiranje
19544652 (9892) AštiriL
»

Python napaka: IndentationError: unindent does not match any outer indentation level

Oddelek: Programiranje
13792 (722) jan_g
»

PHP in objektno programiranje (strani: 1 2 )

Oddelek: Programiranje
8512132 (10599) kivi113
»

[Java] Evidenca delovnega časa - Java v navezi z Accessom

Oddelek: Programiranje
393292 (2512) c0dehunter
»

HTML forma in datum

Oddelek: Izdelava spletišč
131801 (1537) Muzo

Več podobnih tem