Ajax içinde PHP ve SQL oturumları yürütmek nasıl?

2 Cevap php

Ben bugün burada benzer sorular soran oldum, ama ben sorunu benim veri arıyorum nasıl olduğunu düşünüyorum görüyorum?

Ben bir div içine içeriğini yüklemek olacak ajax ile bir nav bar yerine çalışıyorum.

Nav bar şudur:

<ul>
  <li><a href="javascript:void(0)" onclick="getData('/includes/view-monthly-calendar-ajax.php', 'targetDiv')">Monthly</a></li>
  <li><a href="javascript:void(0)" onclick="getData('/includes/agenda-ajax-include.php', 'targetDiv')">Daily</a></li>
  <li><a href="javascript:void(0)" onclick="getData('/includes/hello-include.php', 'targetDiv')">Admin</a></li>
  <li><a href="javascript:void(0)" onclick="getData('/includes/view-monthly-calendar-ajax.php', 'targetDiv')">Help</a></li>
</ul>

Sonra div yerine bu var:

 <div id="targetDiv"></div>

getData fonksiyonu innerHTML istek:

   <script language = "javascript"> 
        function getData(dataSource, divID)
{
    $.ajax({
      url: dataSource,
      dataType: 'html',
      success: function(data) {
        $('#' + divID).html(data);
      }
    });
}
</script>

Ben nav bağlantıları, div içine HTML yükleri, ancak içeriğini tıkladığınızda benim dosyaları da yüklenen ve sadece göz ardı edildiğinde yürütmek gerekiyor PHP fonksiyonları ve jQuery içeren içerir. Bu soru burada çok istedi, ancak bunlar sadece jQuery ilgili görünüyor gördüm?

Ben nav bağlantıları tıkladığınızda net olmak gerekirse, ben kundakçı konsolunda bir 200 almak Tamam, ama sadece HTML geri geliyor ve div doldurma.

İşte benim en son temizlenir Jonathan'ın önerileri değişikliklerle dosya bulunur. Bu noktada, ben çıkış yukarı </tr> yardım butonuna (line 15) ama bu geçmişte hiçbir çıktı sonra ... alıyorum

 <?php 
session_start();
?>

<table width='100%' border='0'>
 <tr class='twentyfivepxheight'><td></td></tr>
 <tr>
 <td width='40%' valign='top'>
 <div class='left_agenda_items'>
 <table width='80%' align='center' border='0'>
 <tr class='twentyfivepxheight'>
 <td align='left' class='title5 bottompadding unselectable'>Daily Agenda<a href="javascript:void(0)" class="supernote-click-note1">
 <img src="/images/help-sm.jpg" alt="Help Button" /></a>
</td>
</tr>

<?php


  $numric_time =  getNumericTime($_SESSION['userData']['timezone']);
  $query  =  "SELECT * FROM events WHERE date(convert_tz(StartDate,'+00:00','". $numric_time."'))='$currentDate' AND UserID='" . $_SESSION['userData']['UserID'] ."' ORDER BY StartTime";
  $result  =  mysql_query($query);
  if(mysql_num_rows($result))
  {
    while($row = mysql_fetch_assoc($result))
    {
      $eventID    =  $row['EventID'];
      $eventName    =  $row['EventName'];
      $startDate    =  $row['StartDate'];
      $description  =  $row['Description'];
      $assignedTo    =  $row['AssignedTo'];
      $PTLType    =  $row['PTLType'];
      $parentEventID  =  $row['ParentEventID'];
      $textclass    =  "greentext unselectable";
      $text      =  "Main event";
      //$url      =  SITE_URL ."/agenda-view-event.php?eventID=$eventID&date=$currentDate&day=$i&type=A&date=$currentDate";
      $url      =  SITE_URL ."/agenda-view-event.php";
      if($PTLType == 2) // To do's
      {
        //$divRed[]  =  $eventID;
        $url      =  SITE_URL ."/agenda-view-timeline.php";
        $textclass    =  "redtextDaily unselectable";
        $text      =  "To do";
        $html_todos .= '
                <tr id="redtext' . $eventID . '">
                <td id="rowbox'.$eventID.'" class="'. $textclass . '" width="30%" onclick="get_event_popup(\'' . $url . '\', \'agendaViewDiv\', \'agendaLoader\', \'eventID='.$eventID.'\', \'parentEventID='.$parentEventID.'\', \'type=A\', \'date='.$currentDate.'\');setbgagendabox(\''.$eventID.'\');return false">
                ' . $eventName . ' - (' . $text . ')
                </td>
                </tr>';
      }
      elseif($PTLType == 3) //Completed
      {
        //$divBlue[]  =  $eventID;
        $url      =  SITE_URL ."/agenda-view-timeline.php";
        $textclass    =  "blueTextDaily unselectable";
        $text      =  "Completed";
        $html_completed .= '<tr id="bluetext' . $eventID . '"><td style="display:none;" id="rowbox'.$eventID.'" class="' . $textclass . '" width="30%" onclick="get_event_popup(\'' . $url . '\', \'agendaViewDiv\', \'agendaLoader\', \'eventID='.$eventID.'\', \'parentEventID='.$parentEventID.'\', \'type=A\', \'date='.$currentDate.'\');setbgagendabox(\''.$eventID.'\');return false">' . $eventName . ' - (' . $text . ')</td></tr>';
      }  else  { //main events
        //$divMainEvent[] = $eventID;
        $html_main_events .= '<tr id="mainEvent' . $eventID . '"><td id="rowbox'.$eventID.'" class="' . $textclass . '" width="30%" onclick="get_event_popup(\'' . $url . '\', \'agendaViewDiv\', \'agendaLoader\', \'eventID='.$eventID.'\', \'date='.$currentDate.'\', \'day='.$i.'\', \'type=A\', \'date='.$currentDate.'\');setbgagendabox(\''.$eventID.'\');return false">' . $eventName . ' - (' . $text . ')</td></tr>';
      }
    }

    echo $html_main_events . $html_todos . $html_completed;

  } else  { 

    ?>
   <tr>
     <td>
     <span class="a_dateformat">You have no agenda items due today!</span>
     </td>
     </tr>

<?php
}

?>

</table>
</div>
<input type="hidden" id='lastselected' value='' style="" />
</td>
<td class='verticalborder'>&nbsp;</td>
<td width='59%' valign="top" align="center">
<div id="agendaLoader" style="display:none;">
<img src="images/ajax-loader-orange.gif" alt="wait" />
</div>
<div id="agendaViewDiv" style="display:none;"></div>
</td>
</tr>
<tr>
<td colspan="3">&nbsp;
</td>
</tr>
</table>

Ama o iş yapmak için jQuery dışarı nasıl yorumladı görmek?

Dışarı yorumladı değilse, ben herhangi bir çıktı alamadım. Sorun jQuery düzgün sayfasını oluşturmak için bu ihtiyaç vardır.

2 Cevap

Bu rastlar herkes "cevabı," bu kadar kırık-up olması amaçlanmıştır değildi unutmayın lütfen. Bu yanıt Her bölümü açıklamalarda OP ile değişim aşağıdaki sonraki bir tarihte ilave edildi. Uzak öğeler daha önce aşağı eklemeler vardı oysa üstüne öğeler son eklemeler vardır.

Jonathan Sampson

Call to undefined function

Bu sayfada genellikle dahil, doğrudan adlandırılır, çünkü, istendiğinde kullanılabilir olmayacak bazı şeyler olabilir. Sen fonksiyonu getNumericTime() yok ki yorumlarda belirtilen ve bir hata neden oluyor.

Bunu var olmak istersiniz, ama sadece bunu redeclare istemiyorum, yoksa zaten bu işlevi olan başka bir sayfaya bir de dosya olarak bu sayfayı isteği zaman sizin için sorunlara neden olur. Peki ne yapmak isteyeceksiniz işlevi var olup olmadığını kontrol edin ve eğer bu olmuyorsa bunu oluşturmaktır.

if (!function_exists("getNumericTime")) {
  function getNumericTime($foo) {
    // get the function logic and place it here
  }
}

Şimdi, dahil-dosyayı doğrudan fonksiyon oluşturulur o yoksa çağırdığınızda. Bu dosya dahil olması ile eski moda bir şekilde, çağırdığınızda if-ifadesi, sadece yeni işlev bildirimi geçmek, fonksiyon zaten bu yana atlayacak.

Bu fonksiyon işlevleri dosya içinde varsa, bunu içerir, ancak include_once() yerine include() kullandığınızdan emin olabilirsiniz. Zaten daha önce dahil edilmesi eğer include_once() dosyası içermez. Bu sayfayı zaten biz tekrar dahil değil emin olmak istiyorum, gerçekleşmiş, bu yüzden include_once() yöntemi kullanmak etti işlevleri şunlardır başka bir ortamda bazen olduğu gerçeği göz önüne alındığında.

Missing connection and selection...

Sen sorguları gerçekleştirmek için çalışıyorsanız, henüz bu sayfada herhangi bir veritabanı bağlantısı yoktur. Hiçbir mysql_select_db(), belirli bir veritabanı seçmek için çağrı da vardır. Bu olmadan, sorguları başarısız olur ve veri iade edilmeyecektir.

// Our connection to mysql
$conn = mysql_connect($host, $user, $pass) or die(mysql_error());
// Which database we're using
mysql_select_db($dbname) or die(mysql_error());

Bu bağlantı (index.php içinde, örneğin) biz yapabileceğini yapıldıktan sonra bir şunlardır:

include("foo.php");

Foo.php içeriği artık bir bağlantı böylece bir açık bağlantısı olan bir sayfa içine dahil ediliyor, çünkü bu sadece durum, vb sorguları gerçekleştirmek depolanmış yordamlar çağırabilir açmış.

Biz size ajax-isteği ile ne yaptığınızı, hangi doğrudan foo.php erişmek olsaydı foo.php kendi veritabanı bağlantısı sağlamaz çünkü, biz istediğimiz sonuçları elde etmem - indeks bağlıdır bu bağlantıyı sağlamak. php (ki bu çoğu kez dahil edilir).

From PHP to HTML to PHP...

Çoğu kez bir şey giderek bir PHP komut dosyası ile HTML çıktısı sorunlara neden olur. Çoğu kez belirli çıkış kaçmak için geri bölü ile doludur HTML dizeleri ardından çok sayıda echo ifadeleri görürsünüz. Sadece bunu yazmak için sıkıcı olduğunu, ancak sorunları ortaya aramak için bir ağrı var. HTML nadiren PHP içinde olması gerekmektedir. HTML çıktı gerektiğinde, bir an için PHP etiketleri çıkmak:

<?php

  $result = mysql_query($sql) or die(mysql_error());
  if (mysql_num_rows($result)) {
    while ($row = mysql_fetch_assoc($result) { ?>

    <tr>
      <td>Data Here</td>
      <td><?php print $row["foo"]; ?></td>
    </tr>

    <?php }
  } else { ?>

    <tr>
      <td>No records found</td>
    </tr>

  <?php }
?>

Benim HTML yanlış yerde olduğu zaman söylemek kolay nasıl fark ve PHP yazmaya biçimlendirme yazma atlamak kolay. İdeal olarak, hatta bu şekilde yapmak değil, ama bu şu anda ne üzerinde bir gelişmedir.

Properly using $_SESSION

Kodunuzu bir göz verdikten sonra, ben seni $_SESSION üzerinden değerlerini arayarak, ya da en azından çalışıyoruz fark ettim. Sadece sayfanın üst kısmında aradığınız varsa session_start() bunu yapabilirsiniz. Sizin kod eksik geri SQL Sorguları ayrılmaz bir parçası olarak bir şey almıyor nedeni olabilir, bu yoksundur. Senaryonuzun çok üstüne ekleyin:

<?php session_start(); ?>

PHP Code Not Executing?

PHP yürütme değilse, komut dosyası veya sunucu ile ilgili bir sorun değil jQuery ile, var. Emin açılış ve talep ettiğin script PHP kapatma etiketleri hem de sahip olun:

<?php

  /* and */

?>

Simplifying things

Siz de biraz basitleştirmek ve kodunuzu temizlemek olabilir. Her şeyden önce, en yeni nav-bar yapalım:

<ul id="nav">
  <li><a href="index.php">Index</a></li>
  <li><a href="about.php">About</a></li>
  <li><a href="contact.php">Contact</a></li>
</ul>

Ben dosyaları doğrudan bağlayan ve benim tıklamaları iptal etmek için herhangi bir javascript kullanarak değilim nasıl unutmayın. Bir kullanıcının etkin javascript olmadan siteme üzerine sendeler, onlar bir kırık web sitesi ile karşı karşıya değiliz Bu şekilde, onlar hala etrafında alabilirsiniz.

Bizim HTML javascript interspersing olmadan, biz bu nav-bağlantıları bazı mantık kadar bağlamak gerekir:

$(function(){
  // Attach logic to all links
  $("#nav a").click(function(e){
    // Prevent link from redirecting page
    e.preventDefault();
    // Load next page into #targetDiv
    $("#targetDiv").html("").load($(this).attr("href"));
  });
});

Ve işte bu. Bitirdiniz.

Bu cevap soru takip kısmına yanıt olarak:

When I click the nav links, the HTML loads into the div, but the contents of my include files also contain PHP functions and jQuery that needs to execute when being loaded and they are just ignored.

Yapıyorsun gibi innerHTML ile DOM metne takıldığında döndü alır JavaScript XMLHttpRequestObject.responseText yürütmek unutmayın.

Bu soruna geçici bir çözüm çift için aşağıdaki yığın taşması sonrası kontrol etmek isteyebilirsiniz:


JQuery kullanıyorsanız Ancak, aşağıdaki ile getData() tüm kodunu değiştirebilirsiniz:

function getData(dataSource, divID)
{
    $.ajax({
      url: dataSource,
      dataType: 'html',
      success: function(data) {
        $('#' + divID).html(data);
      }
    });
}

JQuery ajax() yöntemi dataType: 'html' seçeneği ile çağrıldığında, DOM takıldığında komut dosyası etiketleri otomatik olarak değerlendirilir dahildir. Bu konuda daha fazla okuma için aşağıdaki yığın taşması sonrası kontrol etmek isteyebilirsiniz: