ugrás a tartalomhoz

PHP & Javascript

Nermendis · 2012. Feb. 3. (P), 03.01
Sziasztok!

A segítségeteket szeretném kérni.
Üzeneteket jelenítek meg a weboldalamon. Az üzeneteket adatbázisban tárolom. Az üzeneteket egy x-el lehet bezárni, ami javascript segítségével eltünteti az üzenetet.
Na már most. Az adatbázisban van egy active mező ami arra szolgál, hogyha az értéke nulla akkor az üzenetet nem listázza ki az oldal.
Van egy php függvényem ami megváltoztatná az üzenethez tartozó mező értékét nullára, ha bezárjuk az x-el az üzenetet.

Ehhez kérném a segítségeteket. Hogyan tudnám megvalósítani, hogy az x-re kattintva eltűnik az üzenet majd az adatbázisban is megváltoztatom az értéket?

Üdv,
Bence
 
1

AJAX

Poetro · 2012. Feb. 3. (P), 03.15
AJAX segítségével, vagy más újratöltés nélküli adatcserével elküldöd az adatot a szervernek, ami erre el tudja végezni a kívánt módosítást.
2

Segítség

Nermendis · 2012. Feb. 3. (P), 03.25
Tudnál nekem ebben segíteni?
Így hirtelen nem pontosan tudom, hogyan is nézne ez ki ezekkel a lehetőségekkel.
3

Olvasd el

Poetro · 2012. Feb. 3. (P), 03.32
Olvasd el a hivatkozott tartalmakat. Ha azokkal megvagy, akkor olvasd el angolul is. Majd keress egy függvénytárat, amit használni szeretnél az AJAX-ra, például reqwest.
4

thx

Nermendis · 2012. Feb. 3. (P), 10.58
Köszönöm a segítséget!
5

én inkább a jquery-t ajánlom,

Kubi · 2012. Feb. 3. (P), 11.26
én inkább a jquery-t ajánlom, mert azt úgy is érdemes megtanulni...

jQuery post

Ezzel a függvénnyel meg tudod oldani^^

gyors példa:

<div class='message' message-id='12'>üzenet</div>

<script>
  jQuery().ready(function(){
    jQuery('.message').click(function(){
      var item = jQuery(this);
      jQuery.post('/message-del.php', {id: item.attr('message-id'},
       function(data){
         if(data.success)
         {
            item.remove();
         }
       }, 
       'json'
       ).error(function(){
         alert('szerver hiba');
       });
    });
  });
</script>

Az elgondolás az, hogy az üzeneteket div-ben (vagy amiben akarod) kiteszed, egy html attributumként beállítod az adott üzenet id-ját. Ha rákkattintanak az üzenetre (írd át az x gombra) akkor post-al elküldi a szervernek az adott id-t, a szerveren a php json-al válaszol, ha azt mondja success, akkor törlöd a div-et.

nézd át a "jquery mouse events", "php json_encode", "jquery attr", "jquery post", "jquery ready"

és nagyjából képbe kerülsz, utánna írd át a kódot igényeidnek megfelelően és csináld meg a php oldalt :)
6

Kódok

Nermendis · 2012. Feb. 3. (P), 11.34
Hogy ne csak egy feladatnak nézzen ki a kódok:

Üzenet kiírás:
print "<div id=\"message-yellow\">
<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">
<tr>
<td class=\"yellow-left\">".$yellow."</td>
<td class=\"yellow-right\"><a class=\"close-yellow\"><img src=\"style/images/table/icon_close_yellow.gif\" alt=\"\" /></a></td>
</tr>
</table>
</div>";


Div bezárása:
$(document).ready(function() {
$(".close-yellow").click(function () {
$("#message-yellow").fadeOut("slow");
$("#hungary").fadeOut("slow");
});
$(".close-red").click(function () {
$("#message-red").fadeOut("slow");
});
$(".close-blue").click(function () {
$("#message-blue").fadeOut("slow");
});
$(".close-green").click(function () {
$("#message-green").fadeOut("slow");
});
});


Az update pedig:
function off_message($type){
$sqlmsgs = "UPDATE messages SET active=0 WHERE id='".$_SESSION['id']."' AND type='".$type."'";
$row = mysql_query($sqlmsgs);
}
7

hmm, ennyire részletessen

Kubi · 2012. Feb. 3. (P), 11.49
hmm, ennyire részletessen direkt nem akartam írni, mert úgy tanulja meg, ha utánnanéz és ő jön rá a részletekre ;) ne toljuk az emberek szájába a sűltgalambot
8

Saját kódok

