Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP: Web-kameran käynnistäminen

Sivun loppuun

MIB [10.08.2009 21:00:45]

#

Hei

En osaa itse mitään ohjelmointikieliä, mutta olisin kiinnostunut saamaan web-kameran koodilla päälle niin, että näkee oman kuvansa ohjelmassa. Myös olisin kiinnostunut tietämään, että onko mahdollista tehdä C++:lla MSN Messengerin tapainen ohjelma, joka lähettää ääntä ja kuvaa kahden clientin välillä.
Tämä tuskin on mahdollista millään nettisivujen ohjelmoimiskielellä, mutta jos on niin kertokaa ihmeessä millä ja miten.
Koska tuo Messenger "lagaa" niin pirusti, kun puhun kavereiden kanssa, niin olisi hienoa kun voisi itsellä olla tämmöinen ohjelma. Tekisin heti kun osaisin.
Pynthonilla on mielestäni niin helppo syntaxi verrattuna PHP:n mitä osaan mielestäni kohtalaisesti, niin sillä kun saisi tehtyä, niin oppisi sitä reilusti :)

Toivottavasti joku ymmärsi mitä tarkoitin.

Yst. terv. MIB
Ps. Jos joku tietää, niin voiko joku antaa esimerkin?

Edit. Onhan näitä valmiitakin, mutta kiinnostaisi tehdä ihan itse :)

Pps. Myös Flashillä voisi ajatella, koska se toimii netissä (Olen nähnyt esimerkkejäkin). Salasanalla (Kenties .htaccess?) sitten vain sisään, ja voisi sitten kaverin kanssa videokuvaa ja ääntää välittää.

Contraband [10.08.2009 22:14:22]

#

Tästä voi olla apua jos Pythonilla haluat lähteä liikkeelle:
http://videocapture.sourceforge.net/

MIB [11.08.2009 00:11:37]

#

En oikein saanut tota kuntoon... Ihan tuo esittely näytti erikoiselta, mutta eikös tämän saa vähän helpommin tehtyä? Ehkä vähän turhan monta tiedostoa niin "yksinkertaiselle" asialle.

Tuossa Python -opasprojekti (tms.) aiheessa joku esitti, että matopelin tilalle voisi tulla nettipeli. Eli, kummallakin koneella voisi olla ohjelma, joka hakee vaikka IP:n perusteella koneen, ja ottaisi sitten video & äänipuhelun. Sitten voisi olla vielä ominaisuus, että se pitää hyväksyä, ja voisi saada myös aliverkon koneeseen yhteyden (Määrittää ulkoisen, ja sitten sisäisen. Esim 91.152.142.161 ja 10.0.0.1).

Grez [11.08.2009 01:38:25]

#

Asiat voi vaikuttaa aika yksinkertaisilta jos ei tiedä mitä pinnan alla tapahtuu.

Onhan autokin yksinkertainen kapistus siinä mielessä, että kun painaa kaasua se liikkuu eteenpäin. Silti, jos pitäisi lähteä alusta alkaen suunnitelemaan moottoria ja kaikkea niin olisihan siinä hommaa.

Tuollainen videopuhelinsofta riippuu aika paljon siitä mitä tekee itse. Jos vaan läiskii valmiit palikat kasaan, niin eihän siinä hirveä homma välttämättä ole. Jos taas ihan puhtaalta pöydältä haluaisi tehdä videopuhelinsoftan (kodekit, käyttöliittymät, verkkoprotokollat jne) niin puhutaan ehkä kymmenistä tai jopa sadoista tuhansista koodiriveistä.

tesmu [11.08.2009 07:21:11]

#

Ei se auto nyt loppujenlopuksi niin monimutkainen ole kuin tietokone :)

Grez [11.08.2009 09:23:28]

#

Paitsi että nykyautoissa on yleensä tietokone jos parikin :D

MIB [11.08.2009 10:28:26]

#

--

Edit. Ajattelin tehdä tässä myös tekstichatin nettiin. Ongelma vaan on, että PHP kun ei "päivity" automaattisesti, niin pitää varmaan jotain javascriptiä änkeä. Jossain on <body> -tagin tilalla <body onlodad=""> tms. Jos sekunnin välein päivittyisi tämä tekstikenttä.

