如何:正确使用PHP将数据编码为JSON格式,并使用jquery/ajax请求数据
我正在尝试创建一个类似的地址簿 我可以成功地连接到数据库并使用php脚本插入数据 我甚至成功地显示了表行的json编码数据,尽管我不知道是否正确 我真正想要实现的目标:如何:正确使用PHP将数据编码为JSON格式,并使用jquery/ajax请求数据,php,jquery,ajax,json,mysqli,Php,Jquery,Ajax,Json,Mysqli,我正在尝试创建一个类似的地址簿 我可以成功地连接到数据库并使用php脚本插入数据 我甚至成功地显示了表行的json编码数据,尽管我不知道是否正确 我真正想要实现的目标: $host = "localhost"; $user = "user"; $pass = "pass"; $db = "data_base"; $mysqli = new mysqli($host, $user, $pass, $db); if($mysqli->connect_error) die('Connec
$host = "localhost";
$user = "user";
$pass = "pass";
$db = "data_base";
$mysqli = new mysqli($host, $user, $pass, $db);
if($mysqli->connect_error)
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
return $mysqli;
id, user, pass, nickname, address, facebook, twitter, linkedin, youtube
ID should be unique
User is an index
Pass is an index
nickname is an index
address is primary - though its possible that id should be...
Facebook, Twitter, Linkedin, and Youtube are all indexes.
error_reporting(E_ALL); ini_set("display_errors", 1);
include 'db/dbcon.php';
//Start connection with SQL
$q = "SELECT * FROM `cfaddrbook` WHERE key = '111111'";
$res = $mysqli->query($q) or trigger_error($mysqli->error."[$q]");
$array = array(); // initialize
while($row = $res->fetch_array(MYSQLI_BOTH)) {
$array[] = array(
'key' => $row[0],
'username' => $row[1],
// ... continue like this
);
}
header('Content-Type: application/json');
echo json_encode($array);
$res->free();
$mysqli->close();
$(document).ready(function(){
$.ajax({
type: "POST",
url: "queries.php",
dataType: 'json',
data: "",
cache: false,
success: function(result)
{
var cfkey = result[0];
var user = result[1];
alert("cfkey:" + cfkey + "user:" + user);
}
});
});
$host = "localhost";
$user = "user";
$pass = "pass";
$db = "data_base";
$mysqli = new mysqli($host, $user, $pass, $db);
if($mysqli->connect_error)
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
return $mysqli;
id, user, pass, nickname, address, facebook, twitter, linkedin, youtube
ID should be unique
User is an index
Pass is an index
nickname is an index
address is primary - though its possible that id should be...
Facebook, Twitter, Linkedin, and Youtube are all indexes.
error_reporting(E_ALL); ini_set("display_errors", 1);
include 'db/dbcon.php';
//Start connection with SQL
$q = "SELECT * FROM `cfaddrbook` WHERE key = '111111'";
$res = $mysqli->query($q) or trigger_error($mysqli->error."[$q]");
$array = array(); // initialize
while($row = $res->fetch_array(MYSQLI_BOTH)) {
$array[] = array(
'key' => $row[0],
'username' => $row[1],
// ... continue like this
);
}
header('Content-Type: application/json');
echo json_encode($array);
$res->free();
$mysqli->close();
$(document).ready(function(){
$.ajax({
type: "POST",
url: "queries.php",
dataType: 'json',
data: "",
cache: false,
success: function(result)
{
var cfkey = result[0];
var user = result[1];
alert("cfkey:" + cfkey + "user:" + user);
}
});
});
具有以下列的mysql ISAM数据库:
$host = "localhost";
$user = "user";
$pass = "pass";
$db = "data_base";
$mysqli = new mysqli($host, $user, $pass, $db);
if($mysqli->connect_error)
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
return $mysqli;
id, user, pass, nickname, address, facebook, twitter, linkedin, youtube
ID should be unique
User is an index
Pass is an index
nickname is an index
address is primary - though its possible that id should be...
Facebook, Twitter, Linkedin, and Youtube are all indexes.
error_reporting(E_ALL); ini_set("display_errors", 1);
include 'db/dbcon.php';
//Start connection with SQL
$q = "SELECT * FROM `cfaddrbook` WHERE key = '111111'";
$res = $mysqli->query($q) or trigger_error($mysqli->error."[$q]");
$array = array(); // initialize
while($row = $res->fetch_array(MYSQLI_BOTH)) {
$array[] = array(
'key' => $row[0],
'username' => $row[1],
// ... continue like this
);
}
header('Content-Type: application/json');
echo json_encode($array);
$res->free();
$mysqli->close();
$(document).ready(function(){
$.ajax({
type: "POST",
url: "queries.php",
dataType: 'json',
data: "",
cache: false,
success: function(result)
{
var cfkey = result[0];
var user = result[1];
alert("cfkey:" + cfkey + "user:" + user);
}
});
});
注:如果有人认为合适,我很乐意更改索引、主索引等
编辑**现在我的查询页面:
$host = "localhost";
$user = "user";
$pass = "pass";
$db = "data_base";
$mysqli = new mysqli($host, $user, $pass, $db);
if($mysqli->connect_error)
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
return $mysqli;
id, user, pass, nickname, address, facebook, twitter, linkedin, youtube
ID should be unique
User is an index
Pass is an index
nickname is an index
address is primary - though its possible that id should be...
Facebook, Twitter, Linkedin, and Youtube are all indexes.
error_reporting(E_ALL); ini_set("display_errors", 1);
include 'db/dbcon.php';
//Start connection with SQL
$q = "SELECT * FROM `cfaddrbook` WHERE key = '111111'";
$res = $mysqli->query($q) or trigger_error($mysqli->error."[$q]");
$array = array(); // initialize
while($row = $res->fetch_array(MYSQLI_BOTH)) {
$array[] = array(
'key' => $row[0],
'username' => $row[1],
// ... continue like this
);
}
header('Content-Type: application/json');
echo json_encode($array);
$res->free();
$mysqli->close();
$(document).ready(function(){
$.ajax({
type: "POST",
url: "queries.php",
dataType: 'json',
data: "",
cache: false,
success: function(result)
{
var cfkey = result[0];
var user = result[1];
alert("cfkey:" + cfkey + "user:" + user);
}
});
});
现在,上面的脚本似乎工作正常。至少在浏览器中加载php页面时,它显示得很好
但是当我用这个脚本调用ajax时:
$host = "localhost";
$user = "user";
$pass = "pass";
$db = "data_base";
$mysqli = new mysqli($host, $user, $pass, $db);
if($mysqli->connect_error)
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
return $mysqli;
id, user, pass, nickname, address, facebook, twitter, linkedin, youtube
ID should be unique
User is an index
Pass is an index
nickname is an index
address is primary - though its possible that id should be...
Facebook, Twitter, Linkedin, and Youtube are all indexes.
error_reporting(E_ALL); ini_set("display_errors", 1);
include 'db/dbcon.php';
//Start connection with SQL
$q = "SELECT * FROM `cfaddrbook` WHERE key = '111111'";
$res = $mysqli->query($q) or trigger_error($mysqli->error."[$q]");
$array = array(); // initialize
while($row = $res->fetch_array(MYSQLI_BOTH)) {
$array[] = array(
'key' => $row[0],
'username' => $row[1],
// ... continue like this
);
}
header('Content-Type: application/json');
echo json_encode($array);
$res->free();
$mysqli->close();
$(document).ready(function(){
$.ajax({
type: "POST",
url: "queries.php",
dataType: 'json',
data: "",
cache: false,
success: function(result)
{
var cfkey = result[0];
var user = result[1];
alert("cfkey:" + cfkey + "user:" + user);
}
});
});
加载此代码后,chrome控制台声明服务器返回错误500
再说一遍,我要完成的是:
$host = "localhost";
$user = "user";
$pass = "pass";
$db = "data_base";
$mysqli = new mysqli($host, $user, $pass, $db);
if($mysqli->connect_error)
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
return $mysqli;
id, user, pass, nickname, address, facebook, twitter, linkedin, youtube
ID should be unique
User is an index
Pass is an index
nickname is an index
address is primary - though its possible that id should be...
Facebook, Twitter, Linkedin, and Youtube are all indexes.
error_reporting(E_ALL); ini_set("display_errors", 1);
include 'db/dbcon.php';
//Start connection with SQL
$q = "SELECT * FROM `cfaddrbook` WHERE key = '111111'";
$res = $mysqli->query($q) or trigger_error($mysqli->error."[$q]");
$array = array(); // initialize
while($row = $res->fetch_array(MYSQLI_BOTH)) {
$array[] = array(
'key' => $row[0],
'username' => $row[1],
// ... continue like this
);
}
header('Content-Type: application/json');
echo json_encode($array);
$res->free();
$mysqli->close();
$(document).ready(function(){
$.ajax({
type: "POST",
url: "queries.php",
dataType: 'json',
data: "",
cache: false,
success: function(result)
{
var cfkey = result[0];
var user = result[1];
alert("cfkey:" + cfkey + "user:" + user);
}
});
});
密钥需要用`字符'包装。我相信您希望querys.php返回json(到ajax),因此您需要querys.php中的内容头类型
header('Content-Type: application/json');
您需要更多有用的错误消息。尝试在代码开头添加以下行 错误报告(E_全部);
ini设置(“显示错误”,1) 输出JSON的脚本正在编写多个有效的JSON字符串(每个数据库行一个),但这些字符串加起来并不是一个有效的JSON文件。JSON文件应表示一个JSON对象 如果要传递一个ID并返回一个数据库行,则必须将该ID添加到AJAX调用的
数据部分,并修改querys.php以将该ID从其$\u POST
数组传递到MySQL查询的WHERE
部分。然后,只输出一个JSON编码的对象,而不是多个,这将是一个有效的JSON文件
(或者,如果希望返回整个表,可以json_encode()
整个$rows
数组,而不是每个$row
)
另外,如果您使用PHP中的字符串索引数组json\u encode()
,则可以通过名称而不是索引在Javascript中读取其属性。您已经经历了用PHP命名键的麻烦,然后切换回使用Javascript中基于0的索引来引用它们。你可以选择一种或另一种方式,但你只能选择一种 执行查询后,结果集在$res
中可用,您只需构建数组,无需单独的foreach:
$array = array(); // initialize
while($row = $res->fetch_array(MYSQLI_BOTH)) {
$array[] = array(
'id' => $row[0],
'username' => $row[1],
'password' => $row[2],
'nick' => $row[3],
'addr' => $row[4],
'facebook' => $row[5],
'twitter' => $row[6],
'linkedin' => $row[7],
'youtube' => $row[8]
);
}
header('Content-Type: application/json');
echo json_encode($array);
还请注意,这样,您的json将具有键,因此要使用它,您应该更改:
success: function(result) {
var cfkey = result[0];
var user = result[1];
alert("cfkey:" + cfkey + "user:" + user);
}
到
或者干脆
$.getJSON('queries.php', {cfkey: $("#cfkey").val()}, function(result) {
// we have multiple results
$.each(result, function(i,r) {
console.log("cfkey:" + r.key + "user:" + r.username);
});
});
编辑:添加了@amurrell指出的标题,在连接脚本中,$pass
之后,您缺少了一个“
。当我拿出真正的密码将代码粘贴到这里时,这是一个输入错误。我服务器上的实际代码实际上在php代码中正确地说明了$pass=”密码。但是,谢谢您!我在下面添加了它。”include”行,控制台再次返回了500错误(对于ajax查询)。我是否将其添加到了错误的位置?您可能应该将其放在include之前。在PHP的必须在发送任何实际输出之前调用,可以通过普通HTML标记、文件中的空行,也可以从PHP调用。使用include或require函数或其他文件访问函数读取代码,并且在header()之前输出空格或空行,这是非常常见的错误调用。使用单个PHP/HTML文件时也存在相同的问题。它现在位于包含行上方。仍然没有区别。您的回答与我试图实现的基本相同。请您详细说明第1、2和3段,好吗?因此,如果您将数据
设置为{id:1}
,那么在PHP中,
$\u POST['id']将是1
。现在,只需将MySQL查询硬编码为SELECT*FROM cfaddrbook,其中id=1
(尽管选择一个现有的id号),您将看到返回有效的JSON。在成功处理程序中,更改结果[0]
到结果.id
和结果[1]
到结果。username
,它应该按照您想要的方式工作。您应该能够通过更多的实验从中找到答案。祝您好运!在添加WHERE id=1行之后,在我的例子WHERE key=111111中,它会吐出很多错误。如果我这样做,在显示php页面时不会再有错误。另外,addURL后的ng&username仍然显示所有JSON数据,而不是对应的特定数据。因此我想知道,当数据被传递回ajax查询时,它是否找不到其请求?非常棒的建议!但是,输入代码后,php给了我:太多的编辑!抱歉。这表明我该睡觉了!”PHP分析错误:语法错误,意外“,”在/file/。。。在线8@user3259138是的,我有