Nermendis · 2012. Feb. 3. (P), 11.53
A kódokat én írtam, eddig van kész a weboldalnak az üzenet kezelése. Megjelenítem, be tudom zárni, viszont nem tudtam hogyan oldjam meg, hogy közben adatbázisban módosítom az értéket.
9

Tetszik

Nermendis · 2012. Feb. 3. (P), 12.09
Hiába próbálom beépíteni az általad leírtakat, nem tudom működésre bírni.
10

bocsi, nem láttam hogy te

Kubi · 2012. Feb. 3. (P), 13.07
bocsi, nem láttam hogy te irtad a postos is :)

Firefox böngészbőben tedd fel a firebug plugint. Firebugot megnyitva a konzolnál látod a hibákat, javascript hibákat. Itt látod a háttérben futó ajax kéréseket is.
Ha javascriptben irsz egy ilyen sort: console.log(<<változónév>>) az adott változót, szöveget, jquery objektumot kiirja a konzolra. Ha egy jquery objektumot pl $('.close-button) iraszts ki, akkor a konzolon rákattintva megmutatja hogy melyik elem az. Így tudod ellenőrizni, hogy a selector-od jó e.

Html-ben, azonos id-val csak egy! elem szerpelhet, azaz ha előbbi leírásod alapján több "message-yellow" id-ju cucc is van, akkor hibásan fog működni a kódod, használj class-t.

a bezáró linkeknek adj egy közös classt, pl, close-button

$('.close-button).click(function(){
$(this).parents('div').filter(':first').fadeOut("slow");
});

ezzel amikor rákattintasz a linkre, megkeresi a dom tree-ben az a elött lévő első div szülőt, és elrejti azt.

A dom treet, a firebug-ban úgy láthatod ha a html tabra kattintasz.
11

POST

Nermendis · 2012. Feb. 3. (P), 13.41
Rendben. class-t használok, mert a későbbikben több azonos üzenet is lehet. Átírtam a kódot, közös close-button-ra. Működik is, consolban megjelenik, mikor bezárom a divet.

A gondom ezzel van:
$.post('../../message-off.php', {id: item.attr('id'},
function(data){
if(data.success){
item.remove();
}
},'json'
).error(function(){
alert('szerver hiba');
});


Ezt egyáltalán nem értem, és hiába olvasgatom a documentációt róla, nem tudom működésre bírni. Illetve ha át is ad értéket a message-off-nak az a $_POST-ban érhető el?
Ez a része nekem teljes homály.
12

igen, ez post-al küldi a

Kubi · 2012. Feb. 3. (P), 15.23
igen, ez post-al küldi a megadott url-re az adatokat. $_POST['id'] alatt kell szerepelnie a cuccnak.

Mivel ott van a "},'json'" sor, ezért válasznak mindenféleképpen json-t vár.
A php scriptedben a következőt kell tenned:

// id létezésének és korrekt adat tartalmának vizsgálása
...
$id = $_POST['id'];
// kapott id feldolgozása
...

header('Content-type: application/json');
echo json_encode(array('success'=>true));
die();


és lényeges, hogy az echo soron kívül semmi mást ne küldjél a kimenetre (utf8 bom, szóköz a php tag előtt stb.)


ha nem 200-as statuszú a weboldal ami válaszol a kérésre, vagy nem json stringet kap válaszként (a header is fontos lehet), akkor az ".error(function(){" rész fut le

ha a tömbben a success -nek false értéket állítasz be, akkor nem fogja törölni az üzenetet a weblapon (a db-ben még igen, ha törölted....)
14

Eddig tiszta, tehát a php-m

Nermendis · 2012. Feb. 3. (P), 16.34
Eddig tiszta, tehát a php-m kész van. Mondjuk ki kellett ugyebár egészítenem azzal a 3 sorral.

Most nézem, hogy az előző kommentem nem sikerült túl jól.
Ugyanis az eltüntetés rész működik. Kivéve, ha benne van a postos rész, beszúrom a függvényt, igazából a fentebbi kódodat módosítottam, lehet teljesen marhaság. Ezzel mi a gond?:

$(".close-button").click(function () {
   var item = jQuery(this);
   $.post('../../message-off.php', {id: item.attr('id'},
   function(data){
      if(data.success){
          $(this).parents('div').filter(':first').fadeOut("slow");
      }
   },'json'
   ).error(function(){
      alert('Nem sikerült csatlakozni a szerverhez!');
   });
});


Ugyanis ez így nem működik nekem. :) A fadeout rész önmagában igen, de így nem.
16

olvasásra jó, nem tudom mi a

Kubi · 2012. Feb. 3. (P), 17.06
olvasásra jó, nem tudom mi a hiba oka, debuggold :)

