PHP-ongelmat

Muu yhteisön välinen keskustelu.
MAVellius

Re: PHP-ongelmat

Post by MAVellius »

Minulla on tälläinen koodi, jonka pitäisi siis kirjoittaa muuttujat "nimi" ja "viesti" tiedostoon vieraskirjaa varten. Onhelmana on että koodi siis tallentaa vain uusimman viestin eikä muuta. Olen kokeillut muita fopen-moodeja, mutta ne eivät jostain syystä tallenna koko viestiä.
Muun koodin pitäisi olla oikein.

Code: Select all

if ((isset($_GET["nimi"]) && isset($_GET["viesti"])) && ($_GET["nimi"] != "" && $_GET["viesti"] != "")) {
    $nimi = $_GET["nimi"];
    $viesti = $_GET["viesti"];
    $tiedosto="testi.txt";
     $kahva = fopen("testi.txt","w+");
     $sisalto = fread($kahva,filesize($tiedosto)); //vika voisi olla tässä
       
      $sanat = "$nimi hölisi:\n $viesti \n<hr>\n";
      $sanat .= $sisalto;  //Tämä ei ilmeisesti toimi
     fwrite($kahva, $sanat); 
     fclose($kahva);
     
     }
Näkyykö tuossa jotain vikaa?
Käytössä on siis PHP5, mutta kaikki lukmani oppaat käsittelevät nelosta, joten tässäkin voi olla ongelma.
User avatar
TheDuck
Devoted Member
Posts: 632
Joined: Sun Aug 26, 2007 3:51 pm
Location: C:\Program Files\Tuusula\

Re: PHP-ongelmat

Post by TheDuck »

MAVellius wrote:Minulla on tälläinen koodi, jonka pitäisi siis kirjoittaa muuttujat "nimi" ja "viesti" tiedostoon vieraskirjaa varten. Onhelmana on että koodi siis tallentaa vain uusimman viestin eikä muuta. Olen kokeillut muita fopen-moodeja, mutta ne eivät jostain syystä tallenna koko viestiä.
Muun koodin pitäisi olla oikein.

Code: Select all

if ((isset($_GET["nimi"]) && isset($_GET["viesti"])) && ($_GET["nimi"] != "" && $_GET["viesti"] != "")) {
    $nimi = $_GET["nimi"];
    $viesti = $_GET["viesti"];
    $tiedosto="testi.txt";
     $kahva = fopen("testi.txt","w+");
     $sisalto = fread($kahva,filesize($tiedosto)); //vika voisi olla tässä
       
      $sanat = "$nimi hölisi:\n $viesti \n<hr>\n";
      $sanat .= $sisalto;  //Tämä ei ilmeisesti toimi
     fwrite($kahva, $sanat); 
     fclose($kahva);
     
     }
Näkyykö tuossa jotain vikaa?
Käytössä on siis PHP5, mutta kaikki lukmani oppaat käsittelevät nelosta, joten tässäkin voi olla ongelma.
Kokeileppa käyttää tossa fopenissa a-kirjainta w+:n sijaan. Sen pitäisi toimia. Ja poista tuol $sisältö muuttuja ja sen lisäys. Senkun kirjoitat vaan uuden viestin tiedoston perään ja sitten jos lukiessa tahdot uudet viestit ylös, senkun flippaat taulukon johon olet viestit hakenut.
^^
User avatar
Jare
Devoted Member
Posts: 877
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: PHP-ongelmat

Post by Jare »

TheDuck wrote: Kokeileppa käyttää tossa fopenissa a-kirjainta w+:n sijaan. Sen pitäisi toimia. Ja poista tuol $sisältö muuttuja ja sen lisäys. Senkun kirjoitat vaan uuden viestin tiedoston perään ja sitten jos lukiessa tahdot uudet viestit ylös, senkun flippaat taulukon johon olet viestit hakenut.
Lisään vielä tähän: "a" on siis "append", eli lisääminen tiedoston perään. "w" ja "w+" kirjoittavat suoraan päälle (mutta en muista, mitä eroa plussalla on). Jos englanti taipuu, voi ajantasaista php:n opasta lukea osoitteessa www.php.net. Tosin voi olla alkuun vähän vaikean tuntuinen manuaali laajuutensa vuoksi.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: PHP-ongelmat

Post by koodaaja »

