【问题标题】:Get mysql json parameters in url获取url中的mysql json参数
【发布时间】:2017-09-19 00:14:01
【问题描述】:

我试图从 mysql 数据库中检索数据并通过 json 传递它,该 url 将具有某些参数来显示特定数据。该链接有效,它带回了数据,但它没有带回我需要的东西。

“api.php?cat_id=1”的 PHP 代码

if(isset($_GET['cat_id']))
{
    $post_order_by=API_CAT_POST_ORDER_BY;

    $cat_id=$_GET['cat_id'];    

    $jsonObj= array();  

    $query="SELECT * FROM tbl_wallpaper
    LEFT JOIN tbl_category ON tbl_wallpaper.cat_id= tbl_category.cid 
    where tbl_wallpaper.cat_id='".$cat_id."' ORDER BY tbl_wallpaper.id ".$post_order_by."";

    $sql = mysqli_query($mysqli,$query)or die(mysqli_error());

    while($data = mysqli_fetch_assoc($sql))
    {
        $row['id'] = $data['id'];
        $row['cat_id'] = $data['cat_id'];
        $row['scat_name'] = $data['scat_name'];
        $row['wallpaper_image'] = $file_path.'categories/'.$data['cat_id'].'/'.$data['image'];
        $row['wallpaper_image_thumb'] = $file_path.'categories/'.$data['cat_id'].'/thumbs/'.$data['image']; 
        $row['total_views'] = $data['total_views'];

        $row['cid'] = $data['cid'];
        $row['category_name'] = $data['category_name'];
        $row['category_image'] = $file_path.'images/'.$data['category_image'];
        $row['category_image_thumb'] = $file_path.'images/thumbs/'.$data['category_image'];


        array_push($jsonObj,$row);

    }

    $set['HD_WALLPAPER'] = $jsonObj;

    header( 'Content-Type: application/json; charset=utf-8' );
    echo $val= str_replace('\\/', '/', json_encode($set,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
    die();


}

“api.php?scat_name=9&cat_id=1”的 PHP 代码我想要这个过滤结果,只显示数据共享 scat_name 和 cat_id

  if(isset($_GET['scat_name'], $_GET['cat_id']))
 {
    $post_order_by=API_CAT_POST_ORDER_BY;

    $scat_id=$_GET['scat_name'];
    $cat_id=$_GET['cat_id'];


    $jsonObj= array();  

    $query="SELECT * FROM tbl_wallpaper
    LEFT JOIN tbl_scategory ON tbl_wallpaper.scat_name = tbl_scategory.scid
    where tbl_wallpaper.scat_name='".$scat_id."' ORDER BY tbl_wallpaper.id ".$post_order_by."";



    $sql = mysqli_query($mysqli,$query)or die(mysqli_error());

    while($data = mysqli_fetch_assoc($sql))
    {
        $row['id'] = $data['id'];
        $row['cat_id'] = $data['cat_id'];
        $row['scat_name'] = $data['scat_name'];
        $row['wallpaper_image'] = $file_path.'categories/'.$data['cat_id'].'/'.$data['image'];
        $row['wallpaper_image_thumb'] = $file_path.'categories/'.$data['cat_id'].'/thumbs/'.$data['image']; 
        $row['total_views'] = $data['total_views'];

        $row['cid'] = $data['cid'];
        $row['category_name'] = $data['category_name'];
        $row['category_image'] = $file_path.'images/'.$data['category_image'];
        $row['category_image_thumb'] = $file_path.'images/thumbs/'.$data['category_image'];


        array_push($jsonObj,$row);

    }

    $set['HD_WALLPAPER'] = $jsonObj;

    header( 'Content-Type: application/json; charset=utf-8' );
    echo $val= str_replace('\\/', '/', json_encode($set,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
    die();


}

当我调用 url 时,我把它写成例如“api.php?scat_name=9&cat_id=1”,它给我的结果仅基于 cat_id,即使我在 scat_name= 中放入了任何不存在的东西工作并根据 cat_id 带回结果。我在浏览器上得到的结果是这样的:注意 scat_name 9 和 0 意味着不依赖于那个带来的数据库,而只依赖于 cat_id 哪个 1。

{
        "id": "241",
        "cat_id": "1",
        "scat_name": "9",
        "wallpaper_image": "ut.jpg",
        "wallpaper_image_thumb": "ut.jpg",
        "total_views": "0",
        "cid": "1",
        "category_name": "test",
        "category_image": "yg9.png",
        "category_image_thumb": "qyg9.png"
    },
{
        "id": "231",
        "cat_id": "1",
        "scat_name": "0",
        "wallpaper_image": "s.jpg",
        "wallpaper_image_thumb": "s.jpg",
        "total_views": "2",
        "cid": "1",
        "category_name": "test",
        "category_image": "9.png",
        "category_image_thumb": "9.png"
    },

【问题讨论】:

  • 没有理由根据json_encode() 的结果调用str_replace()。它返回有效的 JSON,你可能会通过替换东西来搞砸它。
  • 您的第二个查询从不使用$cat_id
  • str_replace 是否被调用都没有关系,它不会改变任何东西。是的,我知道我从未使用过 $cat_id,但为什么当我在 url 上调用它时它只基于 cat_id 而它不使用 scat_name。当使它像 **if(isset($_GET['scat_name']))** 并且我调用 "api.php?scat_name=9" 它显示基于 scatname 的结果

标签: php mysql json database


【解决方案1】:

第一块代码应该使用这个测试:

if (isset($_GET['cat_id']) && !isset($_GET['scat_name']))

否则它会在只有第二个块应该运行时运行。

在第二个查询中,您只过滤 scat_name,而不是 cat_id

您还应该使用准备好的语句来防止 SQL 注入。

$query="SELECT w.id, w.cat_id, w.scat_name, w.image, w.total_views,
                s.cid, s.category_name, s.category_image
    FROM tbl_wallpaper AS w
    LEFT JOIN tbl_scategory AS s ON w.scat_name = s.scid
    where w.scat_name=? AND w.cat_id = ?
    ORDER BY w.id ".$post_order_by;
$stmt = mysqli_prepare($mysqli, $query);
mysqli_stmt_bind_param($stmt, "ii", $scat_id, $cat_id);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $id, $cat_id, $scat_name, $image, $total_views, $cid, $category_name, $category_image);
while (mysqli_stmt_fetch(stmt)) {
    $jsonObj[] = array(
        'id' => $id,
        'cat_id' => $cat_id,
        'scat_name' => $scat_name,
        'wallpaper_image' => $file_path.'categories/'.$cat_id.'/'.$image,
        'wallpaper_image_thumb' => $file_path.'categories/'.$cat_id.'/thumbs/'.$image,
        'total_views' => $total_views,
        'cid' => $cid,
        'category_name' => $category_name,
        'category_image' => $file_path.'images/'.$category_image,
        'category_image_thumb' => $file_path.'images/thumbs/'.$category_image
    );
}

如果您希望能够处理过滤条件的任意组合,您应该动态构建查询。请参阅https://stackoverflow.com/a/28909923/1491895 了解如何在 PDO 中执行此操作。

【讨论】:

  • 感谢您指出第一个区块。我认为你提出的过滤方式太远了,我想有一个简单的方法
  • WHERE scat_name = $scat_id AND cat_id = $cat_id 有什么不容易的?
  • 我试图用显示空白页的代码替换我的代码,并且在最后一行有一个额外的 ' 应该删除
  • 它显示像这样的空数组 { "HD_WALLPAPER": [] }
  • 你接受了答案,是不是说明你解决了空数组的问题?
【解决方案2】:

如果您向我们展示了单个 php 的两个部分(并且因为两者都是 api.php,我猜您是),那么是的,该程序完全按照您的设计工作:

如果在URL中设置了cat_id,那么它将执行你测试cat_id的部分,它不会到达你测试两者的区域。

如果您希望仅在 not 设置 scat_name 时执行该部分,则对此进行测试:

变化:

if(isset($_GET['cat_id']))

为:

if(isset($_GET['cat_id']) && !isset($_GET['scat_name']))

【讨论】:

  • 感谢您指出它现在执行它但有空白页,我想是因为我错过了查询数据的一部分。执行 scat_name&cat_id 时获得过滤结果的方法是什么
猜你喜欢
  • 2017-03-27
  • 2013-12-22
  • 2013-05-06
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2022-01-08
  • 2023-03-23
相关资源
最近更新 更多