trilog [11.08.2009 11:04:39]

#

MIB kirjoitti:

--

Edit. Ajattelin tehdä tässä myös tekstichatin nettiin. Ongelma vaan on, että PHP kun ei "päivity" automaattisesti, niin pitää varmaan jotain javascriptiä änkeä. Jossain on <body> -tagin tilalla <body onlodad=""> tms. Jos sekunnin välein päivittyisi tämä tekstikenttä.

Ajax on juuri tuohon hommaan.

MIB [11.08.2009 11:13:50]

#

Öm. Onko Ajax oma kieli, vai JavaScriptin/Javan osa?

Blaze [11.08.2009 11:20:00]

#

Ajaxiksi (sanoista Asynchronous Javascript And Xml) kutsutaan sitä, kun Javascriptin xmlHttpRequest-ominaisuutta käyttäen tehdään asynkronisia HTTP-kutsuja, ts. haetaan palvelimelta uutta dataa päivittämättä koko sivua uudelleen.

MIB [11.08.2009 12:33:30]

#

En ole ikinä perehtynyt tähän, joten en paljon osaa.
Minulla on sivu, joka hakee kaikki viestit:

<?php
include("settings.php");
$yhteys = mysql_connect("localhost", "root", "");
mysql_select_db("chat");

if($user) {
	$haku = mysql_query("SELECT * FROM viestit ORDER BY aika DESC");
	for($i = 0; $i < mysql_num_rows($haku); $i++) {
		$tiedot = mysql_fetch_array($haku);
		echo $tiedot["lahettaja"] . " [" . date("H:i:s", $tiedot["aika"]) . "]: " . $tiedot["viesti"] . "<br>";
	}
}
mysql_close($yhteys);
?>

Tämä sitten sillä Ajaxilla päivittymään, kun kantaan lisätään viesti.
Näissä voisi myös olla jokin liuku-efekti: Kun viesti kirjotetaan, se liukuu alhaalta ylös. Tämä ei kyllä ole mikään tärkein asia, kunhan sivu päivittyy heti kun viesti tulee.

trilog [11.08.2009 13:29:41]

#

Tuosta vaan perehtymään asiaan:

https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=ajax

MIB [11.08.2009 14:06:09]

#

Tajusin jo miten teen sen, että hakee tiedot sieltä kannasta, mutta... Tuossa ei käsitellä suoraan sitä mitä haen: Ei tarvitse painaa mitään nappuloita, kun se hakee jo tiedot.

Edit. Viestit näkyvät textareassa yksi viesti rivillään. Textareaan includetaan lue.php, jossa on sitten koodi mikä hakee tiedot kannasta.

MIB [11.08.2009 16:20:03]

#

JavaScriptissä on tämä onLoad, mutta onko sellaista, että päivittää kokoajan? Tai, jos laittaa <body onLoad="start()"> ja start() alkaa päivittämään sivua "salaa"? Vai, olisikohan parempi, että joku kertoisi (?) miten pitäisi saada ne viestit päivittymään automaattisesti.

Triton [11.08.2009 16:28:58]

#

Olisikohan tuosta ajaxista hyötyä? Siinähän on se onreadystatechange-tapahtumankäsittelijä...

MIB [11.08.2009 16:54:23]

#

Nyt ei näytä onnistuvan. Triton, näytät osaavan kieltä, niin voisitko näyttää esimerkin, minkä pohjalta voisin vääntää?

Teuro [11.08.2009 17:09:57]

#

Voisit tehdä vaikka funktion, jota kutsut kun sivu luodaan. Vaikkapa haeUudetViestit(), joka tekee noita AJAX pyyntöjä. Sopiva frekvenssi voisi olla viestien määrästä riippuen noin 6 sekuntia, jottei palvelin ihan tukehtuisi noihin kutsuihin.

MIB [11.08.2009 17:41:15]

#

Täytyy, myöntää etten osaa. Pitää koittaa vääntää... Apu olisi myös paikalla (Jos voisi näyttää vaikka miten haetaan automaattisesti jotani, ja jättää soveltamisen varaa myös.). :s

