Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pętla while problem logiczny
Forum PHP.pl > Forum > Przedszkole
Terrorizer
Witam,
Mam problem natury logicznej. Nie potrafię przebić się przez pęk swoich głupich myśli i dojść do czegoś, co miałoby sens.
Stworzyłem pętlę while wypisującą wiadomości z bazy danych.
Każda wiadomość otrzymuje w pętli id równy temu który już posiada w bazie i staje się jakby buttonem, żeby można było na nią łatwo kliknąć.
Teraz poza pętlą usiłuję sprawić, aby po kliknięciu na daną wiadomość wyświetlała się ona w całości, jednak jakbym nie kombinował, to zawsze wyświetla mi się ta sama, czyli ostatnia z pętli.
Poniżej wrzucam kod, jest on bardzo nieczytelny, ale może ktoś ogólnie podpowie mi , jak się za to zabrać?
Zdaję sobie sprawę, że do zmiennej $messageid w pętli jest przypisywana, za każdym inna wartość i na końcu zostaje tylko ta ostatnia.
Używam tutaj gotowej funkcji popupa, mógłbym zastosować onclick z ajaxem, ale wtedy zgłupieję do reszty biggrin.gif
  1. <?php
  2. $nick = mysql_fetch_array(mysql_query('SELECT nick FROM users WHERE id = "'.$_SESSION['id'].'" '));
  3. $messages = mysql_query('SELECT * FROM msg WHERE receiver = "'.$nick['nick'].'" ORDER BY id DESC ');
  4.  
  5. while ($fetchmessages = mysql_fetch_assoc($messages)){
  6.  
  7. $wholemessage = $fetchmessages['message'];
  8. $messageid = $fetchmessages['id'];
  9.  
  10. echo "<button id='my-button'><span class='txt' id='".$messageid."'>" . substr($wholemessage, 0, 40) . "</button> <br />" ;
  11. }
  12.  
  13.  
  14. echo "<div id='element_to_pop_up'>
  15. <a class='b-close'>zamknij</a>";
  16. $messages = mysql_query('SELECT * FROM msg WHERE id = "'.$messageid.'" ');
  17. $fetchmessage = mysql_fetch_assoc($messages);
  18. echo $fetchmessage['message'];
  19. echo "</div>";
  20.  
  21. ?>
nospor
Nigdzie nie widze kodu, ktory by reagowal na wcisniety button, wiec naprawde nie rozumiem w czym się tu zagubiles? Do bazy po pełną wiadomosc lecisz niezaleznie czy ktos cos kliknal czy nie...
Terrorizer
W takim razie muszę przesłać w jakiś sposób kliknięte id.
Idąc tym tropem znowu bez js się nie obejdzie?
Trudne życie PHPowca haha.gif
nospor
js tutaj nie ma nic do gadania....
Poczytaj o GET, POST w php... Poczytaj o linkach/formularzach w html. To są podstawy podstaw.
Terrorizer
Wciąż mam z tym problem.
Mam button który ma class="button", co sprawia ,że wyskakuje modal dialog.
Zagnieździłem w buttonie href (próbowałem też odwrotnie) wpisujący do linku wartość id.
Natomiast cały ten popup powstrzymuje hrefa przed dodaniem czegokolwiek do linku.
Czy coś robię nie tak?

EDIT: Znalazłem w kodzie jquery linijkę prevent default. Skasowałem ją, jednak wciąż nie działa to tak jak powinno.
Okno popup się pojawia, jednak natychmiast znika i dodawana jest wartość do url.
A zależy mi żeby ten link był zmieniony w momencie gdy okienko będzie aktywne
nospor
Kurcze.... to ty masz tutaj jeszcze jakis modal dialog... no chlopie, opisuj w pelni problem, a nie lecisz po lebkach.
Napisz dokladnie co masz, co sie dzieje, co ma sie dziac i takie tam. Jestes na forum programistycznym a nie w przedszkolu wsrod 5cio latkow.
Terrorizer
Wszystko na czym mi zależy to aby po kliknięciu w wiadomość wyskoczyło okienko w którym będę mógł pobrać z bazy treść wiadomości
No i tak jak napisałem. Pętla while wyświetla mi wiadomości które są w postaci guzików z przypisaną klasą "my-button" dzięki której, gdy klikam jeden z nich wyświetla mi się modal dialog.
Chciałem aby w modal dialogu pojawiła mi się całość wiadomości, w związku z czym muszę wyrzucić w jakiś sposób z pętli id konkretnej wiadomości, postanowiłem zrobić to hrefem i odebrać przez get.
Próbowałem na różne sposoby, jednak albo wyświetla się to okienko modal dialog, albo wartość dopisuje się do url, natomiast nigdy te dwie rzeczy nie robią się jednocześnie.
Po skasowaniu w jquery funkcji prevent default faktycznie wykonują się obie czynności, niestety gdy wyskakuje modal dialog natychmiast się on zamyka i dopiero do url dopisywana jest liczba.

Cały kod przepisywałem wczoraj cały dzień milion razy od nowa aby był czytelniejszy i łatwiej się go czytało, oto on w chwili obecnej:
  1. <?php
  2. $nick = mysql_fetch_array(mysql_query('SELECT nick FROM users WHERE id = "'.$_SESSION['id'].'"'));
  3. $messages = mysql_query("SELECT * FROM msg WHERE receiver = '".$nick['nick']."' ");
  4. while($allmessages = mysql_fetch_assoc($messages)){
  5. echo "<a href='mailbox.php?id=" . $allmessages['id'] . "'><button class='my-button'>";
  6. echo "<div class='left'>" . substr($allmessages['message'],0,40) . " " . "..." . "</div>";
  7. echo "<div class='right'>" . $allmessages['date'] . " " . "|" . " ";
  8. echo $allmessages['sender'] . "</div>";
  9. echo "</button></a>". "<br /> <br />";
  10. }
  11. ?>

Kod jquery jest koszmarnie długi, ściągnąłem go z internetu pod nazwą bpopup, ale może też go wstawię. Widze ,że tam autor zaznaczył miejsce na dopisanie własnego kodu, mógłbym może jakoś do tego pliku jquery dodać jakąś instrukcję uzupełniającą adres url? Jednak nie znam się na js jeszcze w ogóle. Miałbym trudności z przekazaniem zmiennej do pliku js.
  1. // Semicolon (;) to ensure closing of earlier scripting
  2. // Encapsulation
  3. // $ is assigned to jQuery
  4. ;(function($) {
  5.  
  6. // DOM Ready
  7. $(function() {
  8.  
  9. // Binding a click event
  10. // From jQuery v.1.7.0 use .on() instead of .bind()
  11. $('.my-button').bind('click', function(e) {
  12.  
  13. // Prevents the default action to be triggered.
  14. // e.preventDefault();
  15.  
  16. // Triggering bPopup when click event is fired
  17. $('#element_to_pop_up').bPopup();
  18.  
  19. });
  20.  
  21. });
  22.  
  23. })(jQuery);
  24.  
  25. /*===============================================================================
    =
  26.  * @name: bPopup - if you can't get it up, use bPopup
  27.  * @author: (c)Bjoern Klinggaard (twitter@bklinggaard)
  28.  * @demo: <a href="http://dinbror.dk/bpopup" target="_blank">http://dinbror.dk/bpopup</a>
  29.  * @version: 0.9.4.min
  30.  ===========================================================================
    =====*/
  31. (function(b){b.fn.bPopup=function(z,F){function K(){a.contentContainer=b(a.contentContainer||c);switch(a.content){case "iframe":var h=b('<iframe class="b-iframe" '+a.iframeAttr+"></iframe>");h.appendTo(a.contentContainer);r=c.outerHeight(!0);s=c.outerWidth(!0);A();h.attr("src",a.loadUrl);k(a.loadCallback);break;case "image":A();b("<img />").load(function(){k(a.loadCallback);G(b(this))}).attr("src",a.loadUrl).hide().appendTo(a.contentContainer);break;default:A(),b('<div class="b-ajax-wrapper"></div>').load(a.loadUrl,a.loadData,function(){k(a.loadCallback);G(b(this))}).hide().appendTo(a.contentContainer)}}function A(){a.modal&&b('<div class="b-modal '+e+'"></div>').css({backgroundColor:a.modalColor,position:"fixed",top:0,right:0,bottom:0,left:0,opacity:0,zIndex:a.zIndex+t}).appendTo(a.appendTo).fadeTo(a.speed,a.opacity);D();c.data("bPopup",a).data("id",e).css({left:"slideIn"==a.transition||"slideBack"==a.transition?"slideBack"==a.transition?g.scrollLeft()+u:-1*(v+s):l(!(!a.follow[0]&&m||f)),position:a.positionStyle||"absolute",top:"slideDown"==a.transition||"slideUp"==a.transition?"slideUp"==a.transition?g.scrollTop()+w:x+-1*r:n(!(!a.follow[1]&&p||f)),"z-index":a.zIndex+t+1}).each(function(){a.appending&&b(this).appendTo(a.appendTo)});H(!0)}function q(){a.modal&&b(".b-modal."+c.data("id")).fadeTo(a.speed,0,function(){b(this).remove()});a.scrollBar||b("html").css("overflow","auto");b(".b-modal."+e).unbind("click");g.unbind("keydown."+e);d.unbind("."+e).data("bPopup",0<d.data("bPopup")-1?d.data("bPopup")-1:null);c.undelegate(".bClose, ."+a.closeClass,"click."+e,q).data("bPopup",null);H();return!1}function G(h){var b=h.width(),e=h.height(),d={};a.contentContainer.css({height:e,width:b});e>=c.height()&&(d.height=c.height());b>=c.width()&&(d.width=c.width());r=c.outerHeight(!0);s=c.outerWidth(!0);D();a.contentContainer.css({height:"auto",width:"auto"});d.left=l(!(!a.follow[0]&&m||f));d.top=n(!(!a.follow[1]&&p||f));c.animate(d,250,function(){h.show();B=E()})}function L(){d.data("bPopup",t);c.delegate(".bClose, ."+a.closeClass,"click."+e,q);a.modalClose&&b(".b-modal."+e).css("cursor","pointer").bind("click",q);M||!a.follow[0]&&!a.follow[1]||d.bind("scroll."+e,function(){B&&c.dequeue().animate({left:a.follow[0]?l(!f):"auto",top:a.follow[1]?n(!f):"auto"},a.followSpeed,a.followEasing)}).bind("resize."+e,function(){w=y.innerHeight||d.height();u=y.innerWidth||d.width();if(B=E())clearTimeout(I),I=setTimeout(function(){D();c.dequeue().each(function(){f?b(this).css({left:v,top:x}):b(this).animate({left:a.follow[0]?l(!0):"auto",top:a.follow[1]?n(!0):"auto"},a.followSpeed,a.followEasing)})},50)});a.escClose&&g.bind("keydown."+e,function(a){27==a.which&&q()})}function H(b){function d(e){c.css({display:"block",opacity:1}).animate(e,a.speed,a.easing,function(){J(b)})}switch(b?a.transition:a.transitionClose||a.transition){case "slideIn":d({left:b?l(!(!a.follow[0]&&m||f)):g.scrollLeft()-(s||c.outerWidth(!0))-C});break;case "slideBack":d({left:b?l(!(!a.follow[0]&&m||f)):g.scrollLeft()+u+C});break;case "slideDown":d({top:b?n(!(!a.follow[1]&&p||f)):g.scrollTop()-(r||c.outerHeight(!0))-C});break;case "slideUp":d({top:b?n(!(!a.follow[1]&&p||f)):g.scrollTop()+w+C});break;default:c.stop().fadeTo(a.speed,b?1:0,function(){J(b)})}}function J(b){b?(L(),k(F),a.autoClose&&setTimeout(q,a.autoClose)):(c.hide(),k(a.onClose),a.loadUrl&&(a.contentContainer.empty(),c.css({height:"auto",width:"auto"})))}function l(a){return a?v+g.scrollLeft():v}function n(a){return a?x+g.scrollTop():x}function k(a){b.isFunction(a)&&a.call(c)}function D(){x=p?a.position[1]:Math.max(0,(w-c.outerHeight(!0))/2-a.amsl);v=m?a.position[0]:(u-c.outerWidth(!0))/2;B=E()}function E(){return w>c.outerHeight(!0)&&u>c.outerWidth(!0)}b.isFunction(z)&&(F=z,z=null);var a=b.extend({},b.fn.bPopup.defaults,z);a.scrollBar||b("html").css("overflow","hidden");var c=this,g=b(document),y=window,d=b(y),w=y.innerHeight||d.height(),u=y.innerWidth||d.width(),M=/OS 6(_\d)+/i.test(navigator.userAgent),C=200,t=0,e,B,p,m,f,x,v,r,s,I;c.close=function(){a=this.data("bPopup");e="__b-popup"+d.data("bPopup")+"__";q()};return c.each(function(){b(this).data("bPopup")||(k(a.onOpen),t=(d.data("bPopup")||0)+1,e="__b-popup"+t+"__",p="auto"!==a.position[1],m="auto"!==a.position[0],f="fixed"===a.positionStyle,r=c.outerHeight(!0),s=c.outerWidth(!0),a.loadUrl?K():A())})};b.fn.bPopup.defaults={amsl:50,appending:!0,appendTo:"body",autoClose:!1,closeClass:"b-close",content:"ajax",contentContainer:!1,easing:"swing",escClose:!0,follow:[!0,!0],followEasing:"swing",followSpeed:500,iframeAttr:'scrolling="no" frameborder="0"',loadCallback:!1,loadData:!1,loadUrl:!1,modal:!0,modalClose:!0,modalColor:"#000",onClose:!1,onOpen:!1,opacity:0.7,position:["auto","auto"],positionStyle:"absolute",scrollBar:!0,speed:250,transition:"fadeIn",transitionClose:!1,zIndex:9997}})(jQuery);
nospor
A widzisz, to zmienia postac rzeczy. Zrozumialem na początku, że chciales zrobić zupełnie co innego.

W petli, w ktorej wyswietlasz te buttony, masz generowac dokladnie tyle samo divow z wiadomosciami, tak, by kazdy button mial przypisany dla siebie oddzielnego diva z wiadomoscią.

Jesli jednak nie chcesz ładowac wszystkich wiadomosci naraz, to musisz posluzyc sie ajaxem, i leciec do serwera po całą wiadomosc. Zazwyczaj pluginy modalDialog same w sobie pozwalają na pobieranie zawartosci z serwera. Nie wiem jak ten Twoj, nie chce mi sie go analizowac. W dokumentacji masz pewnie napisane.

edit: widze na stronie twojego pluginu ze ajax jest jak najbardziej wbudowany w ten plugin
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.