Ainakin stdio.h:n fopenissa w+ tarkoittaa uuden tiedoston (jos se oli jo olemassa, se tuhotaan) avaamista sekä lukua että kirjoitusta varten. PHP:stä en sitten tiedä, mutta veikkaisin että samalla tavalla toimivat kun on noin samankaltaiset nimet ja parametrit.
MAVellius

Re: PHP-ongelmat

Post by MAVellius »

TheDuck wrote:...ja sitten jos lukiessa tahdot uudet viestit ylös, senkun flippaat taulukon johon olet viestit hakenut.
Tarkoitatko tuolla siis array_flip():ä (mikä siis käsittääkseni vaihtaa avainten ja arvojen paikat) vai jotain muuta?

Olisiko olemassa joku funktio, jolla saisi suoraan taulukan "käännettyä"? Eli [0] olisi viimeinen jne...
User avatar
TheDuck
Devoted Member
Posts: 632
Joined: Sun Aug 26, 2007 3:51 pm
Location: C:\Program Files\Tuusula\

Re: PHP-ongelmat

Post by TheDuck »

MAVellius wrote:
TheDuck wrote:...ja sitten jos lukiessa tahdot uudet viestit ylös, senkun flippaat taulukon johon olet viestit hakenut.
Tarkoitatko tuolla siis array_flip():ä (mikä siis käsittääkseni vaihtaa avainten ja arvojen paikat) vai jotain muuta?

Olisiko olemassa joku funktio, jolla saisi suoraan taulukan "käännettyä"? Eli [0] olisi viimeinen jne...
http://php.net/manual/en/function.array-reverse.php

Code: Select all

$f = file("kommentit.txt");
$f = array_reverse($f);
^^
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: PHP-ongelmat

Post by SPuntte »

Tuli tässä nettisivuja sorvaillessa eteen pari kysymystä:

Onko mitään kätevää tapaa poistaa (teksti)tiedostosta yhtä riviä? Itselle ei tullut mieleen muuta kuin ihan vain manuaalisesti tyhjentää tiedostotaulukosta (joka on siis luettu file()-funktiolla) yksi solu, ja kirjoittaa taulukon ei-tyhjät solut takaisin tyhjennettyyn tiedostoon. Ei sinänsä kovin monimutkaista, mutta tulee turhaa edestakaisin lukemista ja kirjoittamista. Operoitavien tiedostojen koot tuskin ovat kummoisia, mutta suurilla tiedostoilla tuo lienee aika epätehokas tapa. Onko yleensä ah niin monipuolisessa PHP:ssa mitään suoraa funktiota tämän suorittamiseen? Ja tietysti kätevä ominaisuus olisi myös muokata yksittäistä riviä poistamisen sijasta. Mitenkähän se onnistuisi?

Toinen kysymys ei liity ihan puhtaasti PHP:hen, mutta laitan senkin tänne:
Kuinka turvallinen yhdistetty .htaccess + .htpasswd -login/suojaussysteemi on verrattuna PHP:n kekseillä tai istunnoilla toteutettuun vastineeseen? Ideana olisi luoda palvelimelle julkisista sivuista eristetty admin-kansio, jonka "hallintapaneelista" pääsee suoraan muokkaamaan sivujen sisältöä php-sivujen kautta ilman erillistä login-systeemiä. Kyseinen kansio olisi tietysti suojattu tuolla .htaccess -menetelmällä, ja pääsy tietokantatiedostoihin ja muuhun arkaluontoiseen dataan olisi sitä kautta estetty kokonaan. Siis .htaccess:in avulla siten, että niitä voi käsitellä ainoastaan palvelimen sisäisistä php-skripteistä käsin.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Pettis
The Evil Admin
The Evil Admin
Posts: 1044
Joined: Sun Aug 26, 2007 5:08 pm
Location: Rovaniemi
Contact:

Re: PHP-ongelmat

Post by Pettis »

SPuntte wrote:Toinen kysymys ei liity ihan puhtaasti PHP:hen, mutta laitan senkin tänne:
Kuinka turvallinen yhdistetty .htaccess + .htpasswd -login/suojaussysteemi on verrattuna PHP:n kekseillä tai istunnoilla toteutettuun vastineeseen?
Riippuu miten PHP:llä toteutettu kirjautuminen ja oikeuksien hallinta on toteutettu. Mielestäni PHP:llä toteutettu voi olla paljon turvallisempi.