- van javascript hiba?
- történik ajax kérés?
- ha igen milyen adatok kerülnek postolásra, benne van az id?
- mi a szerver válasza?
- a szerver válasz megfelelő json string?
17

hiányzott egy zárójel az attr

Nermendis · 2012. Feb. 4. (Szo), 18.54
hiányzott egy zárójel az attr függvényből. ha rákattintok a bezárásra ezt a hibaüzenetet dobja.

$.post("message-off.php", {id: item.attr("id")}, function (data) {if (data.success) {$(this).parents("div").filter(":first").fadeOut("slow");}}, "json").error is not a function
(?)()
handle()
a = Object { originalEvent=Event click, type="click", timeStamp=1328374087282, több...}
ab()

).error(function(){
18

A hiba a jquery 1.4.1-es

Nermendis · 2012. Feb. 5. (V), 13.02
A hiba a jquery 1.4.1-es verziójában volt.
Most az 1.4.1 és az 1.7.1-et is használja az oldal, lentebb leírom miért.

Kattintáskor az üzenet:
[a.close-button]
custom_jquery.js (49. sor)
POST http://127.0.0.1/biomedical/fejlesztve/newadmin2/admin12v30/message-off.php 200 OK 1.04s

json success true
válasz {"success":true}


Viszont ha használom az 1.4.1-et is, akkor a postban megjelenik az id, source id=

Az sql módosítás nem történik meg, a buborék nem tűnik el.
19

Sehová tovább? Firebugon és

Nermendis · 2012. Feb. 6. (H), 22.33
Sehová tovább?
Firebugon és Firephp-n kívül tudok valamit hibakeresésre? A konzolon kívül van ott más lehetőség, hogy hibát keressek? Vagy innen már tudnom kéne mi a gond? :)
21

Wireshark

janoszen · 2012. Feb. 8. (Sze), 15.28
Wiresharkkal kozvetlenul bele tudsz nezni az adatforgalomba, erdemes megtanulni hasznalni.
22

Fiddler2

Poetro · 2012. Feb. 8. (Sze), 16.10
Windows alatt talán egyszerűbb a Fiddler2-t elsajátítani, kell hozzá Fx plugin is, hogy automatikusan átállítsa a proxy-t a Fiddler2-re.
20

Sikerült megoldani a

Nermendis · 2012. Feb. 8. (Sze), 13.25
Sikerült megoldani a problémát. Az eltüntetésre használt thist felcseréltem a létrehozott item változóra és a visszatérési érték success, a box eltűnik.
Viszont a postolt idval nem működik a változtatás adatbázisban. Még egyszer átnézem a kódot, de nem találok benne hibát, mert manuálisan megadott értékre lefut.

include ("includes/db/connect.php");

$sqlmsgs = "UPDATE messages SET active=0 WHERE id='".$_POST['id']."'";
$row = mysql_query($sqlmsgs);
header('Content-type: application/json');
echo json_encode(array('success'=>true));
die();
13

Egy kérdés

Pepita · 2012. Feb. 3. (P), 16.20
Ha már megoldottátok a dolgot, akkor bocs.

De engem nem hagy nyugodni az alapkérdésben egy dolog:
Ez egy "egyfelhasználós" honlap? U.is, ha az adatbázisban az üzenet-rekordnak egy mezője szolgál arra, hogy mutassa: Júzer megjelenített már, akkor itt van egy súlyos adatbázishiba.
Egyetlen Júzer megjeleníti, ezután a többi sem látja.
Biztosan ezt akarod?
15

Dehogy. Ahogyan írtam, bár

Nermendis · 2012. Feb. 3. (P), 16.38
Dehogy. Ahogyan írtam, bár lehet nem írtam, ez még csak maga a teszt volt arra, hogy meg fogom-e tudni oldani és elakadtam innentől kezdve nem azzal voltam elfoglalva kinek mi jelenik meg, hanem azzal, hogyan tudnék kommunikálni az adatbázissal.

Ha ezt sikerült megvalósítani a többit már könnyű szerrel megoldom. :)
23

Örömmel jelentem be,

Nermendis · 2012. Feb. 18. (Szo), 17.07
Örömmel jelentem be, sikerült!

Az utolsó postolási hiba figyelmetlenségből adódott, ami a consolban ki is derült. Tökéletesen müködik a javascriptben a postolás. Az adatok módosulnak a modul tökéletesen működik. Mindenkinek köszönöm a segítséget!

üdv,
Nermendis