如何:正确使用PHP将数据编码为JSON格式,并使用jquery/ajax请求数据

如何:正确使用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

我正在尝试创建一个类似的地址簿

我可以成功地连接到数据库并使用php脚本插入数据

我甚至成功地显示了表行的json编码数据,尽管我不知道是否正确

我真正想要实现的目标:

$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);
            }
    });
});
  • 我希望能够对say和ID发出ajax请求,然后返回该ID对应的所有数据(用Json包装——至少我认为它需要是…)
  • 使用ajax脚本,我希望能够将返回的相应数据保存到html文件中的输入字段中
  • 我还想知道是否最好尝试将HTML返回到ajax调用,并以这种方式将数据输入HTML输入字段

    到目前为止,我取得的成功有限,但以下是我迄今为止取得的成果

    我有一个数据库连接脚本:

    $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);
                }
        });
    });
    
  • 我希望能够对say和ID发出ajax请求,然后返回该ID对应的所有数据(用Json包装——至少我认为它需要是…)
  • 使用ajax脚本,我希望能够将返回的相应数据保存到html的输入字段中
  • 编辑: 最后我发现我和Majid讨论的问题是SQL查询。
    密钥需要用`字符'包装。

    我相信您希望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是的,我有