SIinä missä .htaccess tarkistaa vain salasanan (perusautentikaatiossa) ja tunnuksen, niin PHP:llä käyttäjän tunnistamiseen ja tarkistuksiin saadaan enemmän logiikkaa.

Väärin toteutettuna istuntojen ja evästeiden hyödyntäminen on kuitenkin todella turvatonta. Pahimmillaan murtautuminen edellyttää vain evästeen arvon muuttamista. Kannattaa olla siis tarkkana.
CB Repository .com - Sinne ne kaikki koodit menneet on!
MunVerkko - Ilmaisia foorumeita ja blogeja
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: PHP-ongelmat

Post by SPuntte »

Pettis wrote:SIinä missä .htaccess tarkistaa vain salasanan (perusautentikaatiossa) ja tunnuksen, niin PHP:llä käyttäjän tunnistamiseen ja tarkistuksiin saadaan enemmän logiikkaa.
En ihan ymmärrä mitä tarkoitat ilmaisulla "enemmän logiikkaa". Tarkoitatko IP-osoitteen huomioimista? Miten käyttäjän tunnistautuminen tulisi mielestäsi PHP:llä toteuttaa?
Pettis wrote:Väärin toteutettuna istuntojen ja evästeiden hyödyntäminen on kuitenkin todella turvatonta. Pahimmillaan murtautuminen edellyttää vain evästeen arvon muuttamista. Kannattaa olla siis tarkkana.
Tiedätkö jotain hyvää nettiresurssia, josta asiaa voisi opiskella? On eri asia tietää perusteet istunnoista ja evästeistä kuin osata käyttää niitä turvallisesti.

Mieluummin hoidan asian vähemmän turvallisesti .htaccesilla ja tiedän mitä teen, kuin söhlään PHP:lla jotain, minkä toiminnasta en ole edes ihan perillä, ja joka mahdollisesti osoittautuu ihan yhdentekeväksi turvallisuuden kannalta.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Pettis
The Evil Admin
The Evil Admin
Posts: 1044
Joined: Sun Aug 26, 2007 5:08 pm
Location: Rovaniemi
Contact:

Re: PHP-ongelmat

Post by Pettis »

No jos esim. juuri IP vaihtuu, niin kyseessä tuskin on sama käyttäjä. Mutta myös user agent yms. tiedot voivat tarvittaessa olla tarkastelun kohteena.

Yleisesti noissa istunnoissa ja kirjautumisissa kannattaa vain selaimelle lähettää istunnon (ei käyttäjän) tunniste ja palvelinpäässä hoitaa kaikki muu ja pitää huoli että käyttäjä ei pääse palvelinpäässä vaikuttamaan oikeuksiinsa tms. luvatta.
CB Repository .com - Sinne ne kaikki koodit menneet on!
MunVerkko - Ilmaisia foorumeita ja blogeja
User avatar
Zero
Lead Developer
Lead Developer
Posts: 727
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

Re: PHP-ongelmat

Post by Zero »

Suosittelen lämpimästi seuraavaa sivua PHP-tietoturvasta kiinnostuneille:

http://phpsec.org/projects/guide/
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic

http://www.coolbasic.com/blog
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: PHP-ongelmat

Post by Herra Siili »

Kuinka PHP:llä voi tehdä potenssiin korotuksen?
a.k.a. Gehock
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: PHP-ongelmat

Post by SPuntte »

Herra Siili wrote:Kuinka PHP:llä voi tehdä potenssiin korotuksen?
Tietokonemaailmassa yleisesti potenssilaskun merkintänä käytetty symboli ^ on PHP:ssa varattu muuhun tarkoitukseen (Olikohan se binäärinen xor, en muista varmaksi..?), joten potenssiin korotus ei onnistu sillä. PHP:sta löytyykin tähän tarkoitukseen ihan oma funktionsa: pow($b, $e), missä b on kantaluku ja e eksponentti. Funktion nimi tulee tietenkin englannin potenssia tarkoittavasta sanasta power.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: PHP-ongelmat

Post by Herra Siili »

Löytyykös PHP:stä vastaavia funktioita CB:n ReadLinelle ja EOF:lle? (Luultavasti löytyy, mutta en vain osaa etsiä.) Yritin etsiä php.netistä, mutta tuloksetta.

Lisäksi haluaisin neuvoja tiedostojen salasanasuojauksesta. Eli minulla on tiedostoja ja haluaisin, että ne voitaisiin ladata vain onnistuneen kirjautumisen jälkeen.
a.k.a. Gehock
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: PHP-ongelmat

Post by temu92 »

Herra Siili wrote:Löytyykös PHP:stä vastaavia funktioita CB:n ReadLinelle ja EOF:lle? (Luultavasti löytyy, mutta en vain osaa etsiä.) Yritin etsiä php.netistä, mutta tuloksetta.
Tietääkseni ReadLinelle vastaavaa ei ole, mutta eof = feof. Fread funktiolla voi myös yrittää lukea. Itse kuitenkin suosittelisin file funktiota joka avaa tiedoston taulukkoon siten että joka rivi on oma taulusolunsa. Tällälailla luultavasti onnistuu se mitä olet hakemassa :P
TheFish
Developer
Developer
Posts: 477
Joined: Mon Aug 27, 2007 9:28 pm
Location: Joensuu

Re: PHP-ongelmat

Post by TheFish »

temu92 wrote:
Herra Siili wrote:Löytyykös PHP:stä vastaavia funktioita CB:n ReadLinelle ja EOF:lle? (Luultavasti löytyy, mutta en vain osaa etsiä.) Yritin etsiä php.netistä, mutta tuloksetta.
Tietääkseni ReadLinelle vastaavaa ei ole, mutta eof = feof. Fread funktiolla voi myös yrittää lukea. Itse kuitenkin suosittelisin file funktiota joka avaa tiedoston taulukkoon siten että joka rivi on oma taulusolunsa. Tällälailla luultavasti onnistuu se mitä olet hakemassa :P
fgets()
CoolBasic henkilökuntaa
Kehittäjä
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: PHP-ongelmat

Post by Herra Siili »

Kiitos! Yritän tuosta vääntää jotain.
a.k.a. Gehock
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: PHP-ongelmat

Post by valscion »

Herra Siili wrote:Lisäksi haluaisin neuvoja tiedostojen salasanasuojauksesta. Eli minulla on tiedostoja ja haluaisin, että ne voitaisiin ladata vain onnistuneen kirjautumisen jälkeen.
Itse sanoisin, että turvallisin tapa toteuttaa tämä on laittaa nämä topsecret-tiedostot sellaiseen polkuun palvelimella, jonne ei pääse selaimella. Sitten voisi ladata PHP:lla ne tiedostot vaikka includella, kunhan käyttäjä on ensin kirjautunut sisään.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
User avatar
Jare
Devoted Member
Posts: 877
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: PHP-ongelmat

Post by Jare »

VesQ wrote:
Herra Siili wrote:Lisäksi haluaisin neuvoja tiedostojen salasanasuojauksesta. Eli minulla on tiedostoja ja haluaisin, että ne voitaisiin ladata vain onnistuneen kirjautumisen jälkeen.
Itse sanoisin, että turvallisin tapa toteuttaa tämä on laittaa nämä topsecret-tiedostot sellaiseen polkuun palvelimella, jonne ei pääse selaimella. Sitten voisi ladata PHP:lla ne tiedostot vaikka includella, kunhan käyttäjä on ensin kirjautunut sisään.
Epäilen, ettei pelkkä include riitä, jos kyseessä on muutakin kuin tekstitiedostoja. Headereita kannattaa muokata kanssa (google kertonee enemmän, en jaksa kirjoittaa tähän romaania tästä aiheesta :) ).
Pyromanius
Newcomer
Posts: 6
Joined: Thu Jan 07, 2010 3:58 pm

Re: PHP-ongelmat

Post by Pyromanius »

Eli minulla on ns. tekoälychatissä koodinpätkä, joka tarkistaa onko annettu viesti jokin valmiista lauseista, ja antaa sen mukaan vastauksen. Juttu ei kuitenkaan toimi, ongelma kai jossain rivinvaihtojutuissa yms. Nyt nopeasti en keksi mikä siis on ongelma.
Jelppiä?

Code: Select all

//Käy joka toisen rivin läpi
for ($i = 0; $i < count($filu); $i=$i+2)
 { 
    if ($filu[$i] == $viesti) 
   {
    //Tähän asti ei päästä vaikka $filu[$i] onkin $viesti?
    $vastaus = $filu[$i+1];
   }
}
Post Reply