Edit. Ja muuten miten saa textareaan HTML:ää? Ei mitenkään?

Blaze [11.08.2009 18:39:10]

#

MIB kirjoitti:

Ja muuten miten saa textareaan HTML:ää? Ei mitenkään?

Eskapoimalla sen: <textarea>&lt;p&gt;piece &amp; cake&lt;/p&gt;</textarea>

MIB [11.08.2009 18:46:10]

#

Haluaisin, että HTML toimii siellä, kun nyt ei toimi

Triton [11.08.2009 18:49:29]

#

Kannattaa tutustua tuohon jQueryyn, sillä sen avulla ajax-komennot hoituu huomattavasti helpommin... Ja tosiaan html ei toimi textareassa, sitä varten on olemassa kaikki jo valmiit wysiwyg editorit, kuten TinyMCE.

MikaBug [11.08.2009 18:56:33]

#

AJAX-tekniikasta on oma opas täällä ohjelmointiputkassa https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=ajax ja sillä ainakin itse lähtisin toteuttamaan tuollaista chat-tyyppistä sovellusta. Minusta ei myöskään ole järkevää ainakaan ladata koko nettisivua uudelleen joka kerta kun halutaan viestien päivittyvän, eikä tietysti AJAXia käytettäessä tarvitsekaan. Mieluumin siten, että joka kerta, kun uusi viesti (mikäli sellainen on edellisen päivityksen jälkeen tullut) haetaan AJAX:n avulla palvelimelta, se liitettäisiin aiemmin tulleiden viestien perään JavaScriptin ja DOMin avulla (opas DOMista: https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=dom). Tai sitten näyttäisi viestit textarea-komponentissa, jolloin selviää vähemmällä DOM-kikkailulla.

Tarkoititko muuten tuolla "miten saa textareaan HTML:ää" sitä, että kuinka textareassa olevaa tekstiä voi muotoilla HTML:n avulla? Se ei onnistu, ainakaan tämän perinteisen textarean kohdalla.

MIB [11.08.2009 20:55:38]

#

Tuossa Ajax oppaassa on esitetty asia hienosti, mutta kun tästä pitää painaa nappia, että tiedot tulevat siihen. Pitäisi toimia automaattisesti.

jo123 [11.08.2009 23:06:44]

#

Ajasta viestin haku functio toistumaan esim. puolen sekuntin välein.

Triton [11.08.2009 23:50:30]

#

jo123 kirjoitti:

Ajasta viestin haku functio toistumaan esim. puolen sekuntin välein.

Tuo ei ole minusta kovin järkevä ratkaisu, sillä ohjelman tulisi toimia, niin että viestit päivitetään kun uusi viesti lisätään. Eli yksinkertaisesti chatti on päivitettävä aina kun uusi viesti kirjataan esim. mysql-kantaan...

Grez [12.08.2009 00:23:22]

#

No "ajastat" sen funktion käynnistymään uudestaan, kun edelliseen tulee vastaus. Ja laitat palvelimelle, että se ei anna vastausta ennen kuin tulee uusi viesti.

MIB [12.08.2009 10:20:02]

#

Grez kirjoitti:

No "ajastat" sen funktion käynnistymään uudestaan, kun edelliseen tulee vastaus. Ja laitat palvelimelle, että se ei anna vastausta ennen kuin tulee uusi viesti.

No, sehän tässä se ongelma onkin, että miten se tehdään.

MIB [12.08.2009 12:09:03]

#

Osaan tehdä kaiken sen niin, että päivittyy nappia painamalla (Haetaan vaan kannan tiedot uudelleen), mutta en osaa sitä nappia muuttaa oppaan perusteella niin, että päivittyy kun kantaan tulee lisää tavaraa.
Auttaisiko joku?

jo123 [12.08.2009 13:48:12]

#

Triton kirjoitti:

jo123 kirjoitti:

Ajasta viestin haku functio toistumaan esim. puolen sekuntin välein.

Tuo ei ole minusta kovin järkevä ratkaisu, sillä ohjelman tulisi toimia, niin että viestit päivitetään kun uusi viesti lisätään. Eli yksinkertaisesti chatti on päivitettävä aina kun uusi viesti kirjataan esim. mysql-kantaan...

