【问题标题】:Php+MySQL read results from a database and return an array of similar objects as JSON ArrayPhp+MySQL 从数据库中读取结果并返回一个类似 JSON 数组的对象数组
【发布时间】:2014-02-08 10:44:38
【问题描述】:

用户有物品。 每件商品都有很多属性(价格、购买日期、状况、名称)

我想返回一个包含所有项目及其属性的 json 数组

这是我的代码:

$user_id = $_GET['user_id'];


$query_user_items        = "SELECT product_id FROM user_products WHERE user_id = :user_id";

$item_ids_array = array();
$success = false;

try {
    $sth = $connection->prepare($query_user_items);
    $sth->execute(array(':user_id' => $user_id));   
    $result = $sth->fetchAll(PDO::FETCH_ASSOC);

    $success = true;

} catch (PDOException $ex) {

    $response["success"] = $http_response_server_error;
    $response["message"] = $http_message_server_error . " " . $ex;
    die(json_encode($response));
    $connection = null;
}

if ($success) {

    foreach($result as $key=>$value){

        $query_get_item_details = "SELECT * FROM products WHERE product_id = :product_id";

        $sth = $connection->prepare($qerty_get_item_details);
        $sth->execute(array(':product_id'=> $value));
        $record = $sth->fetch(PDO::FETCH_ASSOC);

        $item_id                = $record['product_id'];
        $item_name              = $record['product_name'];
        $item_time_added        = $record['product_time_added'];
        $item_description       = $record['product_description'];
        $item_brand             = $record['product_brand'];
        $item_price_aquired     = $record['product_price_aquired'];
        $item_bought_from_place = $record['product_bought_from_place'];

    }

    /*
    $response["success"]                        = $http_response_success;
    $response["item_ids_array"]                 = $new_array;

    echo json_encode($response);

我对 php 不是很好,我不知道第二次迭代会发生什么(我不知道我是否也正确迭代)

我想 $item_name 将被第二个项目的名称覆盖,然后第三个,最后我将只有一个对象?如何创建对象数组及其信息,然后对其进行 json_encode?​​p>

另外,我应该在 foreach 之外声明这些变量吗?

【问题讨论】:

    标签: php arrays json


    【解决方案1】:

    您的代码可以缩短如下(这样,您不使用任何循环):

    $query = "SELECT p.* FROM user_products u LEFT JOIN products p ON (p.product_id = u.product_id) WHERE u.user_id = :user_id";
    
    try 
    {
        $sth = $connection->prepare($query);
        $sth->execute(array(':user_id' => $_GET['user_id']));   
        $response = $sth->fetchAll(PDO::FETCH_ASSOC);
    } 
    catch (PDOException $ex) 
    {
        $response["success"] = $http_response_server_error;
        $response["message"] = $http_message_server_error . " " . $ex;
    }
    finally
    {
        $connection = null;
        echo json_encode($response);
    }
    

    然后,在您的 ajax 成功处理程序中,您可以检查是否设置了成功或消息(如果是这样,则发生错误)。否则,它是一个结果数组,你将遍历它

    【讨论】:

    • 问题:我可以改变这个:“SELECT p.* FROM user_products u LEFT JOIN products p ON (p.product_id = u.product_id) WHERE u.user_id = :user_id”到“SELECT product_id. * FROM user_products LEFT JOIN products ON (products.product_id = user_products.product_id) WHERE user_products.user_id = :user_id"?
    • 您是否只想将 product_id 返回到 ajax ?
    • 这就是问题所在 :( p.* 代表什么?我不喜欢缩写,因为它们让我想多了。我想要 products 表中的所有列,对于特定用户拥有的每个产品.我想问有没有一种方法可以让这个查询在没有缩写的情况下工作。就目前而言,我不明白:)
    • 在这种情况下,p.* 表示来自p 的所有列。 p 是products 的别名。其实p.*和products.*是一样的
    • 没有别名的相同查询:SELECT products.* FROM user_products LEFT JOIN products ON (products.product_id = user_products.product_id) WHERE user_products.user_id = :user_id
    【解决方案2】:

    您不希望每次迭代都运行一个新查询。 您可能希望使用单个查询来获取所有数据:

    SELECT p.*
    FROM   user_products AS up
    LEFT JOIN products AS p ON p.product_id = up.product_id
    
    WHERE up.user_id = :user_id
    

    在 PHP 中你可以将数据收集到数组中:

    <?php
    $data = array();
    while($result = $sth->fetch(PDO::FETCH_ASSOC)){
            $data[] = $result;
        }
    
    ?><?=json_encode($data)?>
    

    【讨论】:

    • 应该是while(...) { $data[] = $result; }。否则,之前的结果总是被删除
    • 谢谢!我有两个问题 - 我可以使用不带缩写的 p 和 up,我真的讨厌缩写吗?如果是这样,我还应该使用那些 AS 语句吗?另外,代码末尾的 = 是什么?
    • 在这种情况下,是的,你可以! :) 尽管您应该考虑习惯它,因为您在不同的表中拥有相同的列名。 &lt;?="aaa"?&gt; 是一种简短的回显方式,等于 &lt;? echo "aaa"; ?&gt;
    • 那里的 = 东西是什么?
    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多