2016-06-29 54 views
1

编辑/澄清:我有一个PHP页面,称之为displayPhotos.php,其中我设置了一个Ajax调用到不同的PHP页面,调用它getPhotos .php,它查询数据库并将照片信息(标题,文件名等)返回到displayPhotos.php显示的位置。我在displayPhotos中使用php来操作从getPhotos返回的数据。从Ajax调用返回的数据是一个javascript 2维数组。我需要将javascript数组转换为一个php数组,以便我们可以显示其他内容。我怎么做? 希望这有助于。JavaScript范围的阵列和转换js阵列为一个php阵列


我的眼睛因阅读所有文档而受到伤害。

我想用ajax查询数据库,返回数据然后用php继续网页。

我看过的所有例子都是从在php中创建json开始的。我需要从JavaScript中的json对象开始。

<script> 
    var photoarray = []; 
    var ajaxRequest = $.ajax 
     ({ 
      url : "fhs_get_photos.php", 
      type: "POST", 
      dataType: "json", 
      success: function(photo_array) 
      { 
       photoarray = photo_array; 
      //line below works. the file name is correct but disappears 
      //outside of this function 
      console.log("photoarray[0][file_name] is: " + photoarray[0]['file_name']); 
      }, 

      error: function(request, status, error) 
      { 
       alert('An error occurred: '); 
      } 
     }); 

在这个例子中,我没有把任何东西传递给查询数据库的php文件。控制台日志显示照片阵列中的文件名是正确的,但一旦在此功能之外,即使它被声明为全局文件,它也会消失,我认为它是无论如何。为什么和我需要做些什么来解决这个问题。

php文件只是做一个SELECT * FROM .....并返回所有内容。

// in fhs_get_photos.php 
    // SELECT * FROM table...... 
    echo $json = json_encode($result); 
    return $json; 

所以我现在有数组返回,但它是在JavaScript中。一旦我找出范围问题,我该如何将这个javascript数组转换为一个php数组?

<h3>Welcome to the Historical Society's historical photo archive 
    </h3> 
    </header> 
    <figure id="photo_figure"> 
     <script> 
     //line below gets me: SCRIPT5007: Unable to get property 'thumb' of 
     //undefined or null reference 
     console.log("photoarray thumb: ") + photoarray[0]['thumb']; 
     </script> 

我解释正确吗?

+0

如果您选择阿贾克斯,没有传球再次PHP,PHP的渲染已经发生了,除非你刷新,不需额外再发生。你需要用新的数据在你的成功函数中手动编辑/创建你需要的dom – juvian

+0

我不明白,为什么你需要将js数组转换为php数组以及它应该发生在哪里?你的回应是JSON,你必须解析它“photoarray = JSON.parse(photo_array)”。之后,它是你的使用,如果它保存到全局范围 - 那么它应该是其他脚本可见(IF的响应收到后,他们被执行) –

+0

@juvian见我澄清。我如何使用PHP中的数据包含在JavaScript数组中创建dom? – eric

回答

1

首先,AJAX是异步的。这意味着它会在您提出要求时发送请求,但在未来某个时间收到响应。它在php渲染并发送页面后起作用。所以。当你通过AJAX获得更新时,你必须使用javascript来实现更新。最简单的解决方案是在成功回调中处理响应。这样你就不需要混淆全局范围(这是一种不好的做法)。

据说,你的HTML是这样的:

<header> 
    <h3>Welcome to the Historical Society's historical photo archive 
    </h3> 
    </header> 
    <div id="figures"></div> 

可以通过声明来处理的处理函数做到这一点:下面

function updateDom(photoArr) { 
    var $figures = $('#figures'); 

    $.each(photoArr, function() { 
    console.log(this); 
    $figures.append('<img src="' + this.thumb +'">'); 
    }); 
} 

代码放置在成功回调

并在成功回调中执行该函数并将其传递给json的数组,该数据被解析并成为有效的js目的。

var photoArray = JSON.parse(photo_array); 
updateDom(photoArray); 

这里的fiddle,但它是在DOM部分仅

+0

感谢您的回复。如果我正确地理解了你,所有的php代码都是在任何javascript代码执行之前执行的。 javascript创建Ajax请求,发送它并接收数据。所有的PHP代码已经被执行,所以我不能做任何进一步的PHP处理。我对你有正确的理解吗? – eric

+0

是的。首先是PHP,然后是所有同步js,然后是异步js(事件,AJAX等)。没有办法知道什么时候完全执行异步部分,因此他们需要执行的所有代码应该以某种方式链接到它们。回调函数是进行链接的默认模式。还有承诺,但最好先理解回调。 但Ajax正在提出请求。该请求由PHP处理,因此在异步js部分中运行PHP。您可以使用该PHP呈现HTML并将其发送给js。那么你将不得不使用js将它附加到它所属的位置。 –