En keksi nyt äkkiseltään mitään muuta tapaa tarkistaa, onko uusia viestejä tullut, kuin tämä ajastin.

MIB kirjoitti:

No, sehän tässä se ongelma onkin, että miten se tehdään.

Tutustu javascriptin setTimeout()-funktioon.

MIB [12.08.2009 14:04:11]

#

Tuo setTimeout()-funktiohan vain tietyn ajan välein tarkistaa. Eikös Grez juuri maininnut, että sen voi tehdä niin, että hakee kun siellä on uusi viesti tullut.

Grez [12.08.2009 15:06:08]

#

Siis se haku täytyy tietenkin tehdä odottamaan jo ennen kuin uutta viestiä pukkaa.

MIB [12.08.2009 15:17:20]

#

Voisiko joku antaa pienen esimerkin, koska olen ihan pellolla?

Chiman [12.08.2009 16:57:34]

#

while true
  - katso tietokannasta onko uusia viestejä
  - jos on, tulosta ne ja lopeta
  - nuku hetki, esim. 1 s

MIB [13.08.2009 11:26:24]

#

Jos teen tämän mukaan, ja laitan tuo settimeout():n tuonne kutsumisfunktion perään, ja sen jälkeen suoritetaan uudelleen, vai voisiko tämän tehdä vähän helpommin? :/

Ps. En kyllä ole saanut tuota kasetti.infon juttua toimimaan.

Edit. Taisin saada toimimaan, koitan vielä kannasta hakemalla.

Edit. Tuo ei näytä toimivan, kun hakee kannasta:

<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
?>

<html>
<head>
<title>Ajax</title>
<script type="text/javascript">
var xmlHttp

function refresh_text(){
    //suoritetaan dataa hakeva funktio
    showText();
    setTimeout("refresh_text()", 1000)
}

function showText(){
    xmlHttp = GetXmlHttpObject();
    if (xmlHttp == null){
        alert ("Selaimesi ei tue AJAXia!");
        return;
    }

    //tässä on sivu josta dataa haetaan
      var url = "teksti.php";

    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
}

function stateChanged() {
    if (xmlHttp.readyState==4){
        document.getElementById("teksti").innerHTML=xmlHttp.responseText;
    }
}

function GetXmlHttpObject(){
    var xmlHttp=null;
    try{
          xmlHttp=new XMLHttpRequest();
      }
    catch (e){
          try
            {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            }
          catch (e)
            {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
      }
    return xmlHttp;
}
</script>
</head>

<body onload=refresh_text()>
<p>
<div id="teksti"></div>
</p>
</body>
</html>
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// aina muokattu
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");

/* tietojoukko joka sekoitetaan ja tulostetaan ensimmäinen arvo.
   Tämä kuvaa "dynaamista" sivua jonka data siis voi muuttua kuten
   esimerkiksi sivua jossa haetaan tietokannasta uusien viesti.
*/

$yhteys = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("chat") or die(mysql_error());

$haku = mysql_query("SELECT * FROM viestit ORDER BY aika DESC") or die(mysql_error());
for($i = 0; $i < mysql_num_rows($haku); $i++) {
	$tiedot = mysql_fetch_array($haku);
	echo $tiedot["lahettaja"] . " [" . date("H:i:s d.m.Y", $tiedot["aika"]) . "]: " . $tiedot["viesti"] . "<br><br>";
}
mysql_close($yhteys);
?>

teksti.php pitää käydä manuaalisesti päivittämässä, että tuo Ajax hakee sen.

MIB [13.08.2009 14:08:16]

#

Nyt tuo toimii, ääkkösiä lukuun ottamatta:

<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// aina muokattu
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");

/* tietojoukko joka sekoitetaan ja tulostetaan ensimmäinen arvo.
   Tämä kuvaa "dynaamista" sivua jonka data siis voi muuttua kuten
   esimerkiksi sivua jossa haetaan tietokannasta uusien viesti.
*/

$yhteys = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("chat") or die(mysql_error());

$haku = mysql_query("SELECT * FROM viestit ORDER BY aika DESC") or die(mysql_error());
for($i = 0; $i < mysql_num_rows($haku); $i++) {
	$tiedot = mysql_fetch_array($haku);
	echo $tiedot["lahettaja"] . " [" . date("H:i:s d.m.Y", $tiedot["aika"]) . "]: " . $tiedot["viesti"] . "<br><br>";
}
mysql_close($yhteys);
?>
<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
?>

<html>
<head>
<title>Ajax</title>
<script type="text/javascript">
var xmlHttp

function refresh_text(){
    //suoritetaan dataa hakeva funktio
    showText();
    setTimeout("refresh_text()", 1000)
}

function showText(){
    xmlHttp = GetXmlHttpObject();
    if (xmlHttp == null){
        alert ("Selaimesi ei tue AJAXia!");
        return;
    }

    //tässä on sivu josta dataa haetaan
      var url = "teksti.php";

    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
}

function stateChanged() {
    if (xmlHttp.readyState==4){
        document.getElementById("teksti").innerHTML=xmlHttp.responseText;
    }
}

function GetXmlHttpObject(){
    var xmlHttp=null;
    try{
          xmlHttp=new XMLHttpRequest();
      }
    catch (e){
          try
            {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            }
          catch (e)
            {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
      }
    return xmlHttp;
}
</script>
</head>

<body onload=refresh_text()>
<p>
<div id="teksti"></div>
</p>
</body>
</html>

Tuo ajax nähtävästi sotkee ääkköset jotenkin. Kannassa ja kun ne tulostetaan, ne ovat oikein, mutta kun Ajax-koodi hakee ne, niin ääkköset korvautuvat neliöllä.

Edit. Tuo koodi nähtävästi ei myöskään ymmärrä \n ja \r merkintöjä. Kun tulostan tiedot textareaan, niin pitäisi saada rivi vaihtumaan tietyssä kohdassa. No, tuo vetää ne tietenkin putkeen.

Teuro [13.08.2009 14:41:08]

#

Missä muodossa data palautuu kannasta ja missä muodossa muut asiaan liittyvät tiedostot ovat. Kannan saa palauttamaan datan halutussa merkistössä funktiolla mysql_set_charset(string charset), jossa charset on validi merkistökoodauksen nimi. Käytetyn merkistön saat selville funktiolla mysql_clinet_encoding()

MIB [13.08.2009 15:00:51]

#

Kaikki nuo ovat kunnossa, mutta tuo ajax koodi sekoittaa. Kannassa tiedot ovat latin1, ja kun ne tulostetaan, niin ääkköset toimivat (Jos PHP tulostaa, mutta ajax sössii ne).

Triton [13.08.2009 16:51:33]

#

Tarkistappa, että nuo kooditiedostosi on tallennettu myös ANSI-koodauksella. Nimittäin itselläni ainakin sotkee ääkköset jos tiedostot ovat utf8-koodatut, mutta käsiteltävä data on ANSI-koodattua...

MIB [13.08.2009 16:59:21]

#

Ei se mitään auta...

Chiman [13.08.2009 17:36:00]

#

Eikös ajax-jutut käytä ainakin oletuksena utf-8:ia? Nykyaikana se on hyvä valinta muutenkin, ellei jotkin erityiset syyt muuta vaadi.

MIB [13.08.2009 17:39:24]

#

No, kuitenkaan tuo Ajax ei osaa käsitellä nähtävästi ääkkösiä latin1:nä, ja \n ja \r merkinnät eivät toimi.

Ps. Ei tuo toimi sen paremmin utf8:na.

Teuro [13.08.2009 18:54:23]

#

No melko perusteellisten testien jälkeen olen päätynyt seuraavaan lopputulokseen tämän koodin kanssa. Selaimeni ei suostunut näyttämään skandivaasia merkkejä oikein aluksi. Sitten tein muutokset, joista mainitsin hetki sitten. Eli muutin datan merkistön utf8:n. Voitte itse kokeilla jos haluatte.

Tässä linkisä ei ole asetettu merkistöä kannasta tulevalle datalle. Tässä linkissä merkistö on asetettu utf8:ksi. Tekisi mieli sanoa, ettet MIB ole edes kokeillut noita ehdottamiani korjauksia.

MIB [13.08.2009 20:21:55]

#

Teuro kirjoitti:

Tekisi mieli sanoa, ettet MIB ole edes kokeillut noita ehdottamiani korjauksia.

Voin sanoa samaa, koska kokeilin tyhmyyttäni väärään tiedostoon... Ajattelin tämän asettavan kannan sellaiseksi, jota tämä ei nähtävästi tehnyt. ;) No, nyt on yksi asia pois tehtäväluettelosta.
Vielä yksi juttu: En saa \n merkintöjä toimimaan textareassa kun Ajax tulostaa ne. Mitenköhän saisin rivinvaihdot tiettyihin kohtiin (viestin jälkeen) textareassa? En ole onnistunut, kun olen \r ja \n merkintöjä koittanut.

Teuro [13.08.2009 21:49:55]

#

Rvinvaihdot toimivat ainakin mulla ihan hyvin. Tosin jos haluat ne sivuille näkyviin tulisi konvertoida sopivaan muotoon. Voisit palautuksen yhteydessä teksti.php sivulla tehdä vaikkapa nl2br() funktiolla konversion.

MIB [14.08.2009 08:50:06]

#

nl2br() palauttaa nuo \n\r rivinvaihdot HTML muotoon. Minun pitäisi siis saada textareassa rivinvaihdot näkyviin. PHP tulostaa viestin näin:

<?php echo $tiedot["lahettaja"] . " [" . date("H:i:s d.m.Y", $tiedot["aika"]) . "]: " . $tiedot["viesti"] . "\n"; ?>

Ja, kun Ajax hakee sivun ja tulostaa textareaan, niin \n merkintä häviää.

Teuro [14.08.2009 09:09:17]

#

Myös textareassa toimii mulla rivinvaihdot aivan normaalisti. Katso linkki

MIB [14.08.2009 09:19:21]

#

Et tainut ihan ymmärtää: Kyllä se noin toimii, kun sinne painaa rivinvaihdon, mutta jos PHP-koodi, teksti.php, tulostaa "Lähettäjä [aika]: viesti\n\n", niin textareassa tämä on "Lähettäjä [aika]: viesti Lähettäjä [aika]: viesti" tämän sijasta:
"Lähettäjä [aika]: viesti
Lähettäjä [aika]: viesti"

Teuro [14.08.2009 09:24:28]

#

En tosiaan taida oikein ymmärtää mitä haluat, koska toiminnan kannalta ei liene merkitystä miten \r\n tai \n merkki merkkijonon perään tulee (käyttäjän syöte vs ohjelmallinen). Voit halutessasi kokeilla linkki on sama kuin edellisessä viestissäni, jonne on muutettu sopivat \r\n merkit. Kaikki selaimet eivät välttämättä nielaise \n merkkiä, vaan ne haluavat \r\n merkin.

MIB [14.08.2009 09:26:46]

#

1 [2009-08-13 18:37:25]: Toimiiko ääkköset? rivinvaihdot? 0
[2009-08-13 18:36:40]: Moikka vaan kaikille.

Minulla tulostuu esimerkissäsi näin, koska päivämäärä ja viesti ei mahdu samalle riville.

Tämä on tarkoitus:

Lähettäjä [aika]: viesti
Lähettäjä [aika]: viesti
Lähettäjä [aika]: viesti
Lähettäjä [aika]: viesti

Teuro [14.08.2009 09:30:10]

#

Nyt se on juurikin niin kuin haluat. Olisit ehkä osannut itsekin muuntaa tuon textarean cols arvoa hiukan suuremmaksi. Käyttäjän tekemät rivinvaihdot voisi tosin siivota vielä huis pois tuolta, jolloin se olisi tarkalleen kuten haluat. Joskin tuossa on jokainen "osio" omalla rivillään.

MIB [14.08.2009 09:44:07]

#

No, sainhan sen sitten tehtyä, vähän kiertelyn kautta:

<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// aina muokattu
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");

$yhteys = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("chat") or die(mysql_error());

mysql_set_charset("utf8");

$haku = mysql_query("SELECT * FROM viestit ORDER BY aika DESC") or die(mysql_error());
echo '<textarea cols="80" rows="10" align="center" ReadOnly>';
for($i = 0; $i < mysql_num_rows($haku); $i++) {
	$tiedot = mysql_fetch_array($haku);
	echo $tiedot["lahettaja"] . " [" . date("H:i:s d.m.Y", $tiedot["aika"]) . "]: " . $tiedot["viesti"] . "\r\n";
}
echo '</textarea>';
mysql_close($yhteys);
?>

Ps. Mitä muuten auttaa, kun on asetettu näitä http-headereita ja menneitä aikoja?

Teuro [14.08.2009 10:02:38]

#

Pieni kysymys vielä tuosta koodista, koska näytät luovan tuolla textarean, vaikka sille ei pitäisi olla mitään tarvetta. Riittää siis hyvin, kun vain tulostat kaikki viestiti sopivassa formaatissa ulos. Negatiiviset ajat headerissa liittynevät selaimeen huijaamiseen. Tällöin sivu on aina takuulla vanhentunut ja selaimen tulee hakea aidosti sivu uudestaan, eikä käyttää ns. cache sivua.

MIB [14.08.2009 10:10:54]

#

Laitoin textarean tuonne, ja otin sen toisesta pois, koska tuo Ajax ei osannut välittää PHP:ltä tullutta \n merkintää...

MIB [14.08.2009 16:15:49]

#

Muuten, jos haluan hakea (kuten haluan) monta eri elementtiä samalle sivulle tällä taktiikalla, niin miten pitäisi tehdä?
Eikös ole aika järjetöntä laittaa noin pitkää koodia moneen kertaan? Sittenhän kaikkien muuttujien nimetkin pitäisi nimetä uudelleen eri koodeissa.

Osaisiko joku antaa jonkin vinkin, miten voin hakea tietyiltä sivulta (sekunin välein), tietyt elementit (Tai vaikka koko sivun) ja tulostaa ne oikeisiin elementteihin. Ei ole kyllä minusta järkevää laittaa tuota koodia moneen kertaan.


Jos ajatellaan, että sivulla 2 on koodi, joka hakee tiedot kannasta, ja tulostaa ne näin:

Tunnus [aika]: viesti\n

Sivulla 1 on ajax koodi, joka hakee sekunnin välein nämä sivun 2 tiedot. Sivun yksi rakenne on ilman 2 sivun tietoja seuraava:

*-------------------------------------------------*
|                                                 |
|                                                 |
|                                                 |
|                  textarea                       |
|                                                 |
|                                                 |
|                                                 |
*-------------------------------------------------*

Ja kun ajax hakee sivun kaksi, se on näin:

*-------------------------------------------------*
|Tunnus [aika]: viesti Tunnus [aika]: viesti\n    |
|Tunnus [aika]: viesti Tunnus [aika]: viesti\n    |
|Tunnus [aika]: viesti Tunnus [aika]: viesti\n    |
|                                                 |
|                                                 |
|                                                 |
|                                                 |
*-------------------------------------------------*

jne.. vaikka sen kuuluisi olla näin:

*-------------------------------------------------*
|Tunnus [aika]: viesti                            |
|Tunnus [aika]: viesti                            |
|Tunnus [aika]: viesti                            |
|Tunnus [aika]: viesti                            |
|                                                 |
|                                                 |
*-------------------------------------------------*

jne...

Kun tulostan sivulla 2 sinne perään \n, niin se menee lähdekoodiin (Tietenkin), vaikka haluaisin tämän välittyvän textarealle asti, ja textareaan tulisi vasta enter lyönti.

MIB [15.08.2009 10:20:05]

#

Harmi kun kukaan ei osaa auttaa. Ajattelin tässä, että se voisi olla suurin piirtein tälläinen: (niinkuin tuo onkin....)

url1 = sivu joka haetaan
url2 = sivu joka haetaan
url3 = sivu joka haetaan

haetaan url1 sekunnin välein muuttujaan
haetaan url2 sekunnin välein muuttujaan
haetaan url3 sekunnin välein muuttujaan

tulostetaan url1 diviin teksti1
tulostetaan url2 diviin teksti2
tulostetaan url3 diviin teksti3

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta