返回json数组的PHP在javascript中显示为Null

我有一个ajax调用,它将数据发布到php脚本并返回数据。 如果我回显php脚本中的数据,我可以在javascript中提醒它。 但如果我把它作为json返回,警报就什么都没显示。

我的javascript

$.ajax({ type: "POST", url: url, async: false, data: {1:'Home', 2:'About', 3:'Contact'}, success: function(data){ alert(data); //manipulate returned data here )); } }); 

我的PHP

 function get_latest() { $stack = array(); foreach($_POST as $key => $value) { $tmpRec = db_fetch_object(db_query('SELECT * FROM node_revisions WHERE nid = "%s"', $key)); $arr = array($key => array('timestamp' => $tmpRec->timestamp, 'body' => $tmpRec->body)); array_push($stack, $arr); } echo '
' . print_r($stack,1) . '

'; //works and comes up in alert echo json_encode($stack); //Shows nothing }

还有另一种方法吗? 我需要服务器以我可以在javascript中操作的格式发回数据。

根据评论中的要求,这是使用PDO的参数化查询的示例。

 $sql=new PDO("mysql:host=127.0.0.1;dbname=name","user","password"); $query="Select * from Northwind where Id=:ID"; $stmt=$sql->prepare($query); $stmt->bindParam(':ID',$random_Id); $stmt->execute(); $dr=$stmt->fetch(); $sql=null; 

我们一行一行地讨论它。

 $sql=new PDO("mysql:host=127.0.0.1;dbname=name","user","password"); 

$ sql成为一个新的PDO对象(pdo可以支持许多类型的数据库(在本例中我们使用的是MYSQL)。

 $query="Select * from Northwind where Id=:ID; 

请注意,我们不提供Northwind表格中的实际ID,而是提供“:ID”。

 $stmt=$sql->prepare($query); 

这是有趣的部分。 prepare语句将我们的查询字符串发送到sql server。 此时服务器知道我们将运行的sql命令,但还不知道我们的变量的值。

 $stmt->bindParam(':ID',$random_Id); 

然后bindParam发送$ random_Id的值来替换’:ID。’

 $stmt->execute(); $dr=$stmt->fetch(); 

然后执行我们的查询,并将结果放入$ dr。 您可以像哈希表一样从$ dr中获取数据。 那么让我们说Northwind表看起来像这样:

 +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | Id | int | NO | PRI | NULL | | | Name | varchar(10) | NO | UNI | NULL | | | Passwd | varchar(50) | NO | | NULL | | | Salt | varchar(50) | NO | UNI | NULL | | +--------+-------------+------+-----+---------+-------+ 

我们想要’名字’的价值。 我们会输入这样的东西:

 $userName=$dr['Name']; $sql=null; 

此行会销毁PDO对象,从内存中释放它并关闭数据库连接。

以这种方式执行SQL有两个好处。 首先是速度。 如果你需要在上面运行那个查询,我会在6个不同的ID下6次,你可以在prepare语句之后做这样的事情:

 for($i=0;$i<=6;$i++) { $stmt->bindParam(':ID',$i); $stmt->execute; } 

服务器已经有主查询,所以我们只是发送它更改了什么。 如果我们做这样的事情来插入许多记录,那么将整个查询放在循环中要快得多。

第二个好处是它使SQL注入不可能(我使用它的